|
匿名
发表于 2019-4-24 17:21:38
|阅读模式
本帖最后由 匿名 于 2020-10-9 02:27 编辑 6 T1 H- R* C" k4 t# n( R
% d4 P" o8 h+ E6 r. a% X
) s* m0 D G2 n9 H0 \5 N) h w更新历史5 f# {$ w) m, I+ L5 s
! i& K7 Y: v1 A6 g9 ~# K; q( b$ c/ v
2019.4.24 9:22 PM添加新内容
% y7 R% ^3 u2 p Z$ u% a2 z S/ `* U
2019.4.24 5:21 PM
8 x1 z6 F2 D9 s* \, \" h开始写此文,尚未完成先保存一下" d: g, L: H5 D. W* B5 A
' }8 h- A) x9 p, K
% k% u- B7 a5 h* J3 Y! N" d0 H前言
; P1 ?( E j' R- I% d
9 I, W0 w9 ~# ]0 K- z1 q大家好啊!
) I( ]9 i. ^5 s" K4 i1 Z0 [/ ?& T- X: E! e9 {! v+ A" C
最近我自己制作了Macmillan在线词典,也修改了其他几个词典,都已经发出来了。大家也给了很多反馈,绝大多数的问题我也都修复了。这个过程中确实学习到了很多东西,有技术方面的,当然也有和mdict词库紧密相关的。这个帖子就是想分享一下我在制作mdict词库方面的经验,和大家讨论一下。下面的内容仅仅代表我(ogrishman)的一家之言,具体说的对不对,我们一起讨论讨论。然后我们一起完善这个帖子,并且宣传这个帖子,这样大家制作词库的时候都follow best practice,词库的质量一定会得到提高,而且问题还会少很多。下面我就一条一条列出我要说的这些best practices。
4 M/ `& t, K) f# v# z
) g! @/ _2 W- w7 J, t
/ r$ C5 w/ [6 M$ E/ k
) c* H1 s! x) T2 g; C正文; F' O# H, V* M0 c# L. s
1 A( Y' r! s: s4 [8 x, c: l% u
- 词库相关文件的命名要一致,并且清晰全面" [: p* u% O0 V' K# a+ ~
比如我们要制作一个Oxford Advanced Learner's Dictionary第九版的词库,那么相关的文件名可以命名为:
' Q. ?5 f/ e7 |
; k* V9 }4 |& WOxford Advanced Learner's Dictionary 9th.mdx) w+ L4 @2 _/ n# Y
Oxford Advanced Learner's Dictionary 9th.mdd) d4 d5 }$ G2 ]5 X
Oxford Advanced Learner's Dictionary 9th.1.mdd0 I ~( F. _3 C% C
Oxford Advanced Learner's Dictionary 9th.js- O4 \3 h' R0 {% T& y
Oxford Advanced Learner's Dictionary 9th.css
- O: F# k E( O4 S7 m* B我们要考虑到,某些情况下我们可能必须把很多词库的文件放到一个文件夹里,这时遵守这一点的优点就突显出来了,用户可以一眼看出哪些文件属于哪个词典,而且文件排序一般也会把这些相关文件排在一起。这里要注意,不要用缩写,比如OALD9.mdx,这样不够清晰!0 K& c* p1 p2 n/ z2 q
/ o& T' y' p I/ p! ~
6 ~/ U M/ y A3 {, n' P8 T
- 每个词典都要提供外置的js文件和css文件供有能力的用户深度定制词典
& [5 e, c7 R4 j% H 每个词典最好都有外置的js文件和css文件。css文件基本上现在所有词典都会有,但是我建议,即使你的词库没有用到js,也在你的词条里加入一个外置js文件,这样可以给用户留下自己扩展的空间。; O% U ?* X2 @( @. o& L1 F1 s7 U" H
1 T8 Y, T- W, L- B- 你的词库中的一个词条只是整个网页中的一部分,深入理解这一点,并且牢牢记住
3 C$ y% \( v5 j) x" d- E* ` 现在主流的词典软件(欧路词典、GoldenDict)在渲染一个单词时候都是用网页的形式。现在基本上所有用户都会安装多于一本的词典,这些不同的词典中的相同的词条凑成了一个网页,也就是您看到的结果。比如下图是我在Windows上的欧路词典查询frequency后的结果,其中部分词典的结果被我折叠起来了,其中每个红色方框表示一个词典的结果:
: \+ r3 b/ T: M' m" ^; S7 f- ?8 O
# I1 ^7 B2 Q& T2 h5 w1 k* Y5 Y9 L; j
" `! r2 y4 t. G$ ]4 Q+ F这里要理解的是,这里每个红色方框不是单独的一个网页,而是整个网页的一部分!理解这一点非常重要,不然你制作的词典可能会有各种各样的问题,比如影响了其他词典的正常显示,或者被其他词典的CSS或者JS所影响。具体在应用中怎样实践对这一点的理解,请继续看下面的内容。1 B3 x! j" _9 ]3 x; ~' J
! @( R. m5 E! Y7 t7 D/ F7 t4 y
! D) M% ~/ Z; K1 W( a) y6 `
- mdx源文件中,每个词条要用单独的一个<div>标签包含起来. e6 S; v6 K# Y0 Z
比如在mdx源文件中,有一个词条:
0 T5 X" E* H2 t/ O+ @1 v) _
1 T9 _3 [# b' }6 p
/ l3 L) l' i' P; q# n* r( `这样写非常不好!我们已经说过,您的词典中的一个词条只是最终整个查询结果网页的一部分。现在您的这个词条虽然有一些div标签有class属性,可以用来添加CSS,但是如果其他的某个词典里面也有<div class="pf">,那么您针对您的词典制作的CSS就会影响其他词典。正确的做法是,把整个词条的所有内容包含在一个div标签内,并且给这个div标签一个很独特,针对您当前制作词典的一个id或者class属性。比如我们可以修改上面的例子,如下:8 F( {. b }* [; k& k. s/ L
2 ?' s/ o) d! t4 u3 A
8 P9 Y' U* `; A4 i( Z0 X' B5 Q* _0 V8 i, I) U! ~9 O
这个示例中,我们用了<div id="tldimproved">来包住了您的词条的所有内容,这样,在CSS和JS中您可以仅仅针对您的词典内容进行样式的设置,而不会影响其他词典。那具体该怎样设置CSS和JS呢?请继续看。
& w. i* H( {6 R9 K- j6 j/ T8 g3 z9 Y. I/ s0 I
7 }6 ~# d( S3 y( {% }' H# R- K
- 正确使用CSS,仅仅对您自己的词条设置样式
* l! ~: x5 w' g1 X4 E 上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您设置CSS时候必须只针对您自己的词典,这样才不会影响其他词典的显示。有了上一条的包含住整个词条的div标签,这个任务就很好完成了。" q+ L: `6 l, l# h2 w& C# I6 L2 ?+ Q
+ ]" u! ~7 c J9 F( A& b
比如假设您的词条中有一段内容:. M2 y1 w4 `' o: g8 `) M \
& f8 U# g' f' Q: x<div class="gdc">
6 Y5 w1 ?6 @# M6 k: n& k# K, ] <div class="dcb">
5 ?9 k( c& `" o. ]0 c <span class="pos">n.</span>
5 ]8 F( ]1 I; T <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>
' a1 v" h, R+ G5 V8 j0 V6 ] M# o! V </div>
1 r5 Q: T) H1 ?1 ~</div>
8 t! m, ^5 J+ ]% O" k6 ~- \0 w! l7 h' r$ u1 v' m% i% G
o/ p, [6 A; M5 Z; A# a$ Y
要对这个class="gdc"的div标签设置CSS,你可能会写:' a# l+ c, q: _
7 t8 D8 C* h6 g. q
.gdc {...}6 ]' C. v) o3 e7 d( m" q
7 b! m- |* X( Y( }7 b
或者( `! N/ q/ _0 d8 A
; s( y* f- z6 kdiv.gdc {...}% y* z0 S- }8 x9 t& Q
9 `8 X [% H$ r" e- o9 H; z
这两种写法都不好!因为我们已经有了<div id="tldimproved">包含住整个词条的内容,那么正确的写法是:) U t, x% ?9 A7 U
" V' \% S4 S' V. j, N- i7 S. T1 w8 c9 {: adiv#tldimproved .gdc {...}: R* V1 Z9 P6 m1 j) X
或者
! n4 h4 t0 ]4 E/ s, Hdiv#tldimproved div.gdc {...}7 K5 o' R2 B) G# p6 R- Q
或者- K7 H$ F; z1 p3 C: ~
div#tldimproved > .gdc {...}: j* ]& Z" ?- d: w& U) m$ s9 g
或者/ r& l& E1 D5 q. g; F
div#tldimproved > div.gdc {...}
' `) S& h2 Q) Z# w# W- x$ ?& a2 m4 p/ i+ f, B
这样写的效果是,您指定的CSS只会对<div id="tldimproved">里面的那个css等于gdc的标签生效,而其他词典不可能有一个div叫做tldimproved的,这样也就避免了CSS的冲突。
5 V. S' ~; }& |2 o0 L: r' A* ?/ o' k* r
6 \2 W% b' {5 y& j% J% Q
- 正确使用JS,仅仅对您自己的词条内容进行修改$ y& W& m& k6 R j& O }8 u
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您编写JS的时候必须只针对您自己的词条,这样才不会影响其他词典的显示。有了包含住整个词条的div标签,这个任务就很好完成了。
5 s) T" ~8 X7 B3 _. d5 f通常在JS中,您最终的目标是动态地修改您的词条,不管是修改内容还是修改CSS,反正目标就是修改。修改的第一步是获取要修改的对象,获取的对象如果错了,那么您做的修改可能就应用到了不正确的地方。比如您想给您的词条中的图片加一个三个像素的边框,如果您使用JS不当,那最终结果可能是您修改了所有词典中的图片,都加上了边框。那么怎样正确地获得你要修改的对象呢?我们还以上面的示例代码为例:7 q% ~1 F, i0 t: D
5 l1 \! q! Q2 b: v7 g
<div class="gdc">
1 j6 \+ d0 Z: [2 z0 m6 O <div class="dcb">
1 w) x3 g! m* |* R <span class="pos">n.</span>
& y# m8 H. z; `3 { <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span># u; b. k9 ?! ^( U( N
</div>" _( d+ p6 Q& q
</div>
& j+ w( X2 q. M) _) {+ X' U! x- d
8 g! c% M- `9 }" d" O7 q8 a1 d正确的方法是:
7 O% |3 r! X( C- t4 ~3 A6 R i4 }$ @" w; f
如果您使用jQuery:
3 t& Q1 P5 F/ W$("div#tldimproved div#gdc")
, N$ E9 m$ W5 ] i或者2 m* e2 ^; C) F. x$ o. ]0 @
$("div#tldimproved > div#gdc")4 x2 D' _% u' p$ g
或者" `/ k, V. p. `3 `1 r1 _1 `+ D* M
$("div#tldimproved #gdc")9 ?6 y( W, A/ C: f9 d4 h- n/ i1 }# J$ C
或者
. r6 W9 R$ [- w0 O$("div#tldimproved > #gdc")+ t: F) |; J8 r
. A T8 ^; W3 X+ J
& k5 \" A/ }( H7 N, ? Y: H如果您使用的是vanilla JavaScript,那么正确的方法是:
: _* t6 h3 o5 z- H" fdocument.getElementById("tldimproved ").getElementById("..."). c9 T- _) ~, `& ^7 u
或者
$ v2 D0 A, ^1 v* I0 Fdocument.getElementsByTagName("body")[0].getElementById("tldimproved").getElementById("...")
( R# A4 T( P- m3 j4 Q o: o4 G8 D或者; u+ u6 {2 I- e; s/ j
document.querySelector("div#tldimproved")....
& p' R* W H: W& U或者: G9 @/ X d# U. A4 g1 r1 ~: W
document.querySelectorAll("body")[0].querySelector("div#tldimproved")....' D8 J1 M( j) M
等等,因为vanilla JS写起来比较复杂,我仅仅列出了几个常用的函数,大家应该领会我的意思了,就是你不管干嘛,总要表明“我想要获取的是id等于tldimproved下面的内容”,这个思想和上面的关于CSS的写法是完全一样的,目标只有一个,就是您只是修改您自己的内容,而不会影响其他词典!
7 X k* z- E0 V( z U: U8 `3 H ?; I. h/ r
- 正确使用CSS reset framework ]0 w. x5 M0 ]$ H% d8 R% X4 P% t
现在有很多CSS reset framework,有些人在自己的mdict词库中使用,上来就是:
. ^* U8 i% K! s" U3 W7 z2 \* {
8 ^4 E% c7 h( w" l0 H box-sizing: border-box;
$ R8 \6 G0 W+ a! j3 H. A}- |: n* L: K: K/ R' d1 z4 d
::before,
: I- f0 d3 T+ V+ v::after {
& P4 S6 y* t7 j8 a& n* R box-sizing: inherit;+ Y: h8 E% u- X2 V5 X; p; x
}2 ?2 f' o6 W1 v: d; [$ n/ x9 q
html {$ {3 B( x7 E I6 t
line-height: 1.15; /* 1 */
% b# w% {5 I6 [ -webkit-text-size-adjust: 100%; /* 2 */$ b9 {; f) \& [$ o! _: X
-webkit-tap-highlight-color: transparent; /* 3*/, V1 ~3 k& z) Z5 ^* J% z7 _ x, s
}
" W5 J( M% u' Rbody {' H9 A! n2 N6 y! E0 s5 V: F
margin: 0;
$ h1 ]3 s3 r, ]/ V0 [4 _}4 w% E9 l: }& G! C+ |9 R# z, V
main {$ r: F- R" V, K" W) b
display: block;5 d3 |" m2 h$ _# u; v/ ]
}& j9 j4 k; _ J
5 O9 ^, H+ e% i. v- ~2 o
- @; a5 l( n2 t5 I这么做不合适!如果你理解我上面反复强调的内容,你的词条只是最终查询结果网页中的一部分,那么相信你能理解为什么这么做不合适。你的词库只应该设置你自己词条的样式,而上面的CSS修改的所有词条的设置,尤其是box-sizing,这会导致其他大量词典显示不正常。正确的方式是,仅仅修改你自己词典的样式!所以,你可以写成比如像下面这样:, R" P# I0 x3 ?. w v
1 e) }' a6 |2 x+ X
div#tldimproved * {
3 s0 r2 s1 r. I box-sizing: border-box;$ W5 M8 g$ O0 k0 C/ [+ i- N6 V
}
) ?1 G3 A* k" f8 L/ ldiv#tldimproved ::before,
4 P7 C; D5 | A" Kdiv#tldimproved ::after {
; ?( q" R6 ^5 b5 D box-sizing: inherit;
/ T @9 @' S/ W& E/ @$ l2 n}
& ~9 F. E k. ndiv#tldimproved main {/ M* m/ b3 E4 X7 K& C3 @
display: block;
4 F0 H0 o4 A+ @0 u7 F* A}
. i/ }; u2 u* F8 T
0 [+ W, X; g6 [8 t/ K* B
5 d1 |5 u; L7 |; s5 A4 T大家理解我的意思了吧,牢记一点,只修改自己词典的内容,不要影响到其他词典!
/ x3 S; l/ }/ s1 F) ^: e1 ]' q1 y: W6 D' ~/ Y
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?免费注册
x
评分
-
2
查看全部评分
-
本帖被以下淘专辑推荐:
- · 词典制作|主题: 217, 订阅: 40
- · 词典制作|主题: 111, 订阅: 24
- · 排版|主题: 62, 订阅: 5
- · MDX制作|主题: 1, 订阅: 0
|