|

匿名
发表于 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
查看全部评分
-
本帖被以下淘专辑推荐:
- · 词典制作|主题: 217, 订阅: 40
- · 词典制作|主题: 111, 订阅: 24
- · 排版|主题: 62, 订阅: 5
- · MDX制作|主题: 1, 订阅: 0
|