掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 3268|回复: 9

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

[复制链接]
匿名
匿名  发表于 2019-4-24 17:21:38 |阅读模式
本帖最后由 匿名 于 2020-10-9 02:27 编辑 ( a2 u3 }" @- m) [+ n" @5 F7 I

8 Z$ S" j% x  O. l$ E( M/ j
* t+ i& g: W* C+ n4 J! w; n5 S更新历史- W9 r8 K5 K8 @/ y) e+ e  n
- z/ _* o! k9 L5 j
2019.4.24 9:22 PM添加新内容- m% I+ H7 c- a! a6 D; D

  {2 G4 ^# q/ l3 D2019.4.24 5:21 PM, j9 A2 c5 [4 F( i
开始写此文,尚未完成先保存一下- d+ T9 K# |; B: T+ I; n' ~. `
& u, `% g, x0 E' B8 I

' r' `. p6 R# z& R% g8 E; E; R  _前言' M" Y5 H) o4 F6 f  G

# O! P2 }" y* [& ?" y/ ]( ], b) @+ }大家好啊!
" s4 F1 l* h+ T$ }7 `* E
5 K; k5 o" _  |. C. |. q! g最近我自己制作了Macmillan在线词典,也修改了其他几个词典,都已经发出来了。大家也给了很多反馈,绝大多数的问题我也都修复了。这个过程中确实学习到了很多东西,有技术方面的,当然也有和mdict词库紧密相关的。这个帖子就是想分享一下我在制作mdict词库方面的经验,和大家讨论一下。下面的内容仅仅代表我(ogrishman)的一家之言,具体说的对不对,我们一起讨论讨论。然后我们一起完善这个帖子,并且宣传这个帖子,这样大家制作词库的时候都follow best practice,词库的质量一定会得到提高,而且问题还会少很多。下面我就一条一条列出我要说的这些best practices。6 p' i" x- p! y
4 ^% g% D9 z/ H4 p  w
  ^9 o, I* [9 L3 I9 C

# _. }9 c* G$ x* h' Q. `1 ?# O正文% O7 R, H4 f) u- J5 f

! N: P4 b( c8 w; i
  • 词库相关文件的命名要一致,并且清晰全面2 P1 g  }2 O1 a3 b1 i, b2 o
比如我们要制作一个Oxford Advanced Learner's Dictionary第九版的词库,那么相关的文件名可以命名为:1 m, N$ I) L& G# v+ u! ?5 d, c
8 O+ Q+ M* p/ a+ t  K" A# O- O
Oxford Advanced Learner's Dictionary 9th.mdx+ E- y# V* o1 J3 L+ x
Oxford Advanced Learner's Dictionary 9th.mdd
- G8 ~, q3 E8 L' MOxford Advanced Learner's Dictionary 9th.1.mdd& U" I) ?5 Q0 }
Oxford Advanced Learner's Dictionary 9th.js
% @8 M; L- C7 C* b4 WOxford Advanced Learner's Dictionary 9th.css
- T1 {2 x) y/ a/ R
我们要考虑到,某些情况下我们可能必须把很多词库的文件放到一个文件夹里,这时遵守这一点的优点就突显出来了,用户可以一眼看出哪些文件属于哪个词典,而且文件排序一般也会把这些相关文件排在一起。这里要注意,不要用缩写,比如OALD9.mdx,这样不够清晰!
: W, Y" H% A( b2 }, Y' p2 T6 v" c" g

6 Y6 }+ |" q- {( R6 E6 z+ A2 _
  • 每个词典都要提供外置的js文件和css文件供有能力的用户深度定制词典9 R# u0 z! T. R6 T9 q
每个词典最好都有外置的js文件和css文件。css文件基本上现在所有词典都会有,但是我建议,即使你的词库没有用到js,也在你的词条里加入一个外置js文件,这样可以给用户留下自己扩展的空间。
. \' \5 i1 f8 d/ D. i1 ~: H# `8 ^/ W- ]8 j2 s; ~3 H7 T
  • 你的词库中的一个词条只是整个网页中的一部分,深入理解这一点,并且牢牢记住/ B' ~2 s! {: }; U3 G9 M8 V
现在主流的词典软件(欧路词典、GoldenDict)在渲染一个单词时候都是用网页的形式。现在基本上所有用户都会安装多于一本的词典,这些不同的词典中的相同的词条凑成了一个网页,也就是您看到的结果。比如下图是我在Windows上的欧路词典查询frequency后的结果,其中部分词典的结果被我折叠起来了,其中每个红色方框表示一个词典的结果:( i- v6 P1 f0 ?6 P

8 O8 {$ E% b0 e0 k+ S; n5 r0 W) v5 \

; r* g0 l$ m& S+ k( Q4 y这里要理解的是,这里每个红色方框不是单独的一个网页,而是整个网页的一部分!理解这一点非常重要,不然你制作的词典可能会有各种各样的问题,比如影响了其他词典的正常显示,或者被其他词典的CSS或者JS所影响。具体在应用中怎样实践对这一点的理解,请继续看下面的内容。. [4 S/ X2 X5 R$ g4 K7 ]1 v& i/ C

& Y& c" ?0 }- h8 Y9 f4 o9 l2 J9 J  n1 J8 G" N6 I
  • mdx源文件中,每个词条要用单独的一个<div>标签包含起来
    5 M( D# }2 G2 Q
比如在mdx源文件中,有一个词条:
0 I" q9 T# F9 c3 d5 j( R" @4 B! f- D3 A& {) H# ]! \, a
4 g8 b$ t0 K( z! E* Q
这样写非常不好!我们已经说过,您的词典中的一个词条只是最终整个查询结果网页的一部分。现在您的这个词条虽然有一些div标签有class属性,可以用来添加CSS,但是如果其他的某个词典里面也有<div class="pf">,那么您针对您的词典制作的CSS就会影响其他词典。正确的做法是,把整个词条的所有内容包含在一个div标签内,并且给这个div标签一个很独特,针对您当前制作词典的一个id或者class属性。比如我们可以修改上面的例子,如下:. U  j7 }; H) R- h. u  K8 \- C! A( D
; |0 d% w* L/ d; f- c0 L

- |- V! q5 w) ^% ^! u2 b9 Y# B. k
1 q# i/ [4 j- o) T$ U这个示例中,我们用了<div id="tldimproved">来包住了您的词条的所有内容,这样,在CSS和JS中您可以仅仅针对您的词典内容进行样式的设置,而不会影响其他词典。那具体该怎样设置CSS和JS呢?请继续看。% k# A5 v: I5 M7 b' S; _
) u' a8 a5 r; c" g
; R# D* U/ Y; S  E# [
  • 正确使用CSS,仅仅对您自己的词条设置样式
      c/ e8 ]* D. h) e9 P! G7 L
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您设置CSS时候必须只针对您自己的词典,这样才不会影响其他词典的显示。有了上一条的包含住整个词条的div标签,这个任务就很好完成了。
  I# r6 V5 a# x/ L
5 O( j1 b9 E" G) b3 y, A/ }比如假设您的词条中有一段内容:
3 i9 ^+ }/ X+ x& d! Q6 L5 u4 j: V( ?% x0 |
<div class="gdc">
/ w7 t5 O& C& }' t) i) c        <div class="dcb">: T8 x  u' U* E! {, }! w7 ]
            <span class="pos">n.</span>% S% T% B3 J/ H  m, f" D
            <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>" O. a* _3 [  k5 w
        </div>
, n2 j2 `: F' {" ]: k</div>
0 m. \" t, q" e* @5 y5 D  |: e
2 {# |- p3 X$ r. E0 n# _, c
2 u  r# w$ \& j要对这个class="gdc"的div标签设置CSS,你可能会写:. g! ?4 x# p4 C# o* A1 M  m# |

. r" P( _0 H+ h0 y.gdc {...}
& ^2 G4 q" I4 L6 W. ~) b2 M( O& `6 H: G, F! C' `/ r+ f/ N
或者6 T3 t: ~, Z% \' A; q! i9 Y" c

8 \, o$ j3 w8 n9 Adiv.gdc {...}
+ \, c( Q) c3 L
4 ]* s5 `/ N* `4 {2 k这两种写法都不好!因为我们已经有了<div id="tldimproved">包含住整个词条的内容,那么正确的写法是:
7 [( D" l/ ]4 y9 R/ W# |5 V
5 Y1 O  T% K0 c* w  Odiv#tldimproved .gdc {...}) s" j+ ]! H$ B. J6 h
或者# f+ o+ k1 m; d0 \1 h, {
div#tldimproved div.gdc {...}$ k9 k) h5 F5 B0 M5 r
或者
. p6 _+ @5 i% j  v  xdiv#tldimproved > .gdc {...}
4 F' i& H' p% e/ T$ v+ r, }或者+ c8 v$ s, x2 K- c
div#tldimproved > div.gdc {...}
, d3 _3 S$ q! y8 |
' d, {9 e+ R# U% o5 n这样写的效果是,您指定的CSS只会对<div id="tldimproved">里面的那个css等于gdc的标签生效,而其他词典不可能有一个div叫做tldimproved的,这样也就避免了CSS的冲突。
/ r) h( I% H$ k9 Y5 L) Z" }* }
" y$ z+ S0 B  B
: o! ]/ [8 L) J0 I) E' A
  • 正确使用JS,仅仅对您自己的词条内容进行修改
    7 f( M( M, N4 M
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您编写JS的时候必须只针对您自己的词条,这样才不会影响其他词典的显示。有了包含住整个词条的div标签,这个任务就很好完成了。5 [2 \; P6 j! o
通常在JS中,您最终的目标是动态地修改您的词条,不管是修改内容还是修改CSS,反正目标就是修改。修改的第一步是获取要修改的对象,获取的对象如果错了,那么您做的修改可能就应用到了不正确的地方。比如您想给您的词条中的图片加一个三个像素的边框,如果您使用JS不当,那最终结果可能是您修改了所有词典中的图片,都加上了边框。那么怎样正确地获得你要修改的对象呢?我们还以上面的示例代码为例:# U) Y$ `& \' ?" @6 n: r1 L

/ F# N4 ]6 a5 E: _1 \<div class="gdc">! n) \  {8 T4 {
        <div class="dcb">* ~* P" E! {$ u2 ~8 d% w
            <span class="pos">n.</span>; ~2 y8 t2 f0 {
            <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>5 u9 K" t# t! c9 L( }
        </div>
' z. P' |) ?1 [  ^, v</div>8 u1 g$ Y1 ~7 n7 k: l. i
7 I6 n0 c! ~+ h. O" g, f
正确的方法是:+ T2 w6 s1 g% ~
" S! B* `! J  `; @$ c  `
如果您使用jQuery:1 n$ G' N, c5 y
$("div#tldimproved div#gdc")
6 K9 w/ O% j7 @4 ]或者
4 `2 F) \) \( T  c4 d* ^! A$("div#tldimproved > div#gdc"); {$ i3 S$ f# O, H8 x; e2 [9 g
或者
  Z( S- ?8 |  z6 T/ t; D2 a$("div#tldimproved #gdc"), X! I+ R6 Q) g" k% F
或者* }1 K) l0 @$ I6 i! M
$("div#tldimproved > #gdc")
) E. m* Z* r7 G+ g
. I: T7 C+ W  s7 c/ I1 m; d; K
; t- i9 j+ j% Q1 b! A如果您使用的是vanilla JavaScript,那么正确的方法是:
9 ^& O1 e0 I$ D3 kdocument.getElementById("tldimproved ").getElementById("...")' B' e0 F/ Y# }! F2 D( \# q$ D+ s
或者% c5 t4 o, r4 C- N( ~
document.getElementsByTagName("body")[0].getElementById("tldimproved").getElementById("...")! k+ H1 ~: ]- f; [
或者
/ l$ J. y  k6 M2 Jdocument.querySelector("div#tldimproved")....
0 w$ O6 `6 f8 ~4 K3 {3 [或者
3 Y. A) F8 z# [$ Pdocument.querySelectorAll("body")[0].querySelector("div#tldimproved")....7 W/ o: N# \$ M9 F, Y" V' A0 h
等等,因为vanilla JS写起来比较复杂,我仅仅列出了几个常用的函数,大家应该领会我的意思了,就是你不管干嘛,总要表明“我想要获取的是id等于tldimproved下面的内容”,这个思想和上面的关于CSS的写法是完全一样的,目标只有一个,就是您只是修改您自己的内容,而不会影响其他词典!
: _' t3 m' }: u0 f; I
2 Y3 e2 `3 H6 W7 e% d- q; C6 J
  • 正确使用CSS reset framework
    % Y$ N1 S6 e5 ^& D9 B6 B, L. v: a9 g
现在有很多CSS reset framework,有些人在自己的mdict词库中使用,上来就是:, \* b& F9 B  C" v# b% x
* {) x& ], H( O! R5 ~/ C
  box-sizing: border-box;
1 r; o" Y; p# K  F5 U  V}0 e( J3 u! U' Q6 X5 \/ H
::before,
! a) j/ m. Y/ W* v" H+ k% Z' [7 X) t2 Q# ]+ y::after {
; b! x0 t1 X- u- J; \1 G7 p+ Q  box-sizing: inherit;+ b$ m/ U8 g- l+ k" W
}& y. @7 g, j* n/ a5 F1 M
html {+ B5 \0 o# G( @4 x) U( \
  line-height: 1.15; /* 1 */
7 \  p( q  r0 z: ~  -webkit-text-size-adjust: 100%; /* 2 */
. p: p4 {( F. W; }" f2 z- v  -webkit-tap-highlight-color: transparent; /* 3*/) Z- o" l- w. e+ z
}* {  o3 S  |$ T) c
body {$ D9 g2 s) r8 K4 x5 L9 I+ Z
  margin: 0;
; s! u# Y, A# a  I2 d% Y$ m0 L}
) G! Q% p3 k; e/ t7 {% \main {! d1 t* f# j+ j
  display: block;
" Y* B: q: i. [* i; M2 T}) X, k6 {7 `+ y2 L
( w2 g# f( \9 ^1 Y- d
+ ]* T  p$ L, ^
这么做不合适!如果你理解我上面反复强调的内容,你的词条只是最终查询结果网页中的一部分,那么相信你能理解为什么这么做不合适。你的词库只应该设置你自己词条的样式,而上面的CSS修改的所有词条的设置,尤其是box-sizing,这会导致其他大量词典显示不正常。正确的方式是,仅仅修改你自己词典的样式!所以,你可以写成比如像下面这样:* U' t% @0 ~6 Z1 @6 m
7 ]; c) B+ K) _/ y! W
div#tldimproved * {/ k, W( t! E: R$ D1 W% B, ]
    box-sizing: border-box;/ W- ^% K8 K- k# O% D
}4 d2 v6 O. I- }! j* o: j+ \+ C# d
div#tldimproved ::before,7 ]9 G0 [' S9 ^4 s/ X
div#tldimproved ::after {
/ X* E3 j7 n) e; o. B    box-sizing: inherit;
7 }4 J9 w9 e+ @5 [( I}
- s  s  g  c) s* q7 {div#tldimproved main {9 C2 M. \% N1 e1 {4 W, h
    display: block;
" R' X8 _0 V% V5 U# ~1 S2 I}$ r, x' z: m) c8 F

. |0 Q6 g4 @3 x9 L: ]. F- @7 n- G; a6 B
大家理解我的意思了吧,牢记一点,只修改自己词典的内容,不要影响到其他词典!  M7 N% m; a/ V3 y8 @8 O
* [( k2 s8 b7 `3 S% Q

本帖子中包含更多资源

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

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 编辑 3 v6 ^( E3 b: ?, ?

    % s) F' h" n3 C赞成总结一下制作词库应follow的 best practices。+ E8 b9 k! A# m" o0 ~! g1 d; }
    $ q1 {, r5 @. e! q5 f4 }
    正如楼主所说的,手机上可能必须把很多词库的文件放到一个文件夹里,因此命名不能过于简单,否则可能因名称重复而导致js/css互相干扰。9 o* {: i6 S9 M5 q; v
    另外,鉴于有The little dict这样的发音词典大全集,所有词典的音频文件都应放在“词典名字.1.mdd”里,用户可根据需要选择是否下载以避免臃肿。同时,css中设置自适应代码,当文件夹中没有“词典名字.1.mdd”时隐去发音图标。9 U' _' S+ @+ H7 J; O- t
    还有,双解词典应该有中文翻译内容的隐藏功能,要有标注以便可通过js来实现。
    2 m6 r! i+ M3 ~& O- v( m0 a5 I' P6 N  Q4 |  W; C5 X

    4 \& ?' ?3 _3 n; p! t# v; [
  • TA的每日心情

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

    [LV.7]常住居民III

    发表于 2019-4-24 20:21:05 | 显示全部楼层
    cocowind 发表于 2019-4-24 18:44
    7 p6 r6 ]  G; K/ |赞成总结一下制作词库应follow的 best practices。
    ' r9 ?; C: V$ d6 y/ T
    + W+ e4 C5 L0 `  V- M1 X5 b7 e正如楼主所说的,手机上可能必须把很多词库的文件放到 ...

    4 [$ P6 p# f9 i% a4 Y# t在手机 必须把很多词库的文件放到同一个文件夹里,这个到没想过。
  • TA的每日心情

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

    [LV.7]常住居民III

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

    * g3 D# B, ~1 [$ m/ r& a/ y2 P8 s经验虽好,但是不可能实行。/ X$ {' T& s: o2 o3 }9 K

    % i/ F) T8 B9 ~7 a% T0 a- m现在好多词典基本的 html / css 规范都不能保证,如何保证你这些额外要求。# {( s( R" a6 H5 I
  • TA的每日心情
    开心
    2019-6-23 00:02
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2019-4-25 12:31:22 | 显示全部楼层
    zzzz_sleep 发表于 2019-4-25 06:01
    6 V  q" a/ _5 h# L2 T5 |; g+ T; X: b3 b经验虽好,但是不可能实行。
    ) T( T6 M3 [6 P% [3 y2 V' s% L) a, ]# B+ U
    现在好多词典基本的 html / css 规范都不能保证,如何保证你这些额外要求。

      L7 H  }( F2 G+ U您说的很对,昨天看了一下朗文五加加,标签都没有闭合。这个只能自己修改了,或者自己做词库的时候遵守这些。* o7 K. j: `( Q$ S5 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属性。+ w; v6 H6 w8 u. A8 y  H
    -------3 I- q7 }& y& P# V% I) y2 I* X
    学了点HTML/css的皮毛,回头看这个贴,觉得楼主说的这一点确实不错。5 I$ X. k3 F4 @9 O4 r
    很多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, 2025-5-17 17:54 , Processed in 0.023841 second(s), 26 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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