掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 4678|回复: 9

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

[复制链接]
匿名
匿名  发表于 2019-4-24 17:21:38 |阅读模式
本帖最后由 匿名 于 2020-10-9 02:27 编辑
, n( [' Z  T( y: g0 E1 l& y& w
, _1 h7 R2 B0 l: ]2 ?% V
更新历史
/ S( v% x( S1 S7 p& Q3 l/ Q7 L- u3 K; I: V: Y; S
2019.4.24 9:22 PM添加新内容
* n- R& i2 {) N  M4 A/ z" k# E; Q& n' q' Z1 |  K
2019.4.24 5:21 PM7 b8 j0 ^! Q/ y* x# Y) ?! T6 L+ Q
开始写此文,尚未完成先保存一下
7 }% a8 F! e* G4 T8 ^4 y' B3 {- x0 z: ?
: s; O% \* q. L0 t2 M1 N* p" ?
前言
( }# ^  A3 r% }& B6 `" Y# q: l3 R6 n$ d& i2 Z8 `( T! \8 c
大家好啊!
, _& J. i; L, s# t! ]* [6 O. g' V
* U# I0 M3 K4 l3 q5 l0 [最近我自己制作了Macmillan在线词典,也修改了其他几个词典,都已经发出来了。大家也给了很多反馈,绝大多数的问题我也都修复了。这个过程中确实学习到了很多东西,有技术方面的,当然也有和mdict词库紧密相关的。这个帖子就是想分享一下我在制作mdict词库方面的经验,和大家讨论一下。下面的内容仅仅代表我(ogrishman)的一家之言,具体说的对不对,我们一起讨论讨论。然后我们一起完善这个帖子,并且宣传这个帖子,这样大家制作词库的时候都follow best practice,词库的质量一定会得到提高,而且问题还会少很多。下面我就一条一条列出我要说的这些best practices。7 j' W" a1 w& ~& k3 d6 ~
0 C4 Q4 j5 f% P# |, s$ L$ B

# h' d5 k! `' h8 R: W9 q! ?9 U. _+ H; C# G/ x2 g1 D4 ~+ e$ n% j
正文
: x! k# V4 [  A# d" Y8 b8 ^( K2 @) b* h5 P. r% ^
  • 词库相关文件的命名要一致,并且清晰全面# c3 D8 d- a, G! R0 N
比如我们要制作一个Oxford Advanced Learner's Dictionary第九版的词库,那么相关的文件名可以命名为:
" y2 [& J" M1 G: O- Y
5 d: Z( ]0 j% E- D& J& \9 W! _4 P" d
Oxford Advanced Learner's Dictionary 9th.mdx
6 z. B1 g0 c1 B# J1 vOxford Advanced Learner's Dictionary 9th.mdd- U2 T: `+ k4 i) \, h- w# d
Oxford Advanced Learner's Dictionary 9th.1.mdd% c/ R0 V6 u& I1 N! F% O0 m
Oxford Advanced Learner's Dictionary 9th.js" p7 _% z' _7 @; u/ A
Oxford Advanced Learner's Dictionary 9th.css

/ ?! m2 m3 z) `, g我们要考虑到,某些情况下我们可能必须把很多词库的文件放到一个文件夹里,这时遵守这一点的优点就突显出来了,用户可以一眼看出哪些文件属于哪个词典,而且文件排序一般也会把这些相关文件排在一起。这里要注意,不要用缩写,比如OALD9.mdx,这样不够清晰!
% d9 y) M. l. S0 S/ S1 z8 e! L% ^5 K
/ L. ]+ x+ k+ t& t3 h2 f, ]: P& s% s2 d
/ H) B2 F# t! g. L2 M. O+ _1 K6 J" ~5 ~7 Y5 S
  • 每个词典都要提供外置的js文件和css文件供有能力的用户深度定制词典; ~# s9 H; s1 t; u2 B1 A
每个词典最好都有外置的js文件和css文件。css文件基本上现在所有词典都会有,但是我建议,即使你的词库没有用到js,也在你的词条里加入一个外置js文件,这样可以给用户留下自己扩展的空间。/ \( T3 V3 Q4 M' m

& N+ U/ [, M! y" h7 E
  • 你的词库中的一个词条只是整个网页中的一部分,深入理解这一点,并且牢牢记住3 R; L! W5 j' e6 U( W- Q) m) |
现在主流的词典软件(欧路词典、GoldenDict)在渲染一个单词时候都是用网页的形式。现在基本上所有用户都会安装多于一本的词典,这些不同的词典中的相同的词条凑成了一个网页,也就是您看到的结果。比如下图是我在Windows上的欧路词典查询frequency后的结果,其中部分词典的结果被我折叠起来了,其中每个红色方框表示一个词典的结果:
- r' M- ?' S, ^6 ?# G# x1 \# T  ^. M' k1 @( S" D$ k/ o- C

# }9 R, U/ u. w2 x. |1 [. r2 i7 h. [7 V7 b4 l, K8 N
这里要理解的是,这里每个红色方框不是单独的一个网页,而是整个网页的一部分!理解这一点非常重要,不然你制作的词典可能会有各种各样的问题,比如影响了其他词典的正常显示,或者被其他词典的CSS或者JS所影响。具体在应用中怎样实践对这一点的理解,请继续看下面的内容。
6 @. O# A8 B) d* R1 B- ?% E3 P5 ]

% `9 B. N2 k6 H  {7 o
  • mdx源文件中,每个词条要用单独的一个<div>标签包含起来$ Z4 `0 m7 {5 A$ G
比如在mdx源文件中,有一个词条:
, n; p& {/ c0 L% j7 h1 x. A* R- J) g, K/ D. m9 f2 s4 z
5 a) J- N* F  m+ Y
这样写非常不好!我们已经说过,您的词典中的一个词条只是最终整个查询结果网页的一部分。现在您的这个词条虽然有一些div标签有class属性,可以用来添加CSS,但是如果其他的某个词典里面也有<div class="pf">,那么您针对您的词典制作的CSS就会影响其他词典。正确的做法是,把整个词条的所有内容包含在一个div标签内,并且给这个div标签一个很独特,针对您当前制作词典的一个id或者class属性。比如我们可以修改上面的例子,如下:
% Y4 Z: R6 l8 u3 c$ t' I7 e
  G6 y& }0 U3 e: ~, p+ |# k/ W
6 C5 O* w, R# [+ r9 Z; H- q& ]- P, H# P% U! ~3 G: v
这个示例中,我们用了<div id="tldimproved">来包住了您的词条的所有内容,这样,在CSS和JS中您可以仅仅针对您的词典内容进行样式的设置,而不会影响其他词典。那具体该怎样设置CSS和JS呢?请继续看。) ?4 [) X" l- L5 l$ l  d
. o) ]- O: H; G. k/ A

# i9 L7 d9 N8 o; `  ]
  • 正确使用CSS,仅仅对您自己的词条设置样式
    5 J9 {' w. c6 a0 f6 M
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您设置CSS时候必须只针对您自己的词典,这样才不会影响其他词典的显示。有了上一条的包含住整个词条的div标签,这个任务就很好完成了。
  G6 c( }9 L; `) ?8 Q  J9 s# d, z& J
比如假设您的词条中有一段内容:* c: ]4 n( Z7 [! A% v2 [* x9 r
% ~" u) S5 J+ c
<div class="gdc">
1 e8 Y" l) T/ {0 m2 Q        <div class="dcb">
- A/ ^" w8 Z, Q& j* @            <span class="pos">n.</span>8 `% m7 w* Y0 ]( c9 C$ \& ^
            <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>
. p7 q  R* u  w0 W' v! p        </div>
0 s1 ^4 F' d' O1 t- W6 l* D, A  ?6 z</div>! _6 X+ }2 y7 R& H7 N$ i5 D6 t* O

9 d( N0 |" C: |, s6 p: q* }5 F
6 ~; K7 `8 j( s/ ?6 N3 y- ~要对这个class="gdc"的div标签设置CSS,你可能会写:3 q. A2 m' D- T2 u9 I# d! @

6 s2 w' L# i* ?. v  x.gdc {...}
. H0 [. U( }9 o0 G- M1 b5 [* \. K+ l2 b% k; [
或者- T2 {9 Y* b+ X' m$ u" k
4 k1 @5 o# W5 ~: s) J: y
div.gdc {...}3 ?! V, ?% `# }" n( R) T! a* p4 l

& n1 t( O4 L& r; A; Y( g: T这两种写法都不好!因为我们已经有了<div id="tldimproved">包含住整个词条的内容,那么正确的写法是:' P( ]! ~1 m9 ~

! W' k+ A4 C; N& i/ W6 adiv#tldimproved .gdc {...}- _) }- i( l( \4 }
或者
2 B. B1 @1 K5 |. H7 N; d* A) wdiv#tldimproved div.gdc {...}# J7 i9 V3 ?9 t* W! X* r+ l
或者5 t! |* V# \9 s
div#tldimproved > .gdc {...}
& \' z' U: X: i或者5 N2 @4 E' i- F; R
div#tldimproved > div.gdc {...}( B  ]- B; w# R  m. l9 q) L% l, d
6 H5 M* q8 u) D! s+ y; _- T
这样写的效果是,您指定的CSS只会对<div id="tldimproved">里面的那个css等于gdc的标签生效,而其他词典不可能有一个div叫做tldimproved的,这样也就避免了CSS的冲突。
& [* o4 \- V0 U. N& F: f' q! s  V
' n  F6 E, c1 w+ G2 }( g0 O  B! y; O4 W$ N# e( s
  • 正确使用JS,仅仅对您自己的词条内容进行修改5 H$ P7 {, ~# z  s. y7 t# T1 g. _$ O
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您编写JS的时候必须只针对您自己的词条,这样才不会影响其他词典的显示。有了包含住整个词条的div标签,这个任务就很好完成了。
* n: j) _. s- L通常在JS中,您最终的目标是动态地修改您的词条,不管是修改内容还是修改CSS,反正目标就是修改。修改的第一步是获取要修改的对象,获取的对象如果错了,那么您做的修改可能就应用到了不正确的地方。比如您想给您的词条中的图片加一个三个像素的边框,如果您使用JS不当,那最终结果可能是您修改了所有词典中的图片,都加上了边框。那么怎样正确地获得你要修改的对象呢?我们还以上面的示例代码为例:& k# q( r' S+ p, E6 }  G
' Q( A, @1 O3 ?3 z! h8 ]
<div class="gdc">
+ K8 O- ?: L$ F" u! r        <div class="dcb">* Q# }- Y0 n$ M2 e
            <span class="pos">n.</span>
& M% w4 b8 o; n+ U            <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>
, W2 O5 w# j' I) o: j2 z" l! \        </div>
4 L3 V% @" {- v' S& z& ^</div>& {* Q* r) Z0 S' o* W
+ u& H' w4 |+ S) X+ S) p2 ?% Z3 d( n
正确的方法是:* W% J1 Y. c, y! d# q
$ k6 R1 S$ L# t6 F) e' q2 o
如果您使用jQuery:( O: [+ G/ b+ t" e+ o: E& ^. \! U$ Y+ [
$("div#tldimproved div#gdc")1 Z% S4 x! L' A
或者3 m6 o0 d/ L" j& \0 i; ~9 I
$("div#tldimproved > div#gdc")5 J9 ]% k+ Z6 t( B2 e# E
或者
8 H+ ^) M# |% U2 l, D- T$("div#tldimproved #gdc")
% ]) O- ]. G" @+ U或者3 t1 h9 l$ J0 Z/ u2 `. P/ Z
$("div#tldimproved > #gdc")
9 K2 F* C+ ]* Q' l3 I. k0 M2 [/ H2 V, z/ U; k, r: {. C0 q; B" i' Z3 N

3 h- q, L* Z; A* V5 s. N1 G. c如果您使用的是vanilla JavaScript,那么正确的方法是:
) |7 I/ Y/ r; Z) U& X  `document.getElementById("tldimproved ").getElementById("...")$ g2 z( U& E! L; Z9 {, o) d
或者9 @/ O: j- E/ z2 C  K: C" i
document.getElementsByTagName("body")[0].getElementById("tldimproved").getElementById("...")
3 |8 R3 ?2 R4 X$ |$ W* t6 F3 W或者
: D" P! w4 \. n+ J/ T9 o% wdocument.querySelector("div#tldimproved")....* W* b$ N1 m; H
或者
' h' A# a& t0 A1 Z. E0 Zdocument.querySelectorAll("body")[0].querySelector("div#tldimproved")....
. S3 l& e+ z+ [. S6 Q5 Y等等,因为vanilla JS写起来比较复杂,我仅仅列出了几个常用的函数,大家应该领会我的意思了,就是你不管干嘛,总要表明“我想要获取的是id等于tldimproved下面的内容”,这个思想和上面的关于CSS的写法是完全一样的,目标只有一个,就是您只是修改您自己的内容,而不会影响其他词典!
: L1 t5 y9 a( V/ O
) D% {; h; @- Q
  • 正确使用CSS reset framework
    ! \4 }# L- H2 \- K7 Z* W
现在有很多CSS reset framework,有些人在自己的mdict词库中使用,上来就是:  H$ C' }, E# j9 F; p+ ?! ?9 {3 z
* {" c8 c- \+ E% S" G: ]+ Z$ {
  box-sizing: border-box;
) Z* Z5 l' A  h- z# b}
& Q9 M2 C5 b! p7 P3 G7 x1 t::before,
$ Q8 n, _9 H% I5 y% f2 P  B::after {0 P4 _7 D" K& A! m+ d! ?
  box-sizing: inherit;
: o- M; D6 c4 S5 e1 K, R}! M, `: @0 E" x* W9 c$ O+ J
html {
* g8 r, o! S" j, T5 P' U  line-height: 1.15; /* 1 */; H5 ?* j3 x( \, o5 d: q5 C+ W4 l
  -webkit-text-size-adjust: 100%; /* 2 */
2 F9 X, U# }8 @, f* E  t  -webkit-tap-highlight-color: transparent; /* 3*/7 }+ }; a1 k" E8 {
}8 k6 R! @; _- ~7 x4 }7 m5 g
body {
' c9 E+ Z$ D# V  y# F  margin: 0;
. l! @! n- B' P3 U: M' r}* x) t; ^; ~  }0 Y8 x* i( ]
main {
6 r" g- C* d' Q, x4 g* L+ b' _$ v, b  display: block;
  @; l& n: U; R0 A* v- x  K}
& `% [, E6 a" C: \$ e5 s' g+ j+ e$ r* i2 q6 f

0 D2 [/ a8 o1 ^# M1 L# X这么做不合适!如果你理解我上面反复强调的内容,你的词条只是最终查询结果网页中的一部分,那么相信你能理解为什么这么做不合适。你的词库只应该设置你自己词条的样式,而上面的CSS修改的所有词条的设置,尤其是box-sizing,这会导致其他大量词典显示不正常。正确的方式是,仅仅修改你自己词典的样式!所以,你可以写成比如像下面这样:
9 O9 a8 l9 s5 \( Y3 B; h* j$ v: P6 j. G
div#tldimproved * {
  X" P8 j$ U% I3 I8 b7 g! \    box-sizing: border-box;  t5 }" C! p: p) j
}- }4 s! a2 z5 X$ t
div#tldimproved ::before,
6 @5 `" {* i' W- I" k6 |div#tldimproved ::after {
+ p/ l! i. @5 V8 o" F, _    box-sizing: inherit;) r% u6 T% Z! B3 p6 Y- b. a7 L6 C2 |
}* E6 x) [; M- W5 z  M& N
div#tldimproved main {4 R* w; ]- C7 d! U
    display: block;) O. [" T  Z0 e8 r; s, a
}* l+ H/ N) u# h# w( N
0 \$ X8 D2 i6 G2 ~5 R
/ Z) e2 K3 _, s5 Z, s1 E
大家理解我的意思了吧,牢记一点,只修改自己词典的内容,不要影响到其他词典!
1 }+ a* A) Z/ G6 q9 V8 B( m9 K) b( t5 ]" F/ H0 j& O

本帖子中包含更多资源

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

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 编辑
    # Z5 Z5 m8 k  ?; Y# U/ s+ K- j% \+ ]: d+ e
    3 _  Q3 s: s* O7 i赞成总结一下制作词库应follow的 best practices。, a' q9 K" F7 T9 E
    ! l( L1 ~# E& x* K
    正如楼主所说的,手机上可能必须把很多词库的文件放到一个文件夹里,因此命名不能过于简单,否则可能因名称重复而导致js/css互相干扰。6 g% _% k% Q& k9 j1 k- f2 i
    另外,鉴于有The little dict这样的发音词典大全集,所有词典的音频文件都应放在“词典名字.1.mdd”里,用户可根据需要选择是否下载以避免臃肿。同时,css中设置自适应代码,当文件夹中没有“词典名字.1.mdd”时隐去发音图标。5 y6 T) C* t5 s7 i8 w# ?% U
    还有,双解词典应该有中文翻译内容的隐藏功能,要有标注以便可通过js来实现。) Q/ K! b. Q3 q2 s$ ~6 ]* ]( Q
    " F2 O2 h6 A" `9 b' i( a

    . r7 w. c8 q9 R" w
  • TA的每日心情
    衰
    2020-8-15 10:40
  • 签到天数: 146 天

    [LV.7]常住居民III

    发表于 2019-4-24 20:21:05 | 显示全部楼层
    cocowind 发表于 2019-4-24 18:44- C- ^( ?1 N) J8 s
    赞成总结一下制作词库应follow的 best practices。
    7 A0 e( K) v! m2 N$ Z  X5 ^. m& V- h' F; x4 m. U5 v8 [
    正如楼主所说的,手机上可能必须把很多词库的文件放到 ...
    ! S/ C4 B3 h# o1 h5 i* C% a2 L
    在手机 必须把很多词库的文件放到同一个文件夹里,这个到没想过。
  • TA的每日心情
    衰
    2020-8-15 10:40
  • 签到天数: 146 天

    [LV.7]常住居民III

    发表于 2019-4-25 06:01:26 | 显示全部楼层
    8 ?$ t. R( ]0 e
    经验虽好,但是不可能实行。
    ; o+ ~6 n7 _0 @6 |* c9 r1 T
    8 [8 I5 c( L5 Y  W2 h% a! {* r现在好多词典基本的 html / css 规范都不能保证,如何保证你这些额外要求。$ U* D4 S% s) u
  • TA的每日心情
    开心
    2019-6-23 00:02
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2019-4-25 12:31:22 | 显示全部楼层
    zzzz_sleep 发表于 2019-4-25 06:01
    - c; ^7 x" I1 R2 Y经验虽好,但是不可能实行。4 v+ ]# I( q# k& K: E  ~

    9 \! `3 y4 r6 Z! P# F现在好多词典基本的 html / css 规范都不能保证,如何保证你这些额外要求。
    ! x3 ~  a4 G& y$ u
    您说的很对,昨天看了一下朗文五加加,标签都没有闭合。这个只能自己修改了,或者自己做词库的时候遵守这些。
    + o7 U/ `5 K. @

    该用户从未签到

    发表于 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属性。% ^( A8 K! ]! Y! h* y# X
    -------2 V$ C" K/ b+ \. o3 e8 f4 c
    学了点HTML/css的皮毛,回头看这个贴,觉得楼主说的这一点确实不错。: S' F+ k% ^( }
    很多mdx/css没有做到这一点,好在GoldenDict自动把各个词典查询结果分别包含在一个div标签内,不然真的很容易乱套。
  • TA的每日心情
    开心
    2026-5-27 19:42
  • 签到天数: 1051 天

    [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, 2026-10-24 00:05 , Processed in 0.024263 second(s), 26 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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