掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 4086|回复: 9

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

[复制链接]
匿名
匿名  发表于 2019-4-24 17:21:38 |阅读模式
本帖最后由 匿名 于 2020-10-9 02:27 编辑 " x" X( A  `' y. l  w1 [

" J0 J. L) P* ^! p$ c5 _
. c" ~: U1 U/ p: q+ H: s更新历史
  i" ^: A" S5 }- K  `
4 \* `& l7 }6 n* t8 o  z2019.4.24 9:22 PM添加新内容  l4 i7 V- Y# F; e* _" p

# d, p8 x/ r2 Y+ ?" G0 r2019.4.24 5:21 PM2 q6 T) |4 P- p1 ]7 S
开始写此文,尚未完成先保存一下/ `  Z0 m* ?8 B) H; W
1 G- |% u; o: I, x; w
' o! m! G2 f, _3 L* |
前言
- @* K- i$ h7 H6 D' c+ q% ?* E; g3 t& ~4 R4 l0 v* y
大家好啊!
+ k/ ^6 I) U! O* H* S% j8 A2 M8 e; k8 \
最近我自己制作了Macmillan在线词典,也修改了其他几个词典,都已经发出来了。大家也给了很多反馈,绝大多数的问题我也都修复了。这个过程中确实学习到了很多东西,有技术方面的,当然也有和mdict词库紧密相关的。这个帖子就是想分享一下我在制作mdict词库方面的经验,和大家讨论一下。下面的内容仅仅代表我(ogrishman)的一家之言,具体说的对不对,我们一起讨论讨论。然后我们一起完善这个帖子,并且宣传这个帖子,这样大家制作词库的时候都follow best practice,词库的质量一定会得到提高,而且问题还会少很多。下面我就一条一条列出我要说的这些best practices。
5 W7 o+ a8 Q9 i- W  Z! s1 X9 @- a7 [

1 _$ ^& a, I5 m. f( W8 `" O
1 r5 O. M; I+ s) t( X  U正文0 X7 L5 M, S6 t4 y

' ?/ f  x' i. J9 j9 J
  • 词库相关文件的命名要一致,并且清晰全面
    2 c" _8 W' y; A
比如我们要制作一个Oxford Advanced Learner's Dictionary第九版的词库,那么相关的文件名可以命名为:4 U7 B$ b$ G; I1 X5 D
  _1 V* `, C$ r+ e
Oxford Advanced Learner's Dictionary 9th.mdx: V7 g0 r1 C3 v6 ~0 D
Oxford Advanced Learner's Dictionary 9th.mdd  @, ?  g0 `. ~9 A
Oxford Advanced Learner's Dictionary 9th.1.mdd' d5 @$ ^) ~! o$ o9 e+ z( i1 Y
Oxford Advanced Learner's Dictionary 9th.js! s7 D) D; }5 B8 o" v
Oxford Advanced Learner's Dictionary 9th.css

, a0 ?8 b* _  @( i$ ?我们要考虑到,某些情况下我们可能必须把很多词库的文件放到一个文件夹里,这时遵守这一点的优点就突显出来了,用户可以一眼看出哪些文件属于哪个词典,而且文件排序一般也会把这些相关文件排在一起。这里要注意,不要用缩写,比如OALD9.mdx,这样不够清晰!
- B2 B- a1 c/ V6 W6 }4 i; b1 y1 H2 C3 [# [' s0 t  K

* ]# |& V* T" h4 [3 N& [7 N
  • 每个词典都要提供外置的js文件和css文件供有能力的用户深度定制词典6 G/ ~9 f, O5 j7 |# q
每个词典最好都有外置的js文件和css文件。css文件基本上现在所有词典都会有,但是我建议,即使你的词库没有用到js,也在你的词条里加入一个外置js文件,这样可以给用户留下自己扩展的空间。
; N9 @- f/ O$ E, |) @4 W) O2 E3 C# X+ B; a1 I
  • 你的词库中的一个词条只是整个网页中的一部分,深入理解这一点,并且牢牢记住# S. U' \! o, Q- c/ L. P4 S$ h
现在主流的词典软件(欧路词典、GoldenDict)在渲染一个单词时候都是用网页的形式。现在基本上所有用户都会安装多于一本的词典,这些不同的词典中的相同的词条凑成了一个网页,也就是您看到的结果。比如下图是我在Windows上的欧路词典查询frequency后的结果,其中部分词典的结果被我折叠起来了,其中每个红色方框表示一个词典的结果:; O* R+ v4 f6 V  [. `

9 s5 `: E! p7 ?& g& d, T9 l/ g# a: r2 ]' ]
, m+ b: U% F/ U
这里要理解的是,这里每个红色方框不是单独的一个网页,而是整个网页的一部分!理解这一点非常重要,不然你制作的词典可能会有各种各样的问题,比如影响了其他词典的正常显示,或者被其他词典的CSS或者JS所影响。具体在应用中怎样实践对这一点的理解,请继续看下面的内容。1 {6 P4 N- a: Q, D* y

; L8 r  N( _* G. o6 S" }  u) d
% R/ P* P" {: V, g5 D9 h# N/ ^
  • mdx源文件中,每个词条要用单独的一个<div>标签包含起来" c+ h, m9 T  S5 T) {6 ?% e. R
比如在mdx源文件中,有一个词条:
) v: u6 E, n3 I. T2 @2 P% P' Z( _6 ?# ]- `7 M9 i

' d7 c5 q/ S6 S这样写非常不好!我们已经说过,您的词典中的一个词条只是最终整个查询结果网页的一部分。现在您的这个词条虽然有一些div标签有class属性,可以用来添加CSS,但是如果其他的某个词典里面也有<div class="pf">,那么您针对您的词典制作的CSS就会影响其他词典。正确的做法是,把整个词条的所有内容包含在一个div标签内,并且给这个div标签一个很独特,针对您当前制作词典的一个id或者class属性。比如我们可以修改上面的例子,如下:  z* b8 X! k) j& m* M
7 ]& @% z) G5 M
; [, e0 e* E- w: o  `5 B) @* Y

+ m! x( ^$ O& G这个示例中,我们用了<div id="tldimproved">来包住了您的词条的所有内容,这样,在CSS和JS中您可以仅仅针对您的词典内容进行样式的设置,而不会影响其他词典。那具体该怎样设置CSS和JS呢?请继续看。
9 v" p  d/ |7 t( F& F7 I0 R' ]* P3 {! d6 P7 K; a  Y

) z' `% b  K( [0 v6 c- B
  • 正确使用CSS,仅仅对您自己的词条设置样式" d- \8 c! h& u4 D% l/ R) U
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您设置CSS时候必须只针对您自己的词典,这样才不会影响其他词典的显示。有了上一条的包含住整个词条的div标签,这个任务就很好完成了。
3 ~: ^) t* ]" d, w% o# C$ P; J  e, H5 q4 _/ m, s9 Y/ I: H
比如假设您的词条中有一段内容:
/ m5 I! M" O+ \5 i, M: ?* b: [! r
( Y; j6 A9 g: q: w2 m& i. o$ c0 z<div class="gdc">
. ~9 c; A. q4 A9 X& \$ Q        <div class="dcb">
: X$ _1 Y' w4 M            <span class="pos">n.</span>. r, _6 k9 a- b4 |, T) ]# v
            <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>
4 K4 _; @( F+ o        </div>* m6 N7 I0 m- d& F) }5 u
</div>
! p8 k, X# L: D
: B# ?9 ?4 ~5 B7 `5 I2 U$ [  q1 T+ z. t1 v: x
要对这个class="gdc"的div标签设置CSS,你可能会写:
% c8 u$ O8 y2 x! W
; n& q: p: s0 ~/ H( X% a.gdc {...}2 Y* f% H( [7 J
2 ~) }7 Q% O( E. Y6 u
或者
# [3 o% [1 o1 U: ]6 B7 c
; G! Y+ O% \  @  A0 Qdiv.gdc {...}3 g$ a: ^# c) Y- J
0 P4 D5 H9 L5 Z7 f; ?' `. e! i
这两种写法都不好!因为我们已经有了<div id="tldimproved">包含住整个词条的内容,那么正确的写法是:
& p# b. E; ^  F2 y! C% M0 E2 |9 f
8 [8 _9 x( Y3 z8 {% B" `) cdiv#tldimproved .gdc {...}2 p0 p3 \, z, b4 M! _: L
或者
. H$ z8 |: i) E4 Xdiv#tldimproved div.gdc {...}0 j0 a1 `. j6 e& N( ~) q1 `
或者6 e" e' I- r  |3 M- t
div#tldimproved > .gdc {...}/ @: [4 S/ x: F: \0 C! t) L
或者
" L; u" a# Z) _, `div#tldimproved > div.gdc {...}" R- _  @5 o! B

& Z# p: _) n8 t' Z0 l! t这样写的效果是,您指定的CSS只会对<div id="tldimproved">里面的那个css等于gdc的标签生效,而其他词典不可能有一个div叫做tldimproved的,这样也就避免了CSS的冲突。$ l5 U5 z7 ?$ g( ~9 S

) X7 o( R) [* [3 i
6 B7 W* l* K% |* W
  • 正确使用JS,仅仅对您自己的词条内容进行修改
    ! t1 A% y: }3 T. P4 [' J- t
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您编写JS的时候必须只针对您自己的词条,这样才不会影响其他词典的显示。有了包含住整个词条的div标签,这个任务就很好完成了。
, A. R7 P1 V  B* x$ d6 [  B# U0 P通常在JS中,您最终的目标是动态地修改您的词条,不管是修改内容还是修改CSS,反正目标就是修改。修改的第一步是获取要修改的对象,获取的对象如果错了,那么您做的修改可能就应用到了不正确的地方。比如您想给您的词条中的图片加一个三个像素的边框,如果您使用JS不当,那最终结果可能是您修改了所有词典中的图片,都加上了边框。那么怎样正确地获得你要修改的对象呢?我们还以上面的示例代码为例:
5 o$ v1 ^& X2 f: P% T- x/ l0 M- L" Y) F  Z1 ]( L4 d( K( d
<div class="gdc">
3 K+ U0 k! E8 U' D. F( X        <div class="dcb">5 z' s5 \7 {5 G: z7 x* Y/ a
            <span class="pos">n.</span>
. \( ^) r& P0 k5 W0 z            <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>
7 s9 ^7 N8 _* m        </div>2 h7 A/ Z( I) i- Q* q
</div>
8 Q2 b/ D0 g1 l' ]( c& {5 \) E0 b0 O) A1 C8 h" w  B) @, R
正确的方法是:
4 w2 x. U4 x4 U: l9 p6 n1 a+ a
, R  b6 g; n( i: W/ S$ o9 g6 b如果您使用jQuery:
& A' ], P2 v: }# L3 c7 H% t$ w6 y  B7 v$("div#tldimproved div#gdc")
+ M9 _. [0 L( x1 b& J或者
) ?8 ]  A2 b( R  I* O; U0 J4 l$("div#tldimproved > div#gdc"); B! X2 t! b  ~7 j- T' i3 }
或者# O/ B5 o- U" F- e# l7 m
$("div#tldimproved #gdc")8 C: Z+ Q$ x3 M: |" S. B: |
或者4 i! u. t6 i4 [$ I# H! h' d! r5 x
$("div#tldimproved > #gdc")2 t- u6 l' I) ?$ ~5 X0 k

' h1 H5 X. `% {  N' H/ H2 ]" K$ V. Z3 P
如果您使用的是vanilla JavaScript,那么正确的方法是:; _+ L' p# N9 g7 v) J' q6 k0 E
document.getElementById("tldimproved ").getElementById("...")
6 G; j# [$ \- l" Q或者
# D" d, Z- x" Qdocument.getElementsByTagName("body")[0].getElementById("tldimproved").getElementById("..."). p6 ^( ~/ P% B% K4 {! ?' A3 _
或者0 u, U  }% ~# n* B
document.querySelector("div#tldimproved")....1 V" y$ t4 Z6 n
或者
( V) c0 V) ?; ]7 X: Ndocument.querySelectorAll("body")[0].querySelector("div#tldimproved")....
# h( H& B4 r/ r5 G5 K' r等等,因为vanilla JS写起来比较复杂,我仅仅列出了几个常用的函数,大家应该领会我的意思了,就是你不管干嘛,总要表明“我想要获取的是id等于tldimproved下面的内容”,这个思想和上面的关于CSS的写法是完全一样的,目标只有一个,就是您只是修改您自己的内容,而不会影响其他词典!
3 u) i4 I6 x3 W: M4 I* B6 I8 k. s
  • 正确使用CSS reset framework% K) T( ]+ U, p: o: i
现在有很多CSS reset framework,有些人在自己的mdict词库中使用,上来就是:6 W% g+ u( e  M# N% H
* {' Z) ~# g7 _) X  P
  box-sizing: border-box;
$ U' |# _4 n# ~+ Q}4 @  w& f8 @) S4 r; _* K
::before,, @& ?* Q! p. ^. b/ l/ a9 O
::after {
6 P( ]1 O6 r/ P( H; o2 W: ?  box-sizing: inherit;
+ ^7 S8 a9 q  T, W# X}/ E6 J% ]2 X6 r
html {- E  g: l  A. v! \1 n
  line-height: 1.15; /* 1 */
+ }! X4 v; ?* P7 [( H( s& N  -webkit-text-size-adjust: 100%; /* 2 */6 A" n4 `( ]+ l3 x9 r' _
  -webkit-tap-highlight-color: transparent; /* 3*/1 @4 G. Y" z# e4 t, Q, s
}
& W8 X& ?$ N9 N* i7 I7 c8 Fbody {
9 e( ~+ ^* P- ~  margin: 0;
/ B# m2 S- G4 Q: w$ [6 I8 n/ T8 ~/ _}
4 W; a0 j1 l7 f' S' G' w1 rmain {9 V4 [7 X( R  k
  display: block;
0 K- V4 t: O4 f  |7 b}0 [: s# ^) K% R7 y# u! m5 z2 ]4 A
% V9 l# N6 S# A/ o

5 u9 u+ p- T5 v' ~! J% s  R这么做不合适!如果你理解我上面反复强调的内容,你的词条只是最终查询结果网页中的一部分,那么相信你能理解为什么这么做不合适。你的词库只应该设置你自己词条的样式,而上面的CSS修改的所有词条的设置,尤其是box-sizing,这会导致其他大量词典显示不正常。正确的方式是,仅仅修改你自己词典的样式!所以,你可以写成比如像下面这样:1 ^& U- ~1 k# k

5 i0 ^6 a" D. w; B* m. b  K$ e1 j% I: Jdiv#tldimproved * {" t* n7 c2 W9 T
    box-sizing: border-box;
/ h7 s3 j" z. L$ O$ W% F}+ W/ O' t% N1 E! j- f
div#tldimproved ::before,- J+ i4 E5 B% V- z
div#tldimproved ::after {
# Q. \) I* B! K5 @: a' T& E- x    box-sizing: inherit;
# t: x& ~% i" `  K}5 m# Y/ _* @  y2 G
div#tldimproved main {1 ^3 c' @: x0 }  k6 j$ W
    display: block;
0 z7 ?7 |. F7 b$ h; a! I}3 P  N9 `4 W$ R5 ^( a# M' s2 x

/ T. l6 k8 y# g
( q5 \1 `. ^$ x; K: l大家理解我的意思了吧,牢记一点,只修改自己词典的内容,不要影响到其他词典!
9 g& K) O! o" }6 l
, Z1 p/ W% J* q+ t, w7 C* H

本帖子中包含更多资源

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

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 编辑
    ' H  O2 }7 ]* ~! l1 g$ t
    # y! e" p/ o& `- f/ d# W赞成总结一下制作词库应follow的 best practices。$ x/ n% C% N( [; P# s9 G8 D
    8 a4 d* y- c3 L- h3 L2 F* a
    正如楼主所说的,手机上可能必须把很多词库的文件放到一个文件夹里,因此命名不能过于简单,否则可能因名称重复而导致js/css互相干扰。6 X. L9 @8 |( c1 R
    另外,鉴于有The little dict这样的发音词典大全集,所有词典的音频文件都应放在“词典名字.1.mdd”里,用户可根据需要选择是否下载以避免臃肿。同时,css中设置自适应代码,当文件夹中没有“词典名字.1.mdd”时隐去发音图标。! Q9 Z) P" \: L6 R: E
    还有,双解词典应该有中文翻译内容的隐藏功能,要有标注以便可通过js来实现。
    , R  I8 g" g  }/ ~. k- s2 g3 A! ^% Z6 C0 e$ r. k; N
    / X+ X5 q4 e$ i" c, i
  • TA的每日心情

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

    [LV.7]常住居民III

    发表于 2019-4-24 20:21:05 | 显示全部楼层
    cocowind 发表于 2019-4-24 18:44+ t3 i# ?0 z7 D; f. V( e
    赞成总结一下制作词库应follow的 best practices。" }. U& @$ ~6 a( p1 M
    / D4 u0 R" e' \4 K5 z8 i
    正如楼主所说的,手机上可能必须把很多词库的文件放到 ...

    ) |3 }/ r9 |: L; r3 S2 Y+ v在手机 必须把很多词库的文件放到同一个文件夹里,这个到没想过。
  • TA的每日心情

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

    [LV.7]常住居民III

    发表于 2019-4-25 06:01:26 | 显示全部楼层
    " s' M# ?; r7 Q) P! h# o
    经验虽好,但是不可能实行。- q/ ^7 P- N" P& k* z: v+ {% u

    7 \5 b9 }4 b) Q0 C7 n. [1 V现在好多词典基本的 html / css 规范都不能保证,如何保证你这些额外要求。8 i' g. Z* f5 l! e: c
  • TA的每日心情
    开心
    2019-6-23 00:02
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2019-4-25 12:31:22 | 显示全部楼层
    zzzz_sleep 发表于 2019-4-25 06:01
    4 ~) ^, y, M1 Q0 b经验虽好,但是不可能实行。
    2 J# g3 u. e: U! W5 x% t$ L* q! r
    6 a8 S4 `1 j) O* }9 I1 T$ ~现在好多词典基本的 html / css 规范都不能保证,如何保证你这些额外要求。
    1 e" h: v# I. W4 }/ x3 A
    您说的很对,昨天看了一下朗文五加加,标签都没有闭合。这个只能自己修改了,或者自己做词库的时候遵守这些。
    0 c* V2 C& _. j& {) F

    该用户从未签到

    发表于 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属性。
    1 z5 i$ K: ~$ e-------
    % y+ m$ E" Q. R0 X8 C: B" V学了点HTML/css的皮毛,回头看这个贴,觉得楼主说的这一点确实不错。
    ( \! ~( i# ?* c7 ?5 {; `很多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-6-25 05:50 , Processed in 0.025217 second(s), 32 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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