掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 2422|回复: 9

[教程] 最近学习到的制作mdict词库时候的一些经验

[复制链接]
匿名
匿名  发表于 2019-4-24 17:21:38 |阅读模式
本帖最后由 匿名 于 2020-10-9 02:27 编辑
3 n8 M. s9 v1 m$ e, P5 X: v7 E' \. w5 t) |

! A9 ^# r* m8 T! i8 @更新历史  x1 W; E) E& x! C. ^6 A1 q$ ]
. W, a! d7 g: H  ~# x
2019.4.24 9:22 PM添加新内容' V- t) e  M. f3 A# J; z
. f9 q8 H$ i- \8 F7 O" Z
2019.4.24 5:21 PM' g) B  o5 |2 \9 k  }1 x  z3 T  ]
开始写此文,尚未完成先保存一下; }5 L7 L! v4 e$ j
7 n4 D# x. {' n

: T' [' h( e9 ^- T0 f# S- N前言) F: N: q# o/ h" X

7 |4 W( Y2 p; q4 w" Z大家好啊!; _4 W' R2 p, Q% @6 _

3 e5 L7 X9 l( S3 e7 A0 _$ n最近我自己制作了Macmillan在线词典,也修改了其他几个词典,都已经发出来了。大家也给了很多反馈,绝大多数的问题我也都修复了。这个过程中确实学习到了很多东西,有技术方面的,当然也有和mdict词库紧密相关的。这个帖子就是想分享一下我在制作mdict词库方面的经验,和大家讨论一下。下面的内容仅仅代表我(ogrishman)的一家之言,具体说的对不对,我们一起讨论讨论。然后我们一起完善这个帖子,并且宣传这个帖子,这样大家制作词库的时候都follow best practice,词库的质量一定会得到提高,而且问题还会少很多。下面我就一条一条列出我要说的这些best practices。7 p, R, z6 n8 G  Y

& M, L! C: E' o7 Z6 j- @( ?! E* e- `
3 i1 v& O$ b0 m
正文
3 B2 F1 |8 j' P- X( X8 ~$ M6 j  b  Q$ i! i% G
  • 词库相关文件的命名要一致,并且清晰全面
      G0 l: d! J5 Q0 o8 T0 I3 o# M. M
比如我们要制作一个Oxford Advanced Learner's Dictionary第九版的词库,那么相关的文件名可以命名为:" s) ~+ Q! f1 N) ^

8 M! o$ g9 ]. h/ U/ N+ N" W
Oxford Advanced Learner's Dictionary 9th.mdx
* O% j6 G+ u# W& w5 i4 K  vOxford Advanced Learner's Dictionary 9th.mdd, m# H- Q9 h& s! B; x. h
Oxford Advanced Learner's Dictionary 9th.1.mdd$ u6 g8 y6 K, S) p3 \  x$ Z. ?7 W
Oxford Advanced Learner's Dictionary 9th.js: F3 D6 }# Q% ]
Oxford Advanced Learner's Dictionary 9th.css
! r5 h8 C/ z& J" ^+ L- i
我们要考虑到,某些情况下我们可能必须把很多词库的文件放到一个文件夹里,这时遵守这一点的优点就突显出来了,用户可以一眼看出哪些文件属于哪个词典,而且文件排序一般也会把这些相关文件排在一起。这里要注意,不要用缩写,比如OALD9.mdx,这样不够清晰!
% e! P, B% G1 _0 ?
& H# e  w" N# r+ D5 P7 I9 W& h+ P0 r) J* L! Z& T
  • 每个词典都要提供外置的js文件和css文件供有能力的用户深度定制词典9 T- j: ^' O" u: t
每个词典最好都有外置的js文件和css文件。css文件基本上现在所有词典都会有,但是我建议,即使你的词库没有用到js,也在你的词条里加入一个外置js文件,这样可以给用户留下自己扩展的空间。4 |2 K7 z9 ^; ^5 q: O+ g' u

8 |" |% s* w5 `3 ]
  • 你的词库中的一个词条只是整个网页中的一部分,深入理解这一点,并且牢牢记住3 {" C- U# B& F
现在主流的词典软件(欧路词典、GoldenDict)在渲染一个单词时候都是用网页的形式。现在基本上所有用户都会安装多于一本的词典,这些不同的词典中的相同的词条凑成了一个网页,也就是您看到的结果。比如下图是我在Windows上的欧路词典查询frequency后的结果,其中部分词典的结果被我折叠起来了,其中每个红色方框表示一个词典的结果:
% m% p& c6 M( Q) a! C+ @) d: h7 b; G0 w( f% F

8 m( \* N% ]# l
2 m0 D3 ^# U' @; F9 z这里要理解的是,这里每个红色方框不是单独的一个网页,而是整个网页的一部分!理解这一点非常重要,不然你制作的词典可能会有各种各样的问题,比如影响了其他词典的正常显示,或者被其他词典的CSS或者JS所影响。具体在应用中怎样实践对这一点的理解,请继续看下面的内容。: X8 @& I+ |; J: u$ P, k8 @( y8 i
( W. {" Z2 g; @. m$ u

- v0 r) K5 H$ b2 T
  • mdx源文件中,每个词条要用单独的一个<div>标签包含起来1 s. ?) g5 i- y" {$ k
比如在mdx源文件中,有一个词条:0 @1 ]3 ?& ^% m5 ]

2 r( V2 N8 ^. P+ `" M/ c) ~5 j( h. H) q5 d
这样写非常不好!我们已经说过,您的词典中的一个词条只是最终整个查询结果网页的一部分。现在您的这个词条虽然有一些div标签有class属性,可以用来添加CSS,但是如果其他的某个词典里面也有<div class="pf">,那么您针对您的词典制作的CSS就会影响其他词典。正确的做法是,把整个词条的所有内容包含在一个div标签内,并且给这个div标签一个很独特,针对您当前制作词典的一个id或者class属性。比如我们可以修改上面的例子,如下:  ?9 o0 U# @" _* J* G- o1 i
9 W" e' K# ]# L$ w
# ?; _/ W9 \4 B

" `9 L0 s; X0 r这个示例中,我们用了<div id="tldimproved">来包住了您的词条的所有内容,这样,在CSS和JS中您可以仅仅针对您的词典内容进行样式的设置,而不会影响其他词典。那具体该怎样设置CSS和JS呢?请继续看。
  Y9 o9 x# Y; _1 k6 |
. W  T- @# ?9 ~# I6 j0 A; e$ w+ _! b2 x4 e
  • 正确使用CSS,仅仅对您自己的词条设置样式7 p" T1 c+ {) g! G& F
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您设置CSS时候必须只针对您自己的词典,这样才不会影响其他词典的显示。有了上一条的包含住整个词条的div标签,这个任务就很好完成了。1 M& J, U8 J9 Q- w
8 u  K$ h, c5 H" w3 _
比如假设您的词条中有一段内容:/ h) d! j. p1 ~- V* V

8 S; W6 F+ `% e; d: X3 O8 P<div class="gdc">
5 u/ y( a& K4 R) |- l2 |        <div class="dcb">4 H% G$ V" H6 j2 _' O7 l% @
            <span class="pos">n.</span>* [( V$ M( F2 i7 S/ o9 _& O& u) @
            <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>
( W. a5 h  j7 O6 c" F' ?) c) C7 j        </div>/ J% r* q  \( F7 @
</div>3 {- V& f6 a) l9 f8 w3 _
; x3 o; N: Q4 @; M  x  E

) M# T& a, P" o  Q6 F2 ?! y* a/ K要对这个class="gdc"的div标签设置CSS,你可能会写:
* J$ s7 W, P5 g; \' @) f6 w8 }4 z9 B+ ~1 q# J1 Q% S8 g" W5 ?7 Z8 `
.gdc {...}6 t5 {+ U& h' d7 q7 Z- l; y

: G) q. o  @( N, Y* o7 ?或者. Z* h; L8 ~: v
6 @2 l; l# [# u
div.gdc {...}; m( f9 B  R1 G! S  q2 ~3 z% g/ y
- O. K) |/ @! R) c- g
这两种写法都不好!因为我们已经有了<div id="tldimproved">包含住整个词条的内容,那么正确的写法是:
( }6 X1 K8 C2 G7 x( X
6 o: C1 F) W! J" c2 |$ pdiv#tldimproved .gdc {...}
: z2 {  _6 Z% h5 R8 U+ Q8 \或者
; _9 ^/ h) m& b8 x( d& Kdiv#tldimproved div.gdc {...}
0 P/ L+ s0 J+ L1 j9 V, p或者5 k$ b+ T) m% Z% e
div#tldimproved > .gdc {...}
/ j9 J' S& T1 d; J或者0 i# T4 V- c- P: U$ k' i
div#tldimproved > div.gdc {...}* T! a% U- P1 c2 W
) a1 G" T4 m6 E
这样写的效果是,您指定的CSS只会对<div id="tldimproved">里面的那个css等于gdc的标签生效,而其他词典不可能有一个div叫做tldimproved的,这样也就避免了CSS的冲突。
, V' `# M+ F, H% j7 V; [; L  v; g

2 w' u& R5 n* h8 R( N3 o
  • 正确使用JS,仅仅对您自己的词条内容进行修改
    - r* m' b% S+ v& b0 S' I
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您编写JS的时候必须只针对您自己的词条,这样才不会影响其他词典的显示。有了包含住整个词条的div标签,这个任务就很好完成了。
# u. x, t# r/ C0 L9 C# M, J通常在JS中,您最终的目标是动态地修改您的词条,不管是修改内容还是修改CSS,反正目标就是修改。修改的第一步是获取要修改的对象,获取的对象如果错了,那么您做的修改可能就应用到了不正确的地方。比如您想给您的词条中的图片加一个三个像素的边框,如果您使用JS不当,那最终结果可能是您修改了所有词典中的图片,都加上了边框。那么怎样正确地获得你要修改的对象呢?我们还以上面的示例代码为例:
: O! u5 p3 J* u8 U
0 U. z( [5 g+ t<div class="gdc">
  x- E5 f0 s( ]* s4 D3 s" v        <div class="dcb">8 d' c1 Q, d5 w8 k/ Z* ], z9 S
            <span class="pos">n.</span>+ n2 A4 |1 x9 p* h! o
            <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>0 `' x4 K$ a9 \# c5 X
        </div>. A0 l& b0 E& n# h& ]) \( m, U
</div>& E$ N  w5 ?# `
1 @# B/ w# {( Z( |1 I: H7 `
正确的方法是:/ @  d& a% I! u7 X$ h
8 Y2 ^% H) S2 J
如果您使用jQuery:
4 j7 k1 L. ^" r; g) y5 U$("div#tldimproved div#gdc")
3 q: ~4 P; T! Q+ p/ p' P6 D或者" ~' K& _* C% u; |
$("div#tldimproved > div#gdc"), j( W0 v& ~* [) p
或者
  _5 s( q' @0 {: A* W! C* [$("div#tldimproved #gdc")
6 _) i+ |* V6 }或者$ V3 _! a: e2 n& s
$("div#tldimproved > #gdc")
- x' q9 J2 N( C, H$ K) `0 h3 C, a- N7 ^8 l

$ D7 l# T2 `  g! ]+ w如果您使用的是vanilla JavaScript,那么正确的方法是:6 k( E$ B& |* C# j, f9 H* e
document.getElementById("tldimproved ").getElementById("...")
0 L6 Q+ R: e  H4 z# y7 ]  i或者
  O' C7 r: x/ e' r! z( O! udocument.getElementsByTagName("body")[0].getElementById("tldimproved").getElementById("...")
7 h( {6 V% V, E, r或者
2 b$ Q) r  A9 L8 v& M/ Jdocument.querySelector("div#tldimproved")....; r: O; u& X& u2 k7 i" o
或者0 X3 ~* {8 Y& E
document.querySelectorAll("body")[0].querySelector("div#tldimproved")....
$ x8 t7 H2 H  [6 @- N等等,因为vanilla JS写起来比较复杂,我仅仅列出了几个常用的函数,大家应该领会我的意思了,就是你不管干嘛,总要表明“我想要获取的是id等于tldimproved下面的内容”,这个思想和上面的关于CSS的写法是完全一样的,目标只有一个,就是您只是修改您自己的内容,而不会影响其他词典!
) Q6 D2 O) r  T/ l; Y- c- L5 V+ T( C, k5 X9 E) T
  • 正确使用CSS reset framework+ g) O  ~" O0 T. U
现在有很多CSS reset framework,有些人在自己的mdict词库中使用,上来就是:- a% N8 [  l" k' q: @
* {3 j; P6 |2 Z4 s4 [$ a, I2 x; H
  box-sizing: border-box;
7 {1 w4 o5 G7 ^2 |! I/ t8 t0 Q}( @2 {/ ?; I* `2 U7 d
::before,
2 J, s, [# j3 g1 Z::after {
3 n% x( o: G/ {% y  O5 [  box-sizing: inherit;/ A* ]5 o9 j8 q
}
+ h) I; I3 X+ e1 X- h: uhtml {% |, t( b! @$ `) {6 X
  line-height: 1.15; /* 1 */
0 E! B! C6 K. ?/ z8 L' `  -webkit-text-size-adjust: 100%; /* 2 */. D  R; j! z. y0 ?
  -webkit-tap-highlight-color: transparent; /* 3*/
. n6 {' u6 v4 \2 Z}
0 N8 g2 G0 I8 v& ~$ m1 j  z  pbody {( z4 k0 S3 g. R! k3 L2 z+ B
  margin: 0;
! l, _* g3 A* b}/ q6 ?9 S! Z9 e$ W& R5 o7 u
main {0 l5 u- h; d; [9 t
  display: block;
% ?! v+ d" N8 _, E; D7 n4 |}, M6 I# _: g: l  G. q: ~
$ w* p' ]! g+ B6 ^- U8 t- m

9 }( _! b3 K  \% X这么做不合适!如果你理解我上面反复强调的内容,你的词条只是最终查询结果网页中的一部分,那么相信你能理解为什么这么做不合适。你的词库只应该设置你自己词条的样式,而上面的CSS修改的所有词条的设置,尤其是box-sizing,这会导致其他大量词典显示不正常。正确的方式是,仅仅修改你自己词典的样式!所以,你可以写成比如像下面这样:
' l) v: R- ?+ E1 \) [% O3 s+ L; M; [# A
, v- @& v! E# Z4 O6 ?' {div#tldimproved * {
8 v* H9 y# m" N0 k    box-sizing: border-box;
& X6 E  a# O. b7 y' ]8 s2 g}4 `1 P; I7 j7 ]; f4 K
div#tldimproved ::before,
: }9 z9 p5 K9 Hdiv#tldimproved ::after {8 z* n" U2 T+ n: m/ B
    box-sizing: inherit;0 w# i) P1 B0 l% g3 q
}1 V2 \9 q( ?) l- L& p0 j  J1 {
div#tldimproved main {% R* l& I. W2 p: ?7 |
    display: block;
& G4 Y% S/ h. l2 j7 N5 n# {}: f" Y* [% s& P/ |: }
8 M7 ]# C; d6 ^: e/ [5 B3 v

( e$ {4 g1 |; j  o大家理解我的意思了吧,牢记一点,只修改自己词典的内容,不要影响到其他词典!
9 l3 k, N; @* B3 ~* Q. ^! O. I
/ |; c1 ]" T  t6 ^% E

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

评分

2

查看全部评分

本帖被以下淘专辑推荐:

  • TA的每日心情
    擦汗
    2024-2-8 08:54
  • 签到天数: 902 天

    [LV.10]以坛为家III

    发表于 2019-4-24 20:25:05 | 显示全部楼层
    经验好贴,先收藏起来。赞。
  • TA的每日心情
    开心
    2022-1-21 00:52
  • 签到天数: 699 天

    [LV.9]以坛为家II

    发表于 2019-4-24 18:44:09 | 显示全部楼层
    本帖最后由 cocowind 于 2019-4-24 18:45 编辑 , a7 m- D  ?8 e7 X2 b- Q, F% O5 s

    6 e  B4 u  j* v3 n3 a赞成总结一下制作词库应follow的 best practices。
    6 w8 }4 G: G* l# {. v# _! ?
    9 F" D$ |# D* x6 b# |: x2 I9 q正如楼主所说的,手机上可能必须把很多词库的文件放到一个文件夹里,因此命名不能过于简单,否则可能因名称重复而导致js/css互相干扰。6 d& d& h' Z2 e5 |# x7 I, \) ^0 H
    另外,鉴于有The little dict这样的发音词典大全集,所有词典的音频文件都应放在“词典名字.1.mdd”里,用户可根据需要选择是否下载以避免臃肿。同时,css中设置自适应代码,当文件夹中没有“词典名字.1.mdd”时隐去发音图标。  n- i. R; j# p# e, a, ~* G8 F0 t* N
    还有,双解词典应该有中文翻译内容的隐藏功能,要有标注以便可通过js来实现。
    ) i  P) r& H& d7 j! a6 S
    2 w" ]' f8 B3 ~) s" H5 S6 h& f3 C7 m( C5 ^; U
  • TA的每日心情

    2020-8-15 10:40
  • 签到天数: 146 天

    [LV.7]常住居民III

    发表于 2019-4-24 20:21:05 | 显示全部楼层
    cocowind 发表于 2019-4-24 18:441 h6 a* s. i6 {: K, b, g& r: Q0 X
    赞成总结一下制作词库应follow的 best practices。( z: Y5 O: B9 }4 l; r8 u9 V2 r
    5 V( m% r. B. V) a
    正如楼主所说的,手机上可能必须把很多词库的文件放到 ...
    4 Z% I: _& A3 v+ z
    在手机 必须把很多词库的文件放到同一个文件夹里,这个到没想过。
  • TA的每日心情

    2020-8-15 10:40
  • 签到天数: 146 天

    [LV.7]常住居民III

    发表于 2019-4-25 06:01:26 | 显示全部楼层
    ! ]: M' Q: b# j( s
    经验虽好,但是不可能实行。. g. z0 w: T8 V! y6 P4 `
    * J/ e2 `7 r: H" }
    现在好多词典基本的 html / css 规范都不能保证,如何保证你这些额外要求。* V7 s) M. [  W+ l8 }9 [+ t, U
  • TA的每日心情
    开心
    2019-6-23 00:02
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2019-4-25 12:31:22 | 显示全部楼层
    zzzz_sleep 发表于 2019-4-25 06:012 I- W" x0 b) q' j5 w+ I
    经验虽好,但是不可能实行。1 ~. b1 U3 v8 ~8 ^* ?6 E( z7 E

    " ]) ~  F/ h8 w# o5 h  Z  N: K, w现在好多词典基本的 html / css 规范都不能保证,如何保证你这些额外要求。

    5 g) d3 p7 I; T( F1 F' p您说的很对,昨天看了一下朗文五加加,标签都没有闭合。这个只能自己修改了,或者自己做词库的时候遵守这些。9 h* c- y; I% [# e1 r/ F+ m

    该用户从未签到

    发表于 2019-6-7 00:40:30 | 显示全部楼层
    thanks alot
  • TA的每日心情
    开心
    2022-1-21 00:52
  • 签到天数: 699 天

    [LV.9]以坛为家II

    发表于 2019-12-20 13:44:17 | 显示全部楼层
    正确的做法是,把整个词条的所有内容包含在一个div标签内,并且给这个div标签一个很独特,针对您当前制作词典的一个id或者class属性。; e1 l$ I$ C/ i
    -------
    4 P9 m: B' b: R4 G# ~. v5 Z学了点HTML/css的皮毛,回头看这个贴,觉得楼主说的这一点确实不错。2 I( a9 Q& w. T8 Y6 ^3 Z: [
    很多mdx/css没有做到这一点,好在GoldenDict自动把各个词典查询结果分别包含在一个div标签内,不然真的很容易乱套。
  • TA的每日心情
    奋斗
    2023-4-1 06:34
  • 签到天数: 1049 天

    [LV.10]以坛为家III

    发表于 2020-3-9 08:35:42 | 显示全部楼层
    学习了,收藏。
  • TA的每日心情
    开心
    2023-6-12 12:16
  • 签到天数: 451 天

    [LV.9]以坛为家II

    发表于 2021-7-26 13:35:13 | 显示全部楼层
    请问一下,我想把一万多个单词的mp3音频制作成一个mdd格式的发音库,该怎么弄?
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2024-4-19 08:17 , Processed in 0.049090 second(s), 11 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

    快速回复 返回顶部 返回列表