掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 3145|回复: 9

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

[复制链接]
匿名
匿名  发表于 2019-4-24 17:21:38 |阅读模式
本帖最后由 匿名 于 2020-10-9 02:27 编辑
) d( I9 Q. r! j! U6 Z
7 [% U% R5 \, l7 M9 O5 Q( P6 g7 l& N+ m+ I. }  Y3 I  `
更新历史
; L- Q  e  @: |% J" {& J; P# h4 i; B6 u. h( \6 x
2019.4.24 9:22 PM添加新内容! l( b% c! B! M
9 K5 n  s' b$ L5 t' g  [: Y
2019.4.24 5:21 PM; G2 E) D2 D4 e) I! n9 {
开始写此文,尚未完成先保存一下; E" @, u8 q% V

3 b% C, ?5 h, t; L+ T$ V& \; i5 n9 V' E( T+ B* o# f" c% q, e$ j
前言
3 B- q' D0 ?  U' |! \3 T  d' I! D+ `
5 d( a# g8 M0 T8 b% S. C6 K& Z大家好啊!0 q, V) T, {. {

# m& I: j( M' }' d1 e6 E最近我自己制作了Macmillan在线词典,也修改了其他几个词典,都已经发出来了。大家也给了很多反馈,绝大多数的问题我也都修复了。这个过程中确实学习到了很多东西,有技术方面的,当然也有和mdict词库紧密相关的。这个帖子就是想分享一下我在制作mdict词库方面的经验,和大家讨论一下。下面的内容仅仅代表我(ogrishman)的一家之言,具体说的对不对,我们一起讨论讨论。然后我们一起完善这个帖子,并且宣传这个帖子,这样大家制作词库的时候都follow best practice,词库的质量一定会得到提高,而且问题还会少很多。下面我就一条一条列出我要说的这些best practices。
; C3 Z( r( A" _: _5 g2 w$ O2 v5 b# W* K" e" t2 W
+ a. Q  b& Q2 Z) H& O

* G* K9 s! q$ _  `正文
+ F' q9 O; h6 {7 b( Z$ S' Y! y0 Q5 O4 Y7 o5 e
  • 词库相关文件的命名要一致,并且清晰全面
    ) H; q& W' \; o
比如我们要制作一个Oxford Advanced Learner's Dictionary第九版的词库,那么相关的文件名可以命名为:
' Q5 X5 b# j( U: M% _
( g# O) h' C* Z1 d; z
Oxford Advanced Learner's Dictionary 9th.mdx# r( I9 t( i$ Z
Oxford Advanced Learner's Dictionary 9th.mdd9 T6 g$ Q; ~. B% R
Oxford Advanced Learner's Dictionary 9th.1.mdd
$ V2 a. Y% M& S4 h/ `Oxford Advanced Learner's Dictionary 9th.js
2 a2 l& S4 Q6 Q" e& [2 oOxford Advanced Learner's Dictionary 9th.css
0 W6 _/ Z5 j* H* `
我们要考虑到,某些情况下我们可能必须把很多词库的文件放到一个文件夹里,这时遵守这一点的优点就突显出来了,用户可以一眼看出哪些文件属于哪个词典,而且文件排序一般也会把这些相关文件排在一起。这里要注意,不要用缩写,比如OALD9.mdx,这样不够清晰!
$ ?1 r8 ^7 ?. |9 ?2 L" N5 Y! v8 r9 K$ e/ L9 U* a' f8 t& U
( h$ ~; ^0 }- v
  • 每个词典都要提供外置的js文件和css文件供有能力的用户深度定制词典
    ) l! X2 L2 O: R0 z) x3 L1 v, m8 I) ?
每个词典最好都有外置的js文件和css文件。css文件基本上现在所有词典都会有,但是我建议,即使你的词库没有用到js,也在你的词条里加入一个外置js文件,这样可以给用户留下自己扩展的空间。# l4 {5 i5 L5 S1 |9 f

( T2 c( q$ S1 \8 o
  • 你的词库中的一个词条只是整个网页中的一部分,深入理解这一点,并且牢牢记住  H: W# N1 y: j' S5 Z
现在主流的词典软件(欧路词典、GoldenDict)在渲染一个单词时候都是用网页的形式。现在基本上所有用户都会安装多于一本的词典,这些不同的词典中的相同的词条凑成了一个网页,也就是您看到的结果。比如下图是我在Windows上的欧路词典查询frequency后的结果,其中部分词典的结果被我折叠起来了,其中每个红色方框表示一个词典的结果:0 o4 H+ U& z- y/ e
8 o2 x) ]! ~, r

. G, C" w" o) [" H+ x6 N7 T' F- H
. Z- Y- t$ Y% j* g) x这里要理解的是,这里每个红色方框不是单独的一个网页,而是整个网页的一部分!理解这一点非常重要,不然你制作的词典可能会有各种各样的问题,比如影响了其他词典的正常显示,或者被其他词典的CSS或者JS所影响。具体在应用中怎样实践对这一点的理解,请继续看下面的内容。9 X8 G7 h2 c$ S/ e

7 @0 i5 A5 x# u. ^0 L5 X+ ~+ O8 H3 T: r" o) N3 l7 ^) j
  • mdx源文件中,每个词条要用单独的一个<div>标签包含起来
    & E! b" C5 W+ D/ R
比如在mdx源文件中,有一个词条:3 h, T% `) y) X$ O

5 ^  h% l" |  B: d' R- ^/ k% d3 z0 R* H5 ]2 x) j- o9 R  F
这样写非常不好!我们已经说过,您的词典中的一个词条只是最终整个查询结果网页的一部分。现在您的这个词条虽然有一些div标签有class属性,可以用来添加CSS,但是如果其他的某个词典里面也有<div class="pf">,那么您针对您的词典制作的CSS就会影响其他词典。正确的做法是,把整个词条的所有内容包含在一个div标签内,并且给这个div标签一个很独特,针对您当前制作词典的一个id或者class属性。比如我们可以修改上面的例子,如下:1 D2 Z* Z: Z& V" h
1 }3 T% @' N, v8 _. k
$ Z  s7 ?; s* s7 Q

8 Z" W! Z- c: J# o: N这个示例中,我们用了<div id="tldimproved">来包住了您的词条的所有内容,这样,在CSS和JS中您可以仅仅针对您的词典内容进行样式的设置,而不会影响其他词典。那具体该怎样设置CSS和JS呢?请继续看。: ^! p7 w. j5 y7 Z6 F4 o
" A3 {3 X2 j, G# S1 ]

- v( e! Q: [$ T8 }% {5 w; `. H  B( I
  • 正确使用CSS,仅仅对您自己的词条设置样式" U0 O( t$ l5 }; q6 J/ _) z
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您设置CSS时候必须只针对您自己的词典,这样才不会影响其他词典的显示。有了上一条的包含住整个词条的div标签,这个任务就很好完成了。
( `, ~8 O4 c& @4 ?; w# d
. V1 Y% q* U, E$ T4 _! F: m比如假设您的词条中有一段内容:
3 `5 E6 v- O( N7 v1 s2 R0 q- j; D0 A' D
<div class="gdc">2 C% Q1 q+ h4 z+ p) Z
        <div class="dcb">
) o* R+ \% S% T4 M& g            <span class="pos">n.</span>& r! i: i, n3 J- u; N& t6 t
            <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>/ |: T% {7 r" b: |4 W
        </div>
# ~9 l+ }, @- t% i</div>
; f1 Z" `0 T8 P! }6 g) H2 h4 @' W( L7 q  l" q7 u0 r) ^% W4 F

1 F) E7 e! H4 L8 X0 ^0 c要对这个class="gdc"的div标签设置CSS,你可能会写:3 M- x- L) D2 A5 S7 l4 d* Y7 }- n' `
. b# p; q8 H6 n
.gdc {...}: r6 B$ K6 |# C1 A( C! A, Z
& H$ a; b9 Z* w( s* T8 g5 @! ~
或者
, O7 g4 B5 q1 ^6 D6 q& u0 K, ?0 d1 S( d  f
div.gdc {...}( _3 L' N/ F9 @
$ K& t$ |' m8 @& z; X9 |2 E
这两种写法都不好!因为我们已经有了<div id="tldimproved">包含住整个词条的内容,那么正确的写法是:
; w# L$ @9 a. |* A# h* ^* c; T# U- X( V8 d; K
div#tldimproved .gdc {...}. `% C0 u2 x! o) ?& l7 j8 p
或者3 a3 L9 n/ V! w
div#tldimproved div.gdc {...}
' g: }" \5 P- d+ R' L) |3 J或者
$ M1 G/ [1 m3 L3 Z, j( {# Idiv#tldimproved > .gdc {...}+ L$ ~9 B5 {7 C$ J0 p0 y
或者
+ L6 v* T; Q$ ^# Y. G" Rdiv#tldimproved > div.gdc {...}
7 B+ n0 r- u% R! q% {  I7 I  j9 x) X# H# z) B
这样写的效果是,您指定的CSS只会对<div id="tldimproved">里面的那个css等于gdc的标签生效,而其他词典不可能有一个div叫做tldimproved的,这样也就避免了CSS的冲突。- q4 O9 H6 X9 l8 t. C/ i/ Z

3 z% _+ b7 P+ N! {
5 R/ g1 `( E3 S* e* P  X+ L  l3 b
  • 正确使用JS,仅仅对您自己的词条内容进行修改+ r4 ]0 |1 V$ a( ~3 j# v
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您编写JS的时候必须只针对您自己的词条,这样才不会影响其他词典的显示。有了包含住整个词条的div标签,这个任务就很好完成了。
! Y, l6 d; E8 o0 o- A' ~& T) i9 U通常在JS中,您最终的目标是动态地修改您的词条,不管是修改内容还是修改CSS,反正目标就是修改。修改的第一步是获取要修改的对象,获取的对象如果错了,那么您做的修改可能就应用到了不正确的地方。比如您想给您的词条中的图片加一个三个像素的边框,如果您使用JS不当,那最终结果可能是您修改了所有词典中的图片,都加上了边框。那么怎样正确地获得你要修改的对象呢?我们还以上面的示例代码为例:5 n( n" B2 B3 A9 R
8 u% J6 F5 ~6 N  U- ~
<div class="gdc">9 b* p. G4 ?# Z- h
        <div class="dcb">: o3 P0 [' j* b5 w
            <span class="pos">n.</span>
$ j: [2 h0 M4 d            <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>
, I% ?2 Y4 d, ^# \2 G        </div>
3 \  i2 I0 E  \( l9 }" I: u9 p7 U</div>4 |" d1 |* x$ m6 [8 {7 u
( L% R$ k6 Z, [) g4 T
正确的方法是:- q% X" u  X% d! ^- R  g

# g( d* S. L: D& R2 q- q; L如果您使用jQuery:
/ R: {- \' k9 J$("div#tldimproved div#gdc")
( Y) K0 T3 ]# n; x或者
; I* p% T3 w, @/ X$("div#tldimproved > div#gdc")
! q2 ]1 f1 I; z1 M$ h) g5 |7 ^' @/ `5 H或者) t' i! Z- r% w# G$ h# A5 s
$("div#tldimproved #gdc")
6 q6 a" D; p+ a0 |  D1 B或者
  e: R5 Q: y7 U" k8 L% d9 @$("div#tldimproved > #gdc")
. C# d/ p& O; [8 b  Z) T* ^+ X# `0 W

& [4 J7 q% `% v5 N如果您使用的是vanilla JavaScript,那么正确的方法是:1 o, N& Y' a0 p
document.getElementById("tldimproved ").getElementById("...")
* p# ?- @+ N. t, j$ x或者1 y  v+ t1 q2 A$ d9 I8 ?& v# D. A
document.getElementsByTagName("body")[0].getElementById("tldimproved").getElementById("...")
& F: J. D  M+ r5 \# Y+ d4 Q( Y或者
% q  z' F3 N7 d6 L2 edocument.querySelector("div#tldimproved")..... R, P' g' n1 h1 F7 G8 y
或者  ~% Y' ?: u5 c8 k4 x0 I7 R
document.querySelectorAll("body")[0].querySelector("div#tldimproved")....; H- d, e( F. C. y7 v3 J5 @
等等,因为vanilla JS写起来比较复杂,我仅仅列出了几个常用的函数,大家应该领会我的意思了,就是你不管干嘛,总要表明“我想要获取的是id等于tldimproved下面的内容”,这个思想和上面的关于CSS的写法是完全一样的,目标只有一个,就是您只是修改您自己的内容,而不会影响其他词典!
* @8 ~/ r- ]$ h7 g$ t
7 c- C2 c5 J% n! S/ B
  • 正确使用CSS reset framework# y% E5 @  j0 j# [
现在有很多CSS reset framework,有些人在自己的mdict词库中使用,上来就是:
; G$ ^7 z$ U0 U+ N+ k' R$ b# |6 d* {
: {: p5 N& D% d0 G/ Y  box-sizing: border-box;
$ o% n4 u% f5 B. B4 ?( |2 N# F. s+ M}
% O5 B; E" u# h::before,
; T6 j4 l5 X4 ~$ a- U- x2 M# A::after {
& U: i8 n: [+ m' @2 s3 m  box-sizing: inherit;0 V1 {; v' d$ k
}4 S2 ^9 w1 f2 l- s" I
html {
3 Y2 o4 k" a! R2 C3 l  line-height: 1.15; /* 1 */
6 E; r, i& k" @6 k0 n+ T  -webkit-text-size-adjust: 100%; /* 2 */
' L1 l% {" y2 \+ p( e, H  -webkit-tap-highlight-color: transparent; /* 3*/; n, G3 Q8 L, i# l
}! ]/ U2 S( S* O5 I0 Q6 e5 F
body {
  |" E* w% q; Z  margin: 0;
' z' R& `( y9 X$ O5 E! z% t4 @9 s& u}$ |& X% x' T/ \  C& u
main {
3 x7 I3 \% B! r  display: block;
* D0 g3 _" D3 ^( }! G  d& e: q}: T8 k* `; o: G: {0 @
7 o. K: ?7 h) G0 l9 ?5 x) W2 S: X

+ H) A& h: I0 q$ U0 u这么做不合适!如果你理解我上面反复强调的内容,你的词条只是最终查询结果网页中的一部分,那么相信你能理解为什么这么做不合适。你的词库只应该设置你自己词条的样式,而上面的CSS修改的所有词条的设置,尤其是box-sizing,这会导致其他大量词典显示不正常。正确的方式是,仅仅修改你自己词典的样式!所以,你可以写成比如像下面这样:
6 w% }! i, x1 I, O) z! b6 ]5 @1 i
. j! N, v+ a' G# k, Z' sdiv#tldimproved * {6 O  x. a# T7 w& b3 I" `% _
    box-sizing: border-box;
0 z! X, L7 \; i' A; I( R}
" ^: O! X$ a0 F7 ~div#tldimproved ::before,
- R- j% G6 t2 u" T1 _: Udiv#tldimproved ::after {0 @1 y5 j7 ^6 _$ S6 ?4 d- \" B8 g
    box-sizing: inherit;
! ?7 u/ k8 j8 i}8 \+ d2 K6 B  p) a6 h
div#tldimproved main {3 A8 v' ]' N% @/ c/ S% J( v/ Y7 W
    display: block;
% P' I2 o! N: @. h}+ S) P/ @+ \" a! [0 h6 K( Q6 k

; {: V# u  Q' x2 N" Q& D# {; ]/ k
大家理解我的意思了吧,牢记一点,只修改自己词典的内容,不要影响到其他词典!
. g1 D; X$ c1 Q8 a- }: G! S) w7 j2 O( q- @6 x

本帖子中包含更多资源

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

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 编辑 / g' c5 H3 l8 Y

    1 ~7 A% b7 p' ~' ^赞成总结一下制作词库应follow的 best practices。  e: V+ A5 O# g

    1 g2 Y  v* F6 w1 Y正如楼主所说的,手机上可能必须把很多词库的文件放到一个文件夹里,因此命名不能过于简单,否则可能因名称重复而导致js/css互相干扰。  |* ]$ e. `2 U$ j
    另外,鉴于有The little dict这样的发音词典大全集,所有词典的音频文件都应放在“词典名字.1.mdd”里,用户可根据需要选择是否下载以避免臃肿。同时,css中设置自适应代码,当文件夹中没有“词典名字.1.mdd”时隐去发音图标。
    5 V- F8 J! ?: K还有,双解词典应该有中文翻译内容的隐藏功能,要有标注以便可通过js来实现。
    1 B* T7 T6 B+ O2 _1 l+ ~
    ! {) s5 `) w! C5 N. Q- }9 |8 [5 i2 j6 `0 h: k7 k
  • TA的每日心情

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

    [LV.7]常住居民III

    发表于 2019-4-24 20:21:05 | 显示全部楼层
    cocowind 发表于 2019-4-24 18:44* F; B! G0 m$ O( |- R
    赞成总结一下制作词库应follow的 best practices。
    7 Q, a/ k3 M1 o5 y3 d0 F6 A0 m' g3 V# c8 h; ^! f
    正如楼主所说的,手机上可能必须把很多词库的文件放到 ...
    ( P% j$ G- M* f, e# ]- z4 x- `
    在手机 必须把很多词库的文件放到同一个文件夹里,这个到没想过。
  • TA的每日心情

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

    [LV.7]常住居民III

    发表于 2019-4-25 06:01:26 | 显示全部楼层
    6 ~4 |3 Q5 M/ e1 W$ z. X
    经验虽好,但是不可能实行。
    . r; F  `0 m3 l# c( a3 \' A: I$ W" p4 @& @+ _& x) ~
    现在好多词典基本的 html / css 规范都不能保证,如何保证你这些额外要求。
    . X: j' s) K; {8 d8 W
  • TA的每日心情
    开心
    2019-6-23 00:02
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2019-4-25 12:31:22 | 显示全部楼层
    zzzz_sleep 发表于 2019-4-25 06:019 w* A% v$ W9 Y  I6 A. h& S
    经验虽好,但是不可能实行。6 U9 K& {9 {5 i) _: a+ b
    7 c/ e% C4 A3 J6 U- [
    现在好多词典基本的 html / css 规范都不能保证,如何保证你这些额外要求。
    8 V3 O. c2 z* a8 }4 x: ~
    您说的很对,昨天看了一下朗文五加加,标签都没有闭合。这个只能自己修改了,或者自己做词库的时候遵守这些。. x# j( u8 C1 F- R- o% B, X; w

    该用户从未签到

    发表于 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$ \+ L; K1 @& p' N- ^-------
      m( d1 i& h0 v" ?* I+ |学了点HTML/css的皮毛,回头看这个贴,觉得楼主说的这一点确实不错。
    . Y: q8 b* p  l$ T( v0 c  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-4-11 08:07 , Processed in 0.025100 second(s), 29 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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