掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 2454|回复: 9

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

[复制链接]
匿名
匿名  发表于 2019-4-24 17:21:38 |阅读模式
本帖最后由 匿名 于 2020-10-9 02:27 编辑 ' i: D1 u* }1 \& N$ T

/ o0 n; P9 n6 q
0 J, e  u7 o4 x% K) B0 a9 R$ T更新历史; I) ]3 V% I' b: T
$ c5 l" b9 m% T! I& X0 k
2019.4.24 9:22 PM添加新内容
. v( s# G# Y9 H; E; E4 m
; v9 o7 @0 [0 N0 Y7 k2019.4.24 5:21 PM
/ c( j+ \7 k' `) \9 M! H9 J4 ~开始写此文,尚未完成先保存一下
7 ]4 H% v% n6 E: x: U# \7 v8 I- ]5 Q. ?, p0 Y, B* |. W
2 F# j$ h; f' i# @
前言3 S3 {9 {- a; R2 P; _0 w+ g8 a
! O% N$ B* w& u! y
大家好啊!' M0 S( Y1 n3 d' U" r
3 E) P7 u, j4 `
最近我自己制作了Macmillan在线词典,也修改了其他几个词典,都已经发出来了。大家也给了很多反馈,绝大多数的问题我也都修复了。这个过程中确实学习到了很多东西,有技术方面的,当然也有和mdict词库紧密相关的。这个帖子就是想分享一下我在制作mdict词库方面的经验,和大家讨论一下。下面的内容仅仅代表我(ogrishman)的一家之言,具体说的对不对,我们一起讨论讨论。然后我们一起完善这个帖子,并且宣传这个帖子,这样大家制作词库的时候都follow best practice,词库的质量一定会得到提高,而且问题还会少很多。下面我就一条一条列出我要说的这些best practices。
. g0 X8 N  @; P' v9 g- e7 {6 f
- v' N& K3 c5 R: j7 ?7 m/ S/ J# L' X( v) a$ W! u

2 _3 A" a) d( W2 q正文
4 `. E2 Z8 f' c: d/ I2 L' B+ l% ^
  • 词库相关文件的命名要一致,并且清晰全面( R" l* q% V% W' s) B) x
比如我们要制作一个Oxford Advanced Learner's Dictionary第九版的词库,那么相关的文件名可以命名为:$ N7 k+ u8 D3 N! C" h1 s1 X2 H
" s1 ?! g" N# J, V9 K3 z1 E
Oxford Advanced Learner's Dictionary 9th.mdx
/ r5 y, v6 X7 U* i. HOxford Advanced Learner's Dictionary 9th.mdd
7 _: s; b0 n% ~* ?7 F- IOxford Advanced Learner's Dictionary 9th.1.mdd2 ]6 a& k$ H' v' n
Oxford Advanced Learner's Dictionary 9th.js& ]0 `, o: m8 C
Oxford Advanced Learner's Dictionary 9th.css

. b3 D# P6 r; o/ L我们要考虑到,某些情况下我们可能必须把很多词库的文件放到一个文件夹里,这时遵守这一点的优点就突显出来了,用户可以一眼看出哪些文件属于哪个词典,而且文件排序一般也会把这些相关文件排在一起。这里要注意,不要用缩写,比如OALD9.mdx,这样不够清晰!! i4 L$ A8 I, n2 V! Z7 O9 S8 a

# d4 E1 c  \4 ]  r
8 @/ D5 b) J6 L0 @5 |' C9 R7 G
  • 每个词典都要提供外置的js文件和css文件供有能力的用户深度定制词典
    6 I- u' f: g. w5 u6 g, R9 \1 z/ K
每个词典最好都有外置的js文件和css文件。css文件基本上现在所有词典都会有,但是我建议,即使你的词库没有用到js,也在你的词条里加入一个外置js文件,这样可以给用户留下自己扩展的空间。" U* q" U% E& n- H

$ v8 H5 R1 N1 H( v$ W
  • 你的词库中的一个词条只是整个网页中的一部分,深入理解这一点,并且牢牢记住
    9 n3 I' ~# t. K" a4 t& D/ m% v0 A
现在主流的词典软件(欧路词典、GoldenDict)在渲染一个单词时候都是用网页的形式。现在基本上所有用户都会安装多于一本的词典,这些不同的词典中的相同的词条凑成了一个网页,也就是您看到的结果。比如下图是我在Windows上的欧路词典查询frequency后的结果,其中部分词典的结果被我折叠起来了,其中每个红色方框表示一个词典的结果:/ w% w% n% E+ G% f) p  G3 \$ H
4 q( j; ]* e/ `) Y& m

/ u7 x3 o- X1 R
' f! D' g, I8 x3 s, i这里要理解的是,这里每个红色方框不是单独的一个网页,而是整个网页的一部分!理解这一点非常重要,不然你制作的词典可能会有各种各样的问题,比如影响了其他词典的正常显示,或者被其他词典的CSS或者JS所影响。具体在应用中怎样实践对这一点的理解,请继续看下面的内容。
& E+ ~  _$ p1 B2 l3 Q2 `
' d, T  ~  B+ d4 D2 l& U6 l$ V( o* i  m' `" T1 |
  • mdx源文件中,每个词条要用单独的一个<div>标签包含起来8 `) Q; R6 T7 i, c! y% i" A# ~
比如在mdx源文件中,有一个词条:
2 W% I6 m* R7 _5 |3 @) e% X" k
* G/ w' @! @5 z, k- W$ E. p1 b) Q4 j/ D% e7 A9 w
这样写非常不好!我们已经说过,您的词典中的一个词条只是最终整个查询结果网页的一部分。现在您的这个词条虽然有一些div标签有class属性,可以用来添加CSS,但是如果其他的某个词典里面也有<div class="pf">,那么您针对您的词典制作的CSS就会影响其他词典。正确的做法是,把整个词条的所有内容包含在一个div标签内,并且给这个div标签一个很独特,针对您当前制作词典的一个id或者class属性。比如我们可以修改上面的例子,如下:" i) R  J$ e1 P
" S( [, ]$ t' c" ?6 c* Y1 I  e
, `! C" z4 h8 X/ @/ |

+ W: I/ j" L7 j5 Z/ e这个示例中,我们用了<div id="tldimproved">来包住了您的词条的所有内容,这样,在CSS和JS中您可以仅仅针对您的词典内容进行样式的设置,而不会影响其他词典。那具体该怎样设置CSS和JS呢?请继续看。
2 _. y/ j2 a: A' t
4 E7 \% [0 V* ~6 `/ A2 N& a
; Y) }5 o+ X( {6 n
  • 正确使用CSS,仅仅对您自己的词条设置样式6 V/ Y4 \( G( s
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您设置CSS时候必须只针对您自己的词典,这样才不会影响其他词典的显示。有了上一条的包含住整个词条的div标签,这个任务就很好完成了。( W. S# U# V$ {3 k5 |

! J$ K* v6 ~0 k8 D比如假设您的词条中有一段内容:
4 J5 b2 \. p; E; s( b
2 J- {# r; d* N. l: g9 d<div class="gdc">
- m$ V1 F# G4 l+ z& `+ _: ?        <div class="dcb">/ q3 j. y8 R9 N5 y
            <span class="pos">n.</span>
! N  x$ L; U( b4 t( h# E" C            <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>
9 ~1 W+ R0 Y; z3 H" B7 d        </div>! J: z" A5 H' A0 e5 X* C
</div>
$ x3 r* K0 s, e, L7 L1 j8 x2 \1 p3 V
! n/ `0 @- y' ~
& x+ [. T. I- a0 }要对这个class="gdc"的div标签设置CSS,你可能会写:
- Y5 q8 E, w) N0 C% x
/ |+ e2 d( j) x4 f.gdc {...}
; L; h! p( l/ m) o) u" _4 A7 K9 b1 w/ ~
或者
. U5 V+ j  c- {9 B7 n* `+ M
3 U- e/ f3 D: N, R8 bdiv.gdc {...}
9 U7 k5 {3 h; R) C) r1 J+ M
0 j/ C3 Y0 b  I7 N9 A3 z这两种写法都不好!因为我们已经有了<div id="tldimproved">包含住整个词条的内容,那么正确的写法是:% I' k- I8 ?. ?; P) n: O  d  Q

* w$ C- x1 L  P9 idiv#tldimproved .gdc {...}+ g  Q6 V* j3 P% d
或者% `) i) A& w1 b& I: A
div#tldimproved div.gdc {...}
- u# q) E8 L8 x& I4 N4 ]0 K& O或者
2 v3 j' T: I, T0 Mdiv#tldimproved > .gdc {...}3 Q7 x" F+ ?1 R. s. V# V; O
或者. M) L- S/ ?' r% A2 I2 |9 v0 b
div#tldimproved > div.gdc {...}
/ G% G* N3 U5 j/ \0 I& K. z' \
1 P3 G1 m* I3 K" k这样写的效果是,您指定的CSS只会对<div id="tldimproved">里面的那个css等于gdc的标签生效,而其他词典不可能有一个div叫做tldimproved的,这样也就避免了CSS的冲突。
) `0 E+ ~8 Q) R6 x( L$ c. f
' l9 A' {5 Y1 B. a4 [- @( K; F3 G$ U+ h) j* e
  • 正确使用JS,仅仅对您自己的词条内容进行修改
    # r" ?0 v, ?6 d" S
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您编写JS的时候必须只针对您自己的词条,这样才不会影响其他词典的显示。有了包含住整个词条的div标签,这个任务就很好完成了。
9 x" Z- a; }0 A) G1 b通常在JS中,您最终的目标是动态地修改您的词条,不管是修改内容还是修改CSS,反正目标就是修改。修改的第一步是获取要修改的对象,获取的对象如果错了,那么您做的修改可能就应用到了不正确的地方。比如您想给您的词条中的图片加一个三个像素的边框,如果您使用JS不当,那最终结果可能是您修改了所有词典中的图片,都加上了边框。那么怎样正确地获得你要修改的对象呢?我们还以上面的示例代码为例:1 e3 e, p% Q3 F3 p
. p2 k) [. ]$ d
<div class="gdc">5 U2 [& E8 c8 K' I1 V. ~$ c
        <div class="dcb">$ p; K: j1 T5 z5 s8 g6 x1 p% f
            <span class="pos">n.</span>1 ~* w2 N. t4 ?& m. H
            <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>
' j! C+ S8 h# {" a% U* B3 Z        </div>
" r3 l4 `* |! W3 v" @+ m7 _</div>  c# B; ]( v$ R6 n1 N
  ?# D  Y; J. J: y2 T: {- Q" k
正确的方法是:
  T* P) j5 Q2 O' u8 P& B, C) v$ Y# w5 U4 G
如果您使用jQuery:- H2 G) @1 f' z5 k
$("div#tldimproved div#gdc")
) }7 x8 v4 b& V% Z- P或者8 k' g6 S9 a0 P% Q: {0 \* P
$("div#tldimproved > div#gdc")
: ^( i6 o) w4 @" h) V' ?$ f或者
- w# S, }: D& ]6 M& r$ o3 D$("div#tldimproved #gdc")
& q- @3 J  N5 B$ M; s- H或者0 I4 Z4 c; s7 O) X) a2 q
$("div#tldimproved > #gdc")
; p3 _: h- |4 k  H
! W( l# p: e/ O; `
- F" E& `; H: s. D; P7 p如果您使用的是vanilla JavaScript,那么正确的方法是:
  W5 \2 m; @2 {2 v8 y$ L0 U# p( `; fdocument.getElementById("tldimproved ").getElementById("...")
. ~; j7 D! s: k4 A- C或者% T) [6 b' l* L0 N
document.getElementsByTagName("body")[0].getElementById("tldimproved").getElementById("...")
( |. {+ T5 Y  l' q5 @或者
0 e0 v* Z# g5 S) K$ I4 Ndocument.querySelector("div#tldimproved")....
! k4 j# w) S- p) X8 N" w或者
( t$ q; T. d" `document.querySelectorAll("body")[0].querySelector("div#tldimproved")....
0 B9 j3 d6 j+ u+ L9 S6 {等等,因为vanilla JS写起来比较复杂,我仅仅列出了几个常用的函数,大家应该领会我的意思了,就是你不管干嘛,总要表明“我想要获取的是id等于tldimproved下面的内容”,这个思想和上面的关于CSS的写法是完全一样的,目标只有一个,就是您只是修改您自己的内容,而不会影响其他词典!
* B8 ]; r* a# @9 r+ |3 A; S+ @. p1 [3 Y4 l4 ~7 }) s  C4 e/ H: i
  • 正确使用CSS reset framework, c5 j1 `  U( ^) ^. x' P
现在有很多CSS reset framework,有些人在自己的mdict词库中使用,上来就是:
2 E) S8 m' C% y2 S, V* {
% R. a' y& Y9 [0 c. F3 v" ?  box-sizing: border-box;) C4 {- g- T( i4 e  ]- i" s: c
}7 W4 E  v5 U1 y( z. B% I
::before,
" y2 z. A' v  H/ I( ~::after {, F1 ?3 p/ X' P6 U& c) Z
  box-sizing: inherit;9 I& |: d( {7 j9 a
}
1 @- G2 Y4 N( u+ C2 I0 R- A! Bhtml {8 q+ Y) m$ X: E0 g- V8 t, Z! N
  line-height: 1.15; /* 1 */* L$ k, u4 h' {% l, t: q( _% }! E
  -webkit-text-size-adjust: 100%; /* 2 */
! V' F, X/ V' v5 c* M* _0 A  -webkit-tap-highlight-color: transparent; /* 3*/! f3 g" {6 m8 {" P" T- C
}3 C* Y! g: J$ O9 B1 q& Z
body {+ {7 S  [5 k- k% q
  margin: 0;
+ q0 U0 ?- s! q# l2 L9 u}4 a% A& u% f0 b3 M
main {. f- w. @9 h  H9 s
  display: block;4 x" x) J( u" U4 T* j4 s4 r/ `
}
6 S' C+ r1 s3 `' g. p3 s( ~& S5 u; ~( b; i& T
+ z6 T/ Y0 d8 M0 Z2 D. Z: ~- L8 K+ c5 O
这么做不合适!如果你理解我上面反复强调的内容,你的词条只是最终查询结果网页中的一部分,那么相信你能理解为什么这么做不合适。你的词库只应该设置你自己词条的样式,而上面的CSS修改的所有词条的设置,尤其是box-sizing,这会导致其他大量词典显示不正常。正确的方式是,仅仅修改你自己词典的样式!所以,你可以写成比如像下面这样:
4 q5 K7 Q: J9 j* q  j1 i! i0 [9 I
, `9 I" Z9 @/ F8 ]! U$ `% Kdiv#tldimproved * {
* {+ S( G7 O# o- x: y0 n3 F    box-sizing: border-box;+ Y' Q; w# m9 r9 ?* H( D
}' h/ v/ y+ {6 s  g( u$ I! [
div#tldimproved ::before,: H/ k/ V) g+ n5 H
div#tldimproved ::after {
# ]" t6 Y7 T. t6 @" o    box-sizing: inherit;$ d# p8 h" a1 _; f# v; I
}) k' ]6 m0 M3 w; l, |' E2 c
div#tldimproved main {
" f1 |+ w9 {, ^( E    display: block;
: E6 P9 o% Q+ R9 x  I}6 P. `1 E/ R! w! h/ c( _6 ~

* I* g. k1 `: q+ u+ P: H. i' ]# C) h6 t1 j. Q
大家理解我的意思了吧,牢记一点,只修改自己词典的内容,不要影响到其他词典!
4 O3 V1 B3 F  E; m  U: P# y- z, j2 k# ?

本帖子中包含更多资源

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

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 }; S# s& r* K1 N  u# R
    2 c% _1 T# G) Z/ H9 R
    赞成总结一下制作词库应follow的 best practices。, U4 h: a% n- J, E
    ; D# ]6 I# W# f  }3 i2 `
    正如楼主所说的,手机上可能必须把很多词库的文件放到一个文件夹里,因此命名不能过于简单,否则可能因名称重复而导致js/css互相干扰。
    ; T) C& j! c# l" B& P6 t- f, P另外,鉴于有The little dict这样的发音词典大全集,所有词典的音频文件都应放在“词典名字.1.mdd”里,用户可根据需要选择是否下载以避免臃肿。同时,css中设置自适应代码,当文件夹中没有“词典名字.1.mdd”时隐去发音图标。$ g- X& s: K2 D. z# F. `
    还有,双解词典应该有中文翻译内容的隐藏功能,要有标注以便可通过js来实现。
    9 w' T) b: E8 |+ g; a0 G5 u1 C% D/ ~3 m6 ]5 ?( v+ f0 j+ K
    $ r0 B0 g6 \- r. d# W/ }8 {' Q, y
  • TA的每日心情

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

    [LV.7]常住居民III

    发表于 2019-4-24 20:21:05 | 显示全部楼层
    cocowind 发表于 2019-4-24 18:44( y9 C3 y& b# {/ w( R; E
    赞成总结一下制作词库应follow的 best practices。
    8 c' E% S8 j# K, e$ P
    ' f" r8 T! r1 S0 G正如楼主所说的,手机上可能必须把很多词库的文件放到 ...
    ' a5 b' ?; n$ s$ X9 @2 W$ `
    在手机 必须把很多词库的文件放到同一个文件夹里,这个到没想过。
  • TA的每日心情

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

    [LV.7]常住居民III

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

    * d: p' w7 u2 K) L: L经验虽好,但是不可能实行。( [/ _  b+ U! v3 A  w
    & v7 _7 w# N& d7 t0 i
    现在好多词典基本的 html / css 规范都不能保证,如何保证你这些额外要求。
    : ^$ S- m/ q1 Z8 h5 j6 A# s
  • TA的每日心情
    开心
    2019-6-23 00:02
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2019-4-25 12:31:22 | 显示全部楼层
    zzzz_sleep 发表于 2019-4-25 06:01
    ) O( m+ a/ Y5 s经验虽好,但是不可能实行。
    , b& ~' |' O0 ?
    ; T' G2 e7 f6 V' {: M' L( m现在好多词典基本的 html / css 规范都不能保证,如何保证你这些额外要求。

    ) A4 V  _* B9 c* {& o1 ?您说的很对,昨天看了一下朗文五加加,标签都没有闭合。这个只能自己修改了,或者自己做词库的时候遵守这些。2 X* z/ H" r/ H! o1 {

    该用户从未签到

    发表于 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 `: r2 A$ X/ @# F3 K  |5 H
    -------7 j0 H1 U3 g- m; L- O3 _
    学了点HTML/css的皮毛,回头看这个贴,觉得楼主说的这一点确实不错。
    & g$ Z9 t! W- u8 W0 l* N0 B3 Y' A很多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-6 07:33 , Processed in 0.098358 second(s), 14 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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