掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 2481|回复: 9

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

[复制链接]
匿名
匿名  发表于 2019-4-24 17:21:38 |阅读模式
本帖最后由 匿名 于 2020-10-9 02:27 编辑 ! A  A! k6 v2 e5 Y2 {9 Z8 k
3 `) \; `$ y* p4 P( \
9 D4 W# W- U. w- I
更新历史$ g, k! |# {9 V

$ Q, `: X$ ^/ f! a9 Q2019.4.24 9:22 PM添加新内容2 {6 x8 o7 F1 t, S! U
& `7 G0 N- I' p6 }7 s3 F8 `) H* f1 w
2019.4.24 5:21 PM
! _8 x% P4 k  C/ K开始写此文,尚未完成先保存一下
3 B  z1 L9 b' ~) _* \& T' E6 Y) k6 D0 C* k9 n7 f/ u2 v; a
' }5 g) v! R* j/ |0 v" M9 N) r( i
前言3 X" I9 z6 h' U5 t; j  Q: ]0 F

8 g$ B/ q; E; {; g" }" q大家好啊!
5 I  N' d9 @( t7 Z% u* e% s; K0 C+ ~* X; I# k/ @
最近我自己制作了Macmillan在线词典,也修改了其他几个词典,都已经发出来了。大家也给了很多反馈,绝大多数的问题我也都修复了。这个过程中确实学习到了很多东西,有技术方面的,当然也有和mdict词库紧密相关的。这个帖子就是想分享一下我在制作mdict词库方面的经验,和大家讨论一下。下面的内容仅仅代表我(ogrishman)的一家之言,具体说的对不对,我们一起讨论讨论。然后我们一起完善这个帖子,并且宣传这个帖子,这样大家制作词库的时候都follow best practice,词库的质量一定会得到提高,而且问题还会少很多。下面我就一条一条列出我要说的这些best practices。
  u# q+ o5 ^3 M) _& d  a. X* S/ t! ], Z& T1 g4 f# O1 i
" S5 j3 O, H3 G

6 P6 O8 x& d7 ~& z6 ?6 H2 l# Z正文
. b9 R8 m5 \2 z7 C* f3 e1 y6 v, S: B: E# c
  • 词库相关文件的命名要一致,并且清晰全面1 t) C+ W( y1 U6 K& F( r) Z5 V
比如我们要制作一个Oxford Advanced Learner's Dictionary第九版的词库,那么相关的文件名可以命名为:% z0 C- ?& U; J/ ]

( `- P% c. X0 |% x8 z8 t4 `
Oxford Advanced Learner's Dictionary 9th.mdx
3 `% m8 u' e' ^" i' d! M; V/ OOxford Advanced Learner's Dictionary 9th.mdd
2 \4 }1 x7 A3 a/ COxford Advanced Learner's Dictionary 9th.1.mdd
" l' t3 L& P3 S% `' u  }; jOxford Advanced Learner's Dictionary 9th.js
- K! L! f: r8 l, {7 zOxford Advanced Learner's Dictionary 9th.css

4 q5 b+ s, L0 @' F* V我们要考虑到,某些情况下我们可能必须把很多词库的文件放到一个文件夹里,这时遵守这一点的优点就突显出来了,用户可以一眼看出哪些文件属于哪个词典,而且文件排序一般也会把这些相关文件排在一起。这里要注意,不要用缩写,比如OALD9.mdx,这样不够清晰!% i2 E1 U' Q* V# K7 T8 Y0 R
3 K  \9 k; k7 m! ]' ^, G, b

7 M; w" k8 N- g- @! F$ f
  • 每个词典都要提供外置的js文件和css文件供有能力的用户深度定制词典
    ' `. E; y2 O" w& M; {; j0 n
每个词典最好都有外置的js文件和css文件。css文件基本上现在所有词典都会有,但是我建议,即使你的词库没有用到js,也在你的词条里加入一个外置js文件,这样可以给用户留下自己扩展的空间。# ?1 a3 y2 e; N' }( f& i, x2 [9 s
; B+ Q8 H8 J" L
  • 你的词库中的一个词条只是整个网页中的一部分,深入理解这一点,并且牢牢记住) n4 Y/ Q- {/ j8 D( u) D
现在主流的词典软件(欧路词典、GoldenDict)在渲染一个单词时候都是用网页的形式。现在基本上所有用户都会安装多于一本的词典,这些不同的词典中的相同的词条凑成了一个网页,也就是您看到的结果。比如下图是我在Windows上的欧路词典查询frequency后的结果,其中部分词典的结果被我折叠起来了,其中每个红色方框表示一个词典的结果:
2 `0 G- {# O$ P( I7 u( m9 n5 ^0 s# X- E! R) M0 M

: ~8 v# \# Z; @
7 L& z& b% L" t; ~2 v/ L这里要理解的是,这里每个红色方框不是单独的一个网页,而是整个网页的一部分!理解这一点非常重要,不然你制作的词典可能会有各种各样的问题,比如影响了其他词典的正常显示,或者被其他词典的CSS或者JS所影响。具体在应用中怎样实践对这一点的理解,请继续看下面的内容。
3 H! R. S5 w# t6 s1 t% p+ C3 {3 F/ `% e! B8 z7 n5 \3 j
: J/ a' N  J! T' F
  • mdx源文件中,每个词条要用单独的一个<div>标签包含起来
    1 _  Z5 b3 L. s. U9 F& u# {
比如在mdx源文件中,有一个词条:7 D, A2 b$ }" \, P; @3 ^9 b1 d: T
" w3 d1 Z( X% g2 ~" r% b
6 G& ?. V/ @: \- w' t
这样写非常不好!我们已经说过,您的词典中的一个词条只是最终整个查询结果网页的一部分。现在您的这个词条虽然有一些div标签有class属性,可以用来添加CSS,但是如果其他的某个词典里面也有<div class="pf">,那么您针对您的词典制作的CSS就会影响其他词典。正确的做法是,把整个词条的所有内容包含在一个div标签内,并且给这个div标签一个很独特,针对您当前制作词典的一个id或者class属性。比如我们可以修改上面的例子,如下:
/ V/ w, n) `( p' K$ n0 l! o; t, ?1 C+ \9 @

5 O  U5 X& H, }& b
0 C' H6 t( O/ z这个示例中,我们用了<div id="tldimproved">来包住了您的词条的所有内容,这样,在CSS和JS中您可以仅仅针对您的词典内容进行样式的设置,而不会影响其他词典。那具体该怎样设置CSS和JS呢?请继续看。
+ r- O- T2 n/ j- x, M* {0 [) e
2 y5 @' r9 ~  }+ _9 T& o) c! j7 J% K% W! d* v
  • 正确使用CSS,仅仅对您自己的词条设置样式
    ; W+ q. ~8 a& H- H4 J
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您设置CSS时候必须只针对您自己的词典,这样才不会影响其他词典的显示。有了上一条的包含住整个词条的div标签,这个任务就很好完成了。! E$ `- a- M4 Q8 F. w, [

" Z0 q* J8 X8 z/ v  }比如假设您的词条中有一段内容:! w: ?5 W7 @7 d* c7 B

4 q0 Q( B. ?) ~  F$ i0 A0 G<div class="gdc">
3 u, S/ |' q3 }5 d( D' e( N        <div class="dcb">+ s& Z# w  j& E) J7 S' U7 h
            <span class="pos">n.</span>" V) ^$ `2 z: P
            <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>% o! e, X; q( q: h: `5 Q( U
        </div>
4 X% U( i2 j' b( C# s+ }</div>* V! @5 C* K& N0 b# }
5 d9 ?7 ~9 D: I% J

) Z& |  N( v( w' @, k9 ~% I要对这个class="gdc"的div标签设置CSS,你可能会写:
' V. i. q7 R1 F. X2 M8 F: E2 j( h/ K+ A) Y" X7 q* x5 h
.gdc {...}: g* i) G. M' l! U9 L  e

2 X( |- a4 Q) }  e或者
1 d* \6 H; n- K$ F
# A, L8 x( b# z) H# Ediv.gdc {...}
" k; `$ E4 }; o$ x, D
$ B$ n) d& E2 L* ~; u这两种写法都不好!因为我们已经有了<div id="tldimproved">包含住整个词条的内容,那么正确的写法是:
4 c' R5 K8 e/ w0 }  H# N) t( d: H( l  b  e" U. v( [
div#tldimproved .gdc {...}
  N: j" n9 [5 x/ h0 ?或者3 V# M* u* x1 x) m- F
div#tldimproved div.gdc {...}6 i! G4 b" O9 ]7 N
或者" [( y9 }" n& D& E% w
div#tldimproved > .gdc {...}
* X, `9 R+ `9 Y1 _7 J% E或者6 S! |* n" g: o3 r
div#tldimproved > div.gdc {...}
( w/ S3 X( I7 _9 N/ D* f0 J$ o8 k7 g% i/ J/ r8 q
这样写的效果是,您指定的CSS只会对<div id="tldimproved">里面的那个css等于gdc的标签生效,而其他词典不可能有一个div叫做tldimproved的,这样也就避免了CSS的冲突。
. u4 S9 f8 h) c* G0 H  M
( h5 v( I6 N: f' `" W# ?* q* O3 R; Z/ w5 p" Z
  • 正确使用JS,仅仅对您自己的词条内容进行修改
    & K! f' I4 J8 q" T3 U
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您编写JS的时候必须只针对您自己的词条,这样才不会影响其他词典的显示。有了包含住整个词条的div标签,这个任务就很好完成了。
9 v9 `4 f% f2 z, H. r通常在JS中,您最终的目标是动态地修改您的词条,不管是修改内容还是修改CSS,反正目标就是修改。修改的第一步是获取要修改的对象,获取的对象如果错了,那么您做的修改可能就应用到了不正确的地方。比如您想给您的词条中的图片加一个三个像素的边框,如果您使用JS不当,那最终结果可能是您修改了所有词典中的图片,都加上了边框。那么怎样正确地获得你要修改的对象呢?我们还以上面的示例代码为例:' }  S# m1 O0 u  p

6 _6 t. q% W& c7 L# R4 r. ^<div class="gdc">% r! N0 K. h# W9 j4 F
        <div class="dcb">
' c( y! Q) P; ?5 ^8 u& x6 u4 D% ~! M            <span class="pos">n.</span>
5 L2 q( X4 u  [* D$ t: H( V            <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>
! O. @! s5 g7 z! U+ Y. q4 R  h$ `        </div>  `, ?: \- q; x( ]
</div>
* U7 x" ^" E8 q( {' u; B( R! h( c  n6 s" K% a/ p' ]0 Z7 u
正确的方法是:0 j  i1 l, r1 x" C

8 w" y) O+ P! S1 y% _, m2 J如果您使用jQuery:/ y/ I7 P9 d* w4 b6 b5 j0 B! p4 A
$("div#tldimproved div#gdc")
6 K% j8 x$ Q/ p. i# T0 K或者3 c8 g; q. i2 |( E- F* r
$("div#tldimproved > div#gdc")
: p2 p6 c' x. z% ~( e' {6 j或者
! c. H+ ]1 h7 \4 U/ I7 z! b& s( {+ q$ w$("div#tldimproved #gdc")
7 @! [9 O6 r7 R8 i4 Y# [或者
) B; p+ E  g6 O, h* A$("div#tldimproved > #gdc")
1 t% F2 I$ y) e9 F( T6 t1 C
" ^+ ~$ d% g0 Q' d1 L3 F9 I9 P
3 u, g3 `( g7 u# ^% @) v如果您使用的是vanilla JavaScript,那么正确的方法是:
: g6 L7 ^# U( c; Idocument.getElementById("tldimproved ").getElementById("...")
8 O7 ^; M5 M/ G2 d; ?1 \  J9 B或者  ~! I* K. r) V2 L/ y' f
document.getElementsByTagName("body")[0].getElementById("tldimproved").getElementById("...")
* v: g# W% M* h9 O或者  t- g" f! |8 `$ D2 x% h& p8 k
document.querySelector("div#tldimproved")....' X  E- T) q  o. U9 I* p
或者1 Q7 l$ M4 ?- p- k
document.querySelectorAll("body")[0].querySelector("div#tldimproved")....+ c% A: s2 Q& g( f5 E. V
等等,因为vanilla JS写起来比较复杂,我仅仅列出了几个常用的函数,大家应该领会我的意思了,就是你不管干嘛,总要表明“我想要获取的是id等于tldimproved下面的内容”,这个思想和上面的关于CSS的写法是完全一样的,目标只有一个,就是您只是修改您自己的内容,而不会影响其他词典!' Z8 }5 Q- z5 z9 ^2 l) V

8 ]5 N4 D5 A" g5 h
  • 正确使用CSS reset framework
    + i% |( k6 v" H# ^
现在有很多CSS reset framework,有些人在自己的mdict词库中使用,上来就是:
# \/ S/ U4 D; m* {
2 e6 j9 _1 f( ~7 \6 s1 G( `. _  box-sizing: border-box;- o' C3 r, O5 G" g$ S  b1 Y
}& J! L) b2 G  D" }5 @
::before,
; H! h/ ?2 x' u::after {+ u' z/ J6 R, j- r
  box-sizing: inherit;
/ E8 I+ [+ K9 u}# T8 [# M. U4 B4 Q$ u
html {$ Q  k& Q5 P& w* v, }( F" m. f
  line-height: 1.15; /* 1 */! V0 s3 f! M5 n" Y
  -webkit-text-size-adjust: 100%; /* 2 */  b7 G; W4 V  Q8 O" y
  -webkit-tap-highlight-color: transparent; /* 3*/$ ^! P, `; t: z
}
: I6 y8 h$ i' I4 l; r% }8 ~body {. [6 L; F- ^  |+ C3 g
  margin: 0;
! m' z+ R2 X. P}# w; z2 J' p- f- K% @2 x. F
main {
* i! |9 h# H# _2 f/ B# U  display: block;
0 k2 V" C& ^4 q! E0 k}
, @. W* W( q* y  Z" ^' @, j' t' a2 I/ {# n

+ @) l+ C! K. r) H这么做不合适!如果你理解我上面反复强调的内容,你的词条只是最终查询结果网页中的一部分,那么相信你能理解为什么这么做不合适。你的词库只应该设置你自己词条的样式,而上面的CSS修改的所有词条的设置,尤其是box-sizing,这会导致其他大量词典显示不正常。正确的方式是,仅仅修改你自己词典的样式!所以,你可以写成比如像下面这样:' I" t& L% R8 a& `- T

8 [7 w4 \9 Z. x) {) f7 F8 Sdiv#tldimproved * {
; r2 b4 I! u2 b* H    box-sizing: border-box;
+ W, m; w5 a- \* n' ]}
1 K+ ?3 K- m/ |' [) Kdiv#tldimproved ::before,+ [2 [$ a3 ]! w; c( R
div#tldimproved ::after {; d. R; ]7 V# W' \: Z
    box-sizing: inherit;
, U$ D: b" ^1 B9 [3 r; `: _}+ s) C% {7 c  C7 T
div#tldimproved main {" [* n4 ~) y( F1 v: M5 P( t
    display: block;
0 B; B5 k+ O, f) L/ N( b+ B}. ^( J! F7 Q# B2 N' s
. i: p3 P3 F% b* D/ }

, @5 f% z1 y/ t0 V, U大家理解我的意思了吧,牢记一点,只修改自己词典的内容,不要影响到其他词典!
) o8 q4 z8 F# Y7 H) l/ k4 o" A1 j6 w' p

本帖子中包含更多资源

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

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 编辑
    6 A0 _$ a: a8 S& e1 r8 N& s! t' p. Z0 L, s- V$ }, e$ m1 ~
    赞成总结一下制作词库应follow的 best practices。0 g4 J" \" l- w. Q/ @$ e2 @# K' o
    3 B! g9 o' F* b. B* s% a& O0 n
    正如楼主所说的,手机上可能必须把很多词库的文件放到一个文件夹里,因此命名不能过于简单,否则可能因名称重复而导致js/css互相干扰。# Z1 S2 Z9 a/ z; {9 [8 a  I' q  k
    另外,鉴于有The little dict这样的发音词典大全集,所有词典的音频文件都应放在“词典名字.1.mdd”里,用户可根据需要选择是否下载以避免臃肿。同时,css中设置自适应代码,当文件夹中没有“词典名字.1.mdd”时隐去发音图标。: h, [" y# B; a- a. x  o
    还有,双解词典应该有中文翻译内容的隐藏功能,要有标注以便可通过js来实现。" y) J7 r( f' Y- T, q0 _
    . U% a; R7 I. `2 T. r1 V

    * c5 B- ]8 y& X- b
  • TA的每日心情

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

    [LV.7]常住居民III

    发表于 2019-4-24 20:21:05 | 显示全部楼层
    cocowind 发表于 2019-4-24 18:448 A$ J4 E, H; q6 `6 w1 j( d; ?
    赞成总结一下制作词库应follow的 best practices。
    1 r7 B7 C! |( r% n& o2 A6 [/ p7 b  R' w7 _  X
    正如楼主所说的,手机上可能必须把很多词库的文件放到 ...

    " k% s( j2 ^9 G9 E: s; U在手机 必须把很多词库的文件放到同一个文件夹里,这个到没想过。
  • TA的每日心情

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

    [LV.7]常住居民III

    发表于 2019-4-25 06:01:26 | 显示全部楼层

    : a, Z& f! b( R4 M5 g+ o4 f# i8 v经验虽好,但是不可能实行。, M9 e) m* }' x6 `4 V
    , ?4 B7 A( j; V9 f
    现在好多词典基本的 html / css 规范都不能保证,如何保证你这些额外要求。
    : h( t* o% D$ d! \
  • TA的每日心情
    开心
    2019-6-23 00:02
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2019-4-25 12:31:22 | 显示全部楼层
    zzzz_sleep 发表于 2019-4-25 06:01
    $ f4 Q  i% d! x# s经验虽好,但是不可能实行。( _7 J5 p3 b8 m2 R) V/ \9 }
    2 p  _9 `( q% y! G: q
    现在好多词典基本的 html / css 规范都不能保证,如何保证你这些额外要求。

    3 D1 l8 U( S0 i* Y: L您说的很对,昨天看了一下朗文五加加,标签都没有闭合。这个只能自己修改了,或者自己做词库的时候遵守这些。2 x$ k' `* C6 A( Y

    该用户从未签到

    发表于 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属性。5 x# j: a. D. w: _* f
    -------
    3 e( H2 c5 L. m' D6 V- E" V& N学了点HTML/css的皮毛,回头看这个贴,觉得楼主说的这一点确实不错。
    & F& x6 b1 x! L4 m& Q/ {0 ~很多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-5-24 07:03 , Processed in 0.064348 second(s), 11 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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