掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 2438|回复: 9

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

[复制链接]
匿名
匿名  发表于 2019-4-24 17:21:38 |阅读模式
本帖最后由 匿名 于 2020-10-9 02:27 编辑
1 l1 p9 b) G1 n* N2 w& R( U  j6 b. c. H# S# L8 N( Z

: K# M) J6 H( n更新历史
3 G% V/ p2 h7 S) F9 r
# {: K2 L3 n. X2019.4.24 9:22 PM添加新内容) }/ l  F: o( C0 Q5 }5 M

0 k: k$ `' m3 c2019.4.24 5:21 PM9 V7 Y2 a/ @  ~/ J
开始写此文,尚未完成先保存一下
$ M( q' I3 a( x
. j! `8 O( ]& M- N" m
; `+ b) W% x6 V- `# _5 q6 C前言
! e# }! u5 `- n) N) `& e( [* O4 X( }3 g, H% i& |, E) G5 B) |
大家好啊!) f" m. F/ B0 _) ]3 Y, ^

! l1 w6 H8 V- E8 G# M4 K0 b7 ?最近我自己制作了Macmillan在线词典,也修改了其他几个词典,都已经发出来了。大家也给了很多反馈,绝大多数的问题我也都修复了。这个过程中确实学习到了很多东西,有技术方面的,当然也有和mdict词库紧密相关的。这个帖子就是想分享一下我在制作mdict词库方面的经验,和大家讨论一下。下面的内容仅仅代表我(ogrishman)的一家之言,具体说的对不对,我们一起讨论讨论。然后我们一起完善这个帖子,并且宣传这个帖子,这样大家制作词库的时候都follow best practice,词库的质量一定会得到提高,而且问题还会少很多。下面我就一条一条列出我要说的这些best practices。
  k: @- F% |1 m% ?5 i; M$ v( q7 Z& \

7 w( E$ Q$ |& a$ U# c8 ]2 {: F  V. h  @
正文) ~3 [3 P( @7 e+ i! o6 h
! B9 @7 h1 U' w
  • 词库相关文件的命名要一致,并且清晰全面, R2 u; ~( i( a& j# |# N
比如我们要制作一个Oxford Advanced Learner's Dictionary第九版的词库,那么相关的文件名可以命名为:& z7 w  c9 |% x$ ?  X

8 b$ }# g4 c4 M  u5 |' }
Oxford Advanced Learner's Dictionary 9th.mdx# T1 u) z; G  [/ `1 y% r
Oxford Advanced Learner's Dictionary 9th.mdd
* e6 C% s6 V5 k- `" s: ~' ?/ \Oxford Advanced Learner's Dictionary 9th.1.mdd
+ A1 x1 K' f! E9 _! W! @, HOxford Advanced Learner's Dictionary 9th.js+ |/ j& _2 ?3 ^, z
Oxford Advanced Learner's Dictionary 9th.css

6 v' R$ A' [. {% Q2 k. N9 b. n( O4 I6 u我们要考虑到,某些情况下我们可能必须把很多词库的文件放到一个文件夹里,这时遵守这一点的优点就突显出来了,用户可以一眼看出哪些文件属于哪个词典,而且文件排序一般也会把这些相关文件排在一起。这里要注意,不要用缩写,比如OALD9.mdx,这样不够清晰!
" Y# q5 F" I# u8 |2 A' O9 t$ w" e5 L. A8 U: u# u, I2 E
3 h% C" Y0 s$ J. y& g
  • 每个词典都要提供外置的js文件和css文件供有能力的用户深度定制词典
    - Y6 I; N4 |! J5 j8 N
每个词典最好都有外置的js文件和css文件。css文件基本上现在所有词典都会有,但是我建议,即使你的词库没有用到js,也在你的词条里加入一个外置js文件,这样可以给用户留下自己扩展的空间。
9 ~( J8 T% B' Q, i, l
. I! Y& m  B5 l4 h% A, j
  • 你的词库中的一个词条只是整个网页中的一部分,深入理解这一点,并且牢牢记住
    5 ]4 ^$ W* \2 O! `7 t
现在主流的词典软件(欧路词典、GoldenDict)在渲染一个单词时候都是用网页的形式。现在基本上所有用户都会安装多于一本的词典,这些不同的词典中的相同的词条凑成了一个网页,也就是您看到的结果。比如下图是我在Windows上的欧路词典查询frequency后的结果,其中部分词典的结果被我折叠起来了,其中每个红色方框表示一个词典的结果:
7 c2 L, u: u! f" a+ P6 G$ S' s9 ^- j5 H$ M
3 V$ b, C  ]. ?

# f/ Q, ?% ~( @1 T- m* B9 _这里要理解的是,这里每个红色方框不是单独的一个网页,而是整个网页的一部分!理解这一点非常重要,不然你制作的词典可能会有各种各样的问题,比如影响了其他词典的正常显示,或者被其他词典的CSS或者JS所影响。具体在应用中怎样实践对这一点的理解,请继续看下面的内容。
8 m" ^3 v, S' @$ H1 J* J- |9 y
" ?$ O( J5 Z- o1 ]- V
  r( n. L! l  }$ y; J
  • mdx源文件中,每个词条要用单独的一个<div>标签包含起来
    # i' ]' _% Q7 _; ~4 G
比如在mdx源文件中,有一个词条:( x/ T3 s6 T) q* y+ X7 W9 h  }0 b
0 u: E& u) [. [7 M

$ I+ {+ |' X# J3 v) ^这样写非常不好!我们已经说过,您的词典中的一个词条只是最终整个查询结果网页的一部分。现在您的这个词条虽然有一些div标签有class属性,可以用来添加CSS,但是如果其他的某个词典里面也有<div class="pf">,那么您针对您的词典制作的CSS就会影响其他词典。正确的做法是,把整个词条的所有内容包含在一个div标签内,并且给这个div标签一个很独特,针对您当前制作词典的一个id或者class属性。比如我们可以修改上面的例子,如下:
1 t) E( w4 n+ X* A
# k: n$ N  q' i" @3 j" U0 N" I; s7 `  A2 P& ]5 r

. m0 o4 U" \# O! q# i$ I这个示例中,我们用了<div id="tldimproved">来包住了您的词条的所有内容,这样,在CSS和JS中您可以仅仅针对您的词典内容进行样式的设置,而不会影响其他词典。那具体该怎样设置CSS和JS呢?请继续看。7 }1 J3 I/ H( \

" M4 J# a. S7 L& j. G4 j# c% p0 n& K, W3 h; b: E! h2 D$ Z
  • 正确使用CSS,仅仅对您自己的词条设置样式; C, o$ O, [. o( d4 A- {1 ~
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您设置CSS时候必须只针对您自己的词典,这样才不会影响其他词典的显示。有了上一条的包含住整个词条的div标签,这个任务就很好完成了。
7 T! H0 A8 q& Z" J* r3 h4 y. G$ _& ~+ ~! E; l
比如假设您的词条中有一段内容:% Q- N: U. Q3 r& i6 p
8 b# t5 K8 B) k+ z9 w, Q
<div class="gdc">: D! C0 q  l, m% Y
        <div class="dcb">( J% L  m; |% E: ~9 i
            <span class="pos">n.</span>  b! J8 r# J5 x( F% p5 m5 N
            <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>5 a5 q) @) ^) u0 ?2 ]
        </div>
  H! u+ M1 O7 x$ c1 j</div>
- ~: G/ X: e5 A; d) b- @5 A0 @% r) i/ l3 F4 Z3 `
* B, c: ]7 a* X% I5 ~- p3 H; m" b
要对这个class="gdc"的div标签设置CSS,你可能会写:" y; l7 W5 E$ [4 P" a$ |( c2 s  E
; G& L3 C, H2 [4 o
.gdc {...}0 z+ S1 m! Z; o! w2 [3 O% g

4 W- E3 [( n4 v$ q或者0 }$ q( Z* R. e# s& }) d/ m
" n! w6 |, V. [+ V
div.gdc {...}" u, l; n! L' u& F9 m

: T1 |- l# h% `" A* ^( y6 q0 I这两种写法都不好!因为我们已经有了<div id="tldimproved">包含住整个词条的内容,那么正确的写法是:
2 U3 @4 o6 f9 M2 e2 k8 b5 K
4 g: g  p% V; o$ X- `- Q) f( [' vdiv#tldimproved .gdc {...}
4 a( S& g. E% v  q/ o* _2 i或者
3 W2 \& p, C5 Y+ v2 Ndiv#tldimproved div.gdc {...}, [$ M1 r) V; E0 i
或者
! z2 X* t6 X4 G+ ~% L; m+ Sdiv#tldimproved > .gdc {...}
+ v  z8 l2 q5 U4 x) ~6 \3 G或者5 m8 s6 l$ u+ m: U$ c
div#tldimproved > div.gdc {...}) b* i/ @+ k+ h' U( L9 u9 p

; w( L: x( x% H6 i这样写的效果是,您指定的CSS只会对<div id="tldimproved">里面的那个css等于gdc的标签生效,而其他词典不可能有一个div叫做tldimproved的,这样也就避免了CSS的冲突。
5 Q3 ^% }/ z  f5 b5 d! f
+ O7 w2 Z: M% z- m! z
) O+ K  F" D0 W
  • 正确使用JS,仅仅对您自己的词条内容进行修改
    + ~# m, K( n9 g" p/ w8 q# n  }. T
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您编写JS的时候必须只针对您自己的词条,这样才不会影响其他词典的显示。有了包含住整个词条的div标签,这个任务就很好完成了。( A8 e4 g: C3 V5 ^8 E* K, @+ O  I6 A
通常在JS中,您最终的目标是动态地修改您的词条,不管是修改内容还是修改CSS,反正目标就是修改。修改的第一步是获取要修改的对象,获取的对象如果错了,那么您做的修改可能就应用到了不正确的地方。比如您想给您的词条中的图片加一个三个像素的边框,如果您使用JS不当,那最终结果可能是您修改了所有词典中的图片,都加上了边框。那么怎样正确地获得你要修改的对象呢?我们还以上面的示例代码为例:
- x9 Y8 W8 G" q5 p; f. ~
' U" j0 q! o0 s9 E1 Y6 y<div class="gdc">
. e0 \2 P1 g6 q9 b1 a        <div class="dcb">
& H7 g6 e8 ]- Y. G# O            <span class="pos">n.</span>( q; f$ H2 {6 E5 }: l# p% c# F% O
            <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>
: b  w1 W3 E! D        </div>/ Q' v' Z; o) o
</div>
( r% H; V: v- p/ Z+ E: S" M# p7 @; y9 f
正确的方法是:& W/ T# v& I4 m

" {; Y. n$ R* w+ o如果您使用jQuery:
( _; v* `0 a2 z6 w$("div#tldimproved div#gdc")
: x3 F, J5 A/ \& [( r或者+ }; k0 Z# q$ w, I' V# C4 x7 Q# q. ~
$("div#tldimproved > div#gdc")
6 [2 k: e, f' B$ D" c' o: T& G  @或者
5 P" @7 `4 e$ \4 Y/ X* D$("div#tldimproved #gdc")9 Y  H0 O  n& x' X/ R
或者. N( s/ g; c: n4 a' h
$("div#tldimproved > #gdc")! X" }& g$ l" N( U& K0 V
( w3 ~" b6 z$ I( ]) m/ X6 d
* A3 d$ u) Z  v4 _
如果您使用的是vanilla JavaScript,那么正确的方法是:
+ d" c% C! H/ E. ~document.getElementById("tldimproved ").getElementById("...")
2 v9 d1 P' |) h% \或者
# q- h) R" B0 b, L3 Y0 {document.getElementsByTagName("body")[0].getElementById("tldimproved").getElementById("...")  V( U5 e8 ]+ e( C' d3 M6 ]
或者
7 x0 R' y2 x6 }. s$ Rdocument.querySelector("div#tldimproved")....
* o/ t$ M& T  J或者* K; _6 Z& f7 n+ i/ J
document.querySelectorAll("body")[0].querySelector("div#tldimproved")....
4 K( ]4 w7 @$ k1 z( d+ c等等,因为vanilla JS写起来比较复杂,我仅仅列出了几个常用的函数,大家应该领会我的意思了,就是你不管干嘛,总要表明“我想要获取的是id等于tldimproved下面的内容”,这个思想和上面的关于CSS的写法是完全一样的,目标只有一个,就是您只是修改您自己的内容,而不会影响其他词典!, `5 Q5 ?) s/ @( |3 f
) n, h& U) ]; S( U) l/ M
  • 正确使用CSS reset framework; j: {9 d, o3 f7 ]0 m+ Z
现在有很多CSS reset framework,有些人在自己的mdict词库中使用,上来就是:5 B" [  a0 ~* O- q; G: x
* {9 E0 O5 ]5 \+ O' l. g
  box-sizing: border-box;
" ]7 c* }* _& n3 }, b7 J}
9 q6 ^" s& U: s::before,
3 k/ D+ Y2 I5 w0 A::after {
7 F/ n. R' l& e; i# a, }% d6 Y  box-sizing: inherit;  C* K% r3 L9 i2 |* m2 B% @* P" j
}. V) ~3 f! Z4 h  K
html {& Z8 X, v$ w8 |/ a+ ^! w; D) M# r/ Z" N
  line-height: 1.15; /* 1 */% t" M, s" e& z
  -webkit-text-size-adjust: 100%; /* 2 */- ~- k$ H' k' n$ j; M3 O
  -webkit-tap-highlight-color: transparent; /* 3*/. U5 ?; a2 T  S( J
}
. E2 l5 d) c  ]6 gbody {
2 b$ s3 H) t" n7 P  margin: 0;
5 v# L" u" A3 L  N9 }4 b% W- v1 M}
- V- z) N2 B) [: Emain {! V. m: v4 t% {% u" W. X. F9 s2 W- B
  display: block;$ j" g' H& S8 l3 Z, z. \
}) b2 U1 k) {- L* B7 o6 D
1 m# G. L2 Q4 ?" q# X
% r& R1 {; X, b7 J3 _, E6 H
这么做不合适!如果你理解我上面反复强调的内容,你的词条只是最终查询结果网页中的一部分,那么相信你能理解为什么这么做不合适。你的词库只应该设置你自己词条的样式,而上面的CSS修改的所有词条的设置,尤其是box-sizing,这会导致其他大量词典显示不正常。正确的方式是,仅仅修改你自己词典的样式!所以,你可以写成比如像下面这样:3 A2 b! n* K9 l0 E: F; K* q9 C" i: n
4 K$ p8 y- Q6 y+ v2 k
div#tldimproved * {9 ~/ e% P0 h' i7 {1 S
    box-sizing: border-box;) Y( s% k* C% C
}: ?% k, x+ \/ C$ M
div#tldimproved ::before,
1 L$ j# h4 Q9 I4 fdiv#tldimproved ::after {. y3 y4 K" t8 I* J9 ?! z1 F; J
    box-sizing: inherit;6 L/ D" u1 m$ r9 L) Y( I# t% q) s
}: U2 L, W, n2 L+ e
div#tldimproved main {
2 X9 g% l& K$ G# k9 `4 h1 l/ K' _8 s; M    display: block;/ S7 l" a6 e. Z5 D: {+ h: A
}- r, G$ h7 V; u: p$ E+ @

. W& @- C( [$ _+ a6 k4 B3 q! J
9 ]; m- s$ h' r' A$ O. B+ I& d9 d大家理解我的意思了吧,牢记一点,只修改自己词典的内容,不要影响到其他词典!
: x( f& n7 L' {& b: x1 R4 W) \3 w1 J1 I& M( v! f4 M' F

本帖子中包含更多资源

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

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 编辑
    2 @0 V( W: N$ Y- ]7 }6 v
    & J7 s0 r$ u6 I  N9 I2 T赞成总结一下制作词库应follow的 best practices。
    - C6 k) [' K- I2 Q# u
    , P9 B& p) }: ~9 C正如楼主所说的,手机上可能必须把很多词库的文件放到一个文件夹里,因此命名不能过于简单,否则可能因名称重复而导致js/css互相干扰。
    " j8 E" n3 i( j  L另外,鉴于有The little dict这样的发音词典大全集,所有词典的音频文件都应放在“词典名字.1.mdd”里,用户可根据需要选择是否下载以避免臃肿。同时,css中设置自适应代码,当文件夹中没有“词典名字.1.mdd”时隐去发音图标。" b. m: M/ M" e# l' N, {# O
    还有,双解词典应该有中文翻译内容的隐藏功能,要有标注以便可通过js来实现。; N1 R! ^* V; ]! [
    8 [6 l9 I2 s- v; ?& ?+ v  \* v- M. x
    ; w% t7 X4 D8 \8 _! e
  • TA的每日心情

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

    [LV.7]常住居民III

    发表于 2019-4-24 20:21:05 | 显示全部楼层
    cocowind 发表于 2019-4-24 18:442 N! G9 ^) P9 Q4 G; I% E
    赞成总结一下制作词库应follow的 best practices。" S. s: {. ^4 w
    7 @0 g1 ~& b. F+ ~( J( I! w8 B
    正如楼主所说的,手机上可能必须把很多词库的文件放到 ...
    3 f1 L% p/ f1 Y
    在手机 必须把很多词库的文件放到同一个文件夹里,这个到没想过。
  • TA的每日心情

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

    [LV.7]常住居民III

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

    + j4 L6 v  M7 T经验虽好,但是不可能实行。
    ! X2 ?$ m0 \& o6 \. x& H. f0 {9 f$ R6 ^% q
    现在好多词典基本的 html / css 规范都不能保证,如何保证你这些额外要求。, R, e4 a/ w3 Q
  • TA的每日心情
    开心
    2019-6-23 00:02
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2019-4-25 12:31:22 | 显示全部楼层
    zzzz_sleep 发表于 2019-4-25 06:01! g% o6 n; v3 ?) {4 s5 o
    经验虽好,但是不可能实行。" `$ T+ x" N! ]0 U7 Z: Q
    ) p/ H4 j1 |' d. m* K3 H* z
    现在好多词典基本的 html / css 规范都不能保证,如何保证你这些额外要求。
      O5 U  t; ?2 Z; o$ g. |
    您说的很对,昨天看了一下朗文五加加,标签都没有闭合。这个只能自己修改了,或者自己做词库的时候遵守这些。
    ) V' ]" y( V/ ^: z3 m0 z( ~6 p+ Z

    该用户从未签到

    发表于 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 Y% f) r6 K! h& H4 \-------
    ; g: l9 _- y' h6 ^& G学了点HTML/css的皮毛,回头看这个贴,觉得楼主说的这一点确实不错。  {( w& A, `6 s
    很多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-29 20:17 , Processed in 0.077825 second(s), 11 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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