掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 2423|回复: 9

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

[复制链接]
匿名
匿名  发表于 2019-4-24 17:21:38 |阅读模式
本帖最后由 匿名 于 2020-10-9 02:27 编辑 6 T1 H- R* C" k4 t# n( R

% d4 P" o8 h+ E6 r. a% X
) s* m0 D  G2 n9 H0 \5 N) h  w更新历史5 f# {$ w) m, I+ L5 s
! i& K7 Y: v1 A6 g9 ~# K; q( b$ c/ v
2019.4.24 9:22 PM添加新内容
% y7 R% ^3 u2 p  Z$ u% a2 z  S/ `* U
2019.4.24 5:21 PM
8 x1 z6 F2 D9 s* \, \" h开始写此文,尚未完成先保存一下" d: g, L: H5 D. W* B5 A

' }8 h- A) x9 p, K
% k% u- B7 a5 h* J3 Y! N" d0 H前言
; P1 ?( E  j' R- I% d
9 I, W0 w9 ~# ]0 K- z1 q大家好啊!
) I( ]9 i. ^5 s" K4 i1 Z0 [/ ?& T- X: E! e9 {! v+ A" C
最近我自己制作了Macmillan在线词典,也修改了其他几个词典,都已经发出来了。大家也给了很多反馈,绝大多数的问题我也都修复了。这个过程中确实学习到了很多东西,有技术方面的,当然也有和mdict词库紧密相关的。这个帖子就是想分享一下我在制作mdict词库方面的经验,和大家讨论一下。下面的内容仅仅代表我(ogrishman)的一家之言,具体说的对不对,我们一起讨论讨论。然后我们一起完善这个帖子,并且宣传这个帖子,这样大家制作词库的时候都follow best practice,词库的质量一定会得到提高,而且问题还会少很多。下面我就一条一条列出我要说的这些best practices。
4 M/ `& t, K) f# v# z
) g! @/ _2 W- w7 J, t
/ r$ C5 w/ [6 M$ E/ k
) c* H1 s! x) T2 g; C正文; F' O# H, V* M0 c# L. s
1 A( Y' r! s: s4 [8 x, c: l% u
  • 词库相关文件的命名要一致,并且清晰全面" [: p* u% O0 V' K# a+ ~
比如我们要制作一个Oxford Advanced Learner's Dictionary第九版的词库,那么相关的文件名可以命名为:
' Q. ?5 f/ e7 |
; k* V9 }4 |& W
Oxford Advanced Learner's Dictionary 9th.mdx) w+ L4 @2 _/ n# Y
Oxford Advanced Learner's Dictionary 9th.mdd) d4 d5 }$ G2 ]5 X
Oxford Advanced Learner's Dictionary 9th.1.mdd0 I  ~( F. _3 C% C
Oxford Advanced Learner's Dictionary 9th.js- O4 \3 h' R0 {% T& y
Oxford Advanced Learner's Dictionary 9th.css

- O: F# k  E( O4 S7 m* B我们要考虑到,某些情况下我们可能必须把很多词库的文件放到一个文件夹里,这时遵守这一点的优点就突显出来了,用户可以一眼看出哪些文件属于哪个词典,而且文件排序一般也会把这些相关文件排在一起。这里要注意,不要用缩写,比如OALD9.mdx,这样不够清晰!0 K& c* p1 p2 n/ z2 q
/ o& T' y' p  I/ p! ~
6 ~/ U  M/ y  A3 {, n' P8 T
  • 每个词典都要提供外置的js文件和css文件供有能力的用户深度定制词典
    & [5 e, c7 R4 j% H
每个词典最好都有外置的js文件和css文件。css文件基本上现在所有词典都会有,但是我建议,即使你的词库没有用到js,也在你的词条里加入一个外置js文件,这样可以给用户留下自己扩展的空间。; O% U  ?* X2 @( @. o& L1 F1 s7 U" H

1 T8 Y, T- W, L- B
  • 你的词库中的一个词条只是整个网页中的一部分,深入理解这一点,并且牢牢记住
    3 C$ y% \( v5 j) x" d- E* `
现在主流的词典软件(欧路词典、GoldenDict)在渲染一个单词时候都是用网页的形式。现在基本上所有用户都会安装多于一本的词典,这些不同的词典中的相同的词条凑成了一个网页,也就是您看到的结果。比如下图是我在Windows上的欧路词典查询frequency后的结果,其中部分词典的结果被我折叠起来了,其中每个红色方框表示一个词典的结果:
: \+ r3 b/ T: M' m" ^; S7 f- ?8 O
# I1 ^7 B2 Q& T2 h5 w1 k* Y5 Y9 L; j

" `! r2 y4 t. G$ ]4 Q+ F这里要理解的是,这里每个红色方框不是单独的一个网页,而是整个网页的一部分!理解这一点非常重要,不然你制作的词典可能会有各种各样的问题,比如影响了其他词典的正常显示,或者被其他词典的CSS或者JS所影响。具体在应用中怎样实践对这一点的理解,请继续看下面的内容。1 B3 x! j" _9 ]3 x; ~' J
! @( R. m5 E! Y7 t7 D/ F7 t4 y
! D) M% ~/ Z; K1 W( a) y6 `
  • mdx源文件中,每个词条要用单独的一个<div>标签包含起来. e6 S; v6 K# Y0 Z
比如在mdx源文件中,有一个词条:
0 T5 X" E* H2 t/ O+ @1 v) _
1 T9 _3 [# b' }6 p
/ l3 L) l' i' P; q# n* r( `这样写非常不好!我们已经说过,您的词典中的一个词条只是最终整个查询结果网页的一部分。现在您的这个词条虽然有一些div标签有class属性,可以用来添加CSS,但是如果其他的某个词典里面也有<div class="pf">,那么您针对您的词典制作的CSS就会影响其他词典。正确的做法是,把整个词条的所有内容包含在一个div标签内,并且给这个div标签一个很独特,针对您当前制作词典的一个id或者class属性。比如我们可以修改上面的例子,如下:8 F( {. b  }* [; k& k. s/ L
2 ?' s/ o) d! t4 u3 A

8 P9 Y' U* `; A4 i( Z0 X' B5 Q* _0 V8 i, I) U! ~9 O
这个示例中,我们用了<div id="tldimproved">来包住了您的词条的所有内容,这样,在CSS和JS中您可以仅仅针对您的词典内容进行样式的设置,而不会影响其他词典。那具体该怎样设置CSS和JS呢?请继续看。
& w. i* H( {6 R9 K- j6 j/ T8 g3 z9 Y. I/ s0 I
7 }6 ~# d( S3 y( {% }' H# R- K
  • 正确使用CSS,仅仅对您自己的词条设置样式
    * l! ~: x5 w' g1 X4 E
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您设置CSS时候必须只针对您自己的词典,这样才不会影响其他词典的显示。有了上一条的包含住整个词条的div标签,这个任务就很好完成了。" q+ L: `6 l, l# h2 w& C# I6 L2 ?+ Q
+ ]" u! ~7 c  J9 F( A& b
比如假设您的词条中有一段内容:. M2 y1 w4 `' o: g8 `) M  \

& f8 U# g' f' Q: x<div class="gdc">
6 Y5 w1 ?6 @# M6 k: n& k# K, ]        <div class="dcb">
5 ?9 k( c& `" o. ]0 c            <span class="pos">n.</span>
5 ]8 F( ]1 I; T            <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>
' a1 v" h, R+ G5 V8 j0 V6 ]  M# o! V        </div>
1 r5 Q: T) H1 ?1 ~</div>
8 t! m, ^5 J+ ]% O" k6 ~- \0 w! l7 h' r$ u1 v' m% i% G
  o/ p, [6 A; M5 Z; A# a$ Y
要对这个class="gdc"的div标签设置CSS,你可能会写:' a# l+ c, q: _
7 t8 D8 C* h6 g. q
.gdc {...}6 ]' C. v) o3 e7 d( m" q
7 b! m- |* X( Y( }7 b
或者( `! N/ q/ _0 d8 A

; s( y* f- z6 kdiv.gdc {...}% y* z0 S- }8 x9 t& Q
9 `8 X  [% H$ r" e- o9 H; z
这两种写法都不好!因为我们已经有了<div id="tldimproved">包含住整个词条的内容,那么正确的写法是:) U  t, x% ?9 A7 U

" V' \% S4 S' V. j, N- i7 S. T1 w8 c9 {: adiv#tldimproved .gdc {...}: R* V1 Z9 P6 m1 j) X
或者
! n4 h4 t0 ]4 E/ s, Hdiv#tldimproved div.gdc {...}7 K5 o' R2 B) G# p6 R- Q
或者- K7 H$ F; z1 p3 C: ~
div#tldimproved > .gdc {...}: j* ]& Z" ?- d: w& U) m$ s9 g
或者/ r& l& E1 D5 q. g; F
div#tldimproved > div.gdc {...}
' `) S& h2 Q) Z# w# W- x$ ?& a2 m4 p/ i+ f, B
这样写的效果是,您指定的CSS只会对<div id="tldimproved">里面的那个css等于gdc的标签生效,而其他词典不可能有一个div叫做tldimproved的,这样也就避免了CSS的冲突。
5 V. S' ~; }& |2 o0 L: r' A* ?/ o' k* r
6 \2 W% b' {5 y& j% J% Q
  • 正确使用JS,仅仅对您自己的词条内容进行修改$ y& W& m& k6 R  j& O  }8 u
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您编写JS的时候必须只针对您自己的词条,这样才不会影响其他词典的显示。有了包含住整个词条的div标签,这个任务就很好完成了。
5 s) T" ~8 X7 B3 _. d5 f通常在JS中,您最终的目标是动态地修改您的词条,不管是修改内容还是修改CSS,反正目标就是修改。修改的第一步是获取要修改的对象,获取的对象如果错了,那么您做的修改可能就应用到了不正确的地方。比如您想给您的词条中的图片加一个三个像素的边框,如果您使用JS不当,那最终结果可能是您修改了所有词典中的图片,都加上了边框。那么怎样正确地获得你要修改的对象呢?我们还以上面的示例代码为例:7 q% ~1 F, i0 t: D
5 l1 \! q! Q2 b: v7 g
<div class="gdc">
1 j6 \+ d0 Z: [2 z0 m6 O        <div class="dcb">
1 w) x3 g! m* |* R            <span class="pos">n.</span>
& y# m8 H. z; `3 {            <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span># u; b. k9 ?! ^( U( N
        </div>" _( d+ p6 Q& q
</div>
& j+ w( X2 q. M) _) {+ X' U! x- d
8 g! c% M- `9 }" d" O7 q8 a1 d正确的方法是:
7 O% |3 r! X( C- t4 ~3 A6 R  i4 }$ @" w; f
如果您使用jQuery:
3 t& Q1 P5 F/ W$("div#tldimproved div#gdc")
, N$ E9 m$ W5 ]  i或者2 m* e2 ^; C) F. x$ o. ]0 @
$("div#tldimproved > div#gdc")4 x2 D' _% u' p$ g
或者" `/ k, V. p. `3 `1 r1 _1 `+ D* M
$("div#tldimproved #gdc")9 ?6 y( W, A/ C: f9 d4 h- n/ i1 }# J$ C
或者
. r6 W9 R$ [- w0 O$("div#tldimproved > #gdc")+ t: F) |; J8 r

. A  T8 ^; W3 X+ J
& k5 \" A/ }( H7 N, ?  Y: H如果您使用的是vanilla JavaScript,那么正确的方法是:
: _* t6 h3 o5 z- H" fdocument.getElementById("tldimproved ").getElementById("..."). c9 T- _) ~, `& ^7 u
或者
$ v2 D0 A, ^1 v* I0 Fdocument.getElementsByTagName("body")[0].getElementById("tldimproved").getElementById("...")
( R# A4 T( P- m3 j4 Q  o: o4 G8 D或者; u+ u6 {2 I- e; s/ j
document.querySelector("div#tldimproved")....
& p' R* W  H: W& U或者: G9 @/ X  d# U. A4 g1 r1 ~: W
document.querySelectorAll("body")[0].querySelector("div#tldimproved")....' D8 J1 M( j) M
等等,因为vanilla JS写起来比较复杂,我仅仅列出了几个常用的函数,大家应该领会我的意思了,就是你不管干嘛,总要表明“我想要获取的是id等于tldimproved下面的内容”,这个思想和上面的关于CSS的写法是完全一样的,目标只有一个,就是您只是修改您自己的内容,而不会影响其他词典!
7 X  k* z- E0 V( z  U: U8 `3 H  ?; I. h/ r
  • 正确使用CSS reset framework  ]0 w. x5 M0 ]$ H% d8 R% X4 P% t
现在有很多CSS reset framework,有些人在自己的mdict词库中使用,上来就是:
. ^* U8 i% K! s" U3 W7 z2 \* {
8 ^4 E% c7 h( w" l0 H  box-sizing: border-box;
$ R8 \6 G0 W+ a! j3 H. A}- |: n* L: K: K/ R' d1 z4 d
::before,
: I- f0 d3 T+ V+ v::after {
& P4 S6 y* t7 j8 a& n* R  box-sizing: inherit;+ Y: h8 E% u- X2 V5 X; p; x
}2 ?2 f' o6 W1 v: d; [$ n/ x9 q
html {$ {3 B( x7 E  I6 t
  line-height: 1.15; /* 1 */
% b# w% {5 I6 [  -webkit-text-size-adjust: 100%; /* 2 */$ b9 {; f) \& [$ o! _: X
  -webkit-tap-highlight-color: transparent; /* 3*/, V1 ~3 k& z) Z5 ^* J% z7 _  x, s
}
" W5 J( M% u' Rbody {' H9 A! n2 N6 y! E0 s5 V: F
  margin: 0;
$ h1 ]3 s3 r, ]/ V0 [4 _}4 w% E9 l: }& G! C+ |9 R# z, V
main {$ r: F- R" V, K" W) b
  display: block;5 d3 |" m2 h$ _# u; v/ ]
}& j9 j4 k; _  J

5 O9 ^, H+ e% i. v- ~2 o
- @; a5 l( n2 t5 I这么做不合适!如果你理解我上面反复强调的内容,你的词条只是最终查询结果网页中的一部分,那么相信你能理解为什么这么做不合适。你的词库只应该设置你自己词条的样式,而上面的CSS修改的所有词条的设置,尤其是box-sizing,这会导致其他大量词典显示不正常。正确的方式是,仅仅修改你自己词典的样式!所以,你可以写成比如像下面这样:, R" P# I0 x3 ?. w  v
1 e) }' a6 |2 x+ X
div#tldimproved * {
3 s0 r2 s1 r. I    box-sizing: border-box;$ W5 M8 g$ O0 k0 C/ [+ i- N6 V
}
) ?1 G3 A* k" f8 L/ ldiv#tldimproved ::before,
4 P7 C; D5 |  A" Kdiv#tldimproved ::after {
; ?( q" R6 ^5 b5 D    box-sizing: inherit;
/ T  @9 @' S/ W& E/ @$ l2 n}
& ~9 F. E  k. ndiv#tldimproved main {/ M* m/ b3 E4 X7 K& C3 @
    display: block;
4 F0 H0 o4 A+ @0 u7 F* A}
. i/ }; u2 u* F8 T
0 [+ W, X; g6 [8 t/ K* B
5 d1 |5 u; L7 |; s5 A4 T大家理解我的意思了吧,牢记一点,只修改自己词典的内容,不要影响到其他词典!
/ x3 S; l/ }/ s1 F) ^: e1 ]' q1 y: W6 D' ~/ Y

本帖子中包含更多资源

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

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 编辑 ' @+ V& ^' f* k& ?  g. C; o
    ; U* U# q9 H: X3 s% T
    赞成总结一下制作词库应follow的 best practices。+ A3 d, f. ^1 m; v! ?2 O/ ?
    / \/ m, U" P( B
    正如楼主所说的,手机上可能必须把很多词库的文件放到一个文件夹里,因此命名不能过于简单,否则可能因名称重复而导致js/css互相干扰。
    6 G7 g* g$ d  K5 f. G# \5 w) k' N另外,鉴于有The little dict这样的发音词典大全集,所有词典的音频文件都应放在“词典名字.1.mdd”里,用户可根据需要选择是否下载以避免臃肿。同时,css中设置自适应代码,当文件夹中没有“词典名字.1.mdd”时隐去发音图标。4 @9 M- M& q+ \: o/ h0 J# M6 Z" i
    还有,双解词典应该有中文翻译内容的隐藏功能,要有标注以便可通过js来实现。
    , w; B& V7 `1 W* l; q. Z
    7 T: a4 Y0 D+ _
      B. l) u# i4 h* K1 [
  • TA的每日心情

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

    [LV.7]常住居民III

    发表于 2019-4-24 20:21:05 | 显示全部楼层
    cocowind 发表于 2019-4-24 18:44
    7 R5 M0 j5 g' N2 C" e赞成总结一下制作词库应follow的 best practices。
    " D+ t! B  l7 _0 ~
    ) J( B1 y! ?& P, i2 A7 a8 U正如楼主所说的,手机上可能必须把很多词库的文件放到 ...

    8 s* k$ C4 L$ k& v7 E. V8 x4 N在手机 必须把很多词库的文件放到同一个文件夹里,这个到没想过。
  • TA的每日心情

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

    [LV.7]常住居民III

    发表于 2019-4-25 06:01:26 | 显示全部楼层
    ) m4 u- m- Z0 X& i  X
    经验虽好,但是不可能实行。0 ?6 I8 p9 e  r: \. s

    ( [5 w: T% y9 j- G1 ]1 f现在好多词典基本的 html / css 规范都不能保证,如何保证你这些额外要求。
    ) u& L; c7 P6 r$ Q$ n
  • TA的每日心情
    开心
    2019-6-23 00:02
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2019-4-25 12:31:22 | 显示全部楼层
    zzzz_sleep 发表于 2019-4-25 06:01
    - i& C6 g5 B/ L/ u, B+ p经验虽好,但是不可能实行。" Q  g! ~# }9 b  h' {4 ?7 m8 p
    5 J: h/ j9 {: [
    现在好多词典基本的 html / css 规范都不能保证,如何保证你这些额外要求。
    $ b# r9 K+ R4 \- G; P7 q
    您说的很对,昨天看了一下朗文五加加,标签都没有闭合。这个只能自己修改了,或者自己做词库的时候遵守这些。6 Z% B& S) O8 s2 |( I; N

    该用户从未签到

    发表于 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属性。; x  @* N2 c" M. M! L
    -------6 k9 m/ e0 K, ?7 d4 ?& E
    学了点HTML/css的皮毛,回头看这个贴,觉得楼主说的这一点确实不错。
    ! M/ y' D/ t, D4 {很多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 23:29 , Processed in 0.051213 second(s), 11 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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