|

匿名
发表于 2019-4-24 17:21:38
|阅读模式
本帖最后由 匿名 于 2020-10-9 02:27 编辑 7 {5 Z% f) L9 m! Z. _. E
% F# H V3 D. ^+ g* e. c* K& l7 h- N4 T 9 C8 B) `/ a4 F. d }! U
更新历史9 W3 Y, }' E) K* k+ Y
9 Q5 @8 x% h. G
2019.4.24 9:22 PM添加新内容/ x2 J: {7 R& {% O/ `4 \
0 g5 i9 i5 R' D/ _4 h8 v6 y% n2019.4.24 5:21 PM% g& J/ i9 D ~0 b" {% p! v
开始写此文,尚未完成先保存一下
" M6 `: V5 O. U7 M0 o+ w3 N/ P* C, o% Q0 S

U( C( Y, @& v0 n7 q前言1 x$ V' h: J5 W) z1 R# G
9 N& ~4 f- Q$ S/ y' N; R8 ]% r大家好啊!
% ^+ l7 B! C" N( D4 P
) \! P- ]! Z. z* {# A- H/ L最近我自己制作了Macmillan在线词典,也修改了其他几个词典,都已经发出来了。大家也给了很多反馈,绝大多数的问题我也都修复了。这个过程中确实学习到了很多东西,有技术方面的,当然也有和mdict词库紧密相关的。这个帖子就是想分享一下我在制作mdict词库方面的经验,和大家讨论一下。下面的内容仅仅代表我(ogrishman)的一家之言,具体说的对不对,我们一起讨论讨论。然后我们一起完善这个帖子,并且宣传这个帖子,这样大家制作词库的时候都follow best practice,词库的质量一定会得到提高,而且问题还会少很多。下面我就一条一条列出我要说的这些best practices。
! A3 b! X4 q# l; x4 P% S# D' x, z, f/ g- ^ H" e) _! z4 y( V
9 O9 S1 I# L& |; S! \ V( k

( L$ i0 d# P6 l1 ~" t5 @正文
7 A" u( ]/ e" _% S" h
, g: A8 }$ ]& ?' J- 词库相关文件的命名要一致,并且清晰全面7 B, P- C: F) G7 o0 X
比如我们要制作一个Oxford Advanced Learner's Dictionary第九版的词库,那么相关的文件名可以命名为:
: d- A# \* W8 n. p" ]
8 U' }9 `& W- z" Q" o2 a: l4 n% AOxford Advanced Learner's Dictionary 9th.mdx
0 Y4 B" ?% R a# JOxford Advanced Learner's Dictionary 9th.mdd7 K' Z: ]. A& K! t$ E
Oxford Advanced Learner's Dictionary 9th.1.mdd5 J& x7 i9 J. Q
Oxford Advanced Learner's Dictionary 9th.js, B8 A5 F4 `/ v0 D0 v- z5 J
Oxford Advanced Learner's Dictionary 9th.css , h7 e/ D3 X2 ?% B! O
我们要考虑到,某些情况下我们可能必须把很多词库的文件放到一个文件夹里,这时遵守这一点的优点就突显出来了,用户可以一眼看出哪些文件属于哪个词典,而且文件排序一般也会把这些相关文件排在一起。这里要注意,不要用缩写,比如OALD9.mdx,这样不够清晰!5 Y2 h3 \% \. _# c
" u9 I% }9 S7 q) s# ?
/ j) G5 _/ B3 ~. Z/ m( F
- 每个词典都要提供外置的js文件和css文件供有能力的用户深度定制词典( L4 P/ b5 [( |7 D: j
每个词典最好都有外置的js文件和css文件。css文件基本上现在所有词典都会有,但是我建议,即使你的词库没有用到js,也在你的词条里加入一个外置js文件,这样可以给用户留下自己扩展的空间。
) J0 M+ e, b, e. ~+ l, k5 s# U+ X
* [8 ]( P; }0 D4 ~7 I( F- 你的词库中的一个词条只是整个网页中的一部分,深入理解这一点,并且牢牢记住
& p2 S; s9 X: D7 t" w/ ~6 y 现在主流的词典软件(欧路词典、GoldenDict)在渲染一个单词时候都是用网页的形式。现在基本上所有用户都会安装多于一本的词典,这些不同的词典中的相同的词条凑成了一个网页,也就是您看到的结果。比如下图是我在Windows上的欧路词典查询frequency后的结果,其中部分词典的结果被我折叠起来了,其中每个红色方框表示一个词典的结果:, o4 `6 T' n H: O
# r8 Y! I% l) g( F/ _2 B# U$ g0 S* A5 ?6 I
' v9 t/ m; }0 @" @! `2 a
这里要理解的是,这里每个红色方框不是单独的一个网页,而是整个网页的一部分!理解这一点非常重要,不然你制作的词典可能会有各种各样的问题,比如影响了其他词典的正常显示,或者被其他词典的CSS或者JS所影响。具体在应用中怎样实践对这一点的理解,请继续看下面的内容。
' }: @% F2 [$ L8 Q; J/ K
, P/ R1 Z8 W- W! d
4 B* G* f3 B0 ?1 G/ | c; \- mdx源文件中,每个词条要用单独的一个<div>标签包含起来: ?1 o1 J, r5 G- x# Q: ~# R. V
比如在mdx源文件中,有一个词条:
" B5 \( U+ Y( n
5 i$ Y5 [7 ?: C* w) T$ ~; `0 Q: B" j& g( q
这样写非常不好!我们已经说过,您的词典中的一个词条只是最终整个查询结果网页的一部分。现在您的这个词条虽然有一些div标签有class属性,可以用来添加CSS,但是如果其他的某个词典里面也有<div class="pf">,那么您针对您的词典制作的CSS就会影响其他词典。正确的做法是,把整个词条的所有内容包含在一个div标签内,并且给这个div标签一个很独特,针对您当前制作词典的一个id或者class属性。比如我们可以修改上面的例子,如下:
+ k. Z0 r! s) G5 c9 J1 G1 }, ?" X) W# r+ l Z
' Y0 g: ?8 H: K! }
) K4 ^6 Y6 I* n这个示例中,我们用了<div id="tldimproved">来包住了您的词条的所有内容,这样,在CSS和JS中您可以仅仅针对您的词典内容进行样式的设置,而不会影响其他词典。那具体该怎样设置CSS和JS呢?请继续看。! Q" N/ Z+ C0 \6 y) V+ {
4 J5 J( v, g& s' N ?
a% \' B" a q5 ?0 Z- 正确使用CSS,仅仅对您自己的词条设置样式6 o9 C4 a0 B* @# a/ S
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您设置CSS时候必须只针对您自己的词典,这样才不会影响其他词典的显示。有了上一条的包含住整个词条的div标签,这个任务就很好完成了。
9 U6 E' d9 o" Q0 M+ |4 ~9 f1 F
* c: Q* |, g! O) T% f9 A0 w比如假设您的词条中有一段内容:
6 _5 c3 d, J0 c' o
- _+ y1 @' J8 ?% J<div class="gdc">
( h, y C, {- O; v' E1 d: u" P% f <div class="dcb">
& D [; u2 v* p4 e: r: g <span class="pos">n.</span>
2 j% u$ P* f D' e5 r) } <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>
' W. O5 P, [: R0 ~9 b7 c </div>
5 o' c8 ^8 n5 w% R2 c% E</div>
7 X( F9 u+ X( S/ K- A
. [4 a' @$ D* D$ \# e+ q9 e) h0 e
2 L9 y5 O, D4 e要对这个class="gdc"的div标签设置CSS,你可能会写:2 X5 ^' x5 p: N; i
, V7 b9 G& ~: Y% |8 j$ B
.gdc {...}3 \3 h5 S5 U6 |
# b1 B- W* A. H& R
或者
n% R( y. b" G) O) w, A6 v4 l1 [" G* t( I
div.gdc {...}
" Q6 J& {3 a2 a; M* \7 K1 C- C( }6 O5 b# L) }) n
这两种写法都不好!因为我们已经有了<div id="tldimproved">包含住整个词条的内容,那么正确的写法是:
) G$ M8 q4 z. ~$ W% w! I" C u' W* T" f- U: q7 k; I
div#tldimproved .gdc {...}) @4 w& B( H/ z
或者
3 s( V0 b+ ?" i8 b2 U, Adiv#tldimproved div.gdc {...}
6 m$ [& q& `9 J' E+ E或者9 w5 F" A5 J8 {8 G7 E
div#tldimproved > .gdc {...}
8 _& M6 o. s. D0 n9 D( u或者
) F3 V0 [% E+ C0 V. gdiv#tldimproved > div.gdc {...}
- ~' V! i( g) `7 a4 Q0 [$ [3 l5 O8 U; l$ Z6 B
这样写的效果是,您指定的CSS只会对<div id="tldimproved">里面的那个css等于gdc的标签生效,而其他词典不可能有一个div叫做tldimproved的,这样也就避免了CSS的冲突。9 E& x9 y* ~* p5 D3 _% ^9 q# l
- N c0 i" a9 ?! d
8 r8 L; Y% D9 M [- 正确使用JS,仅仅对您自己的词条内容进行修改1 Q. ?3 U5 Z. A; I5 e4 O
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您编写JS的时候必须只针对您自己的词条,这样才不会影响其他词典的显示。有了包含住整个词条的div标签,这个任务就很好完成了。, P/ T a: L- _8 v1 {$ x
通常在JS中,您最终的目标是动态地修改您的词条,不管是修改内容还是修改CSS,反正目标就是修改。修改的第一步是获取要修改的对象,获取的对象如果错了,那么您做的修改可能就应用到了不正确的地方。比如您想给您的词条中的图片加一个三个像素的边框,如果您使用JS不当,那最终结果可能是您修改了所有词典中的图片,都加上了边框。那么怎样正确地获得你要修改的对象呢?我们还以上面的示例代码为例:; P8 r4 ]1 Y& c' B
6 `# i$ @) N- Q' t. d: ]
<div class="gdc">% B o& X* `3 c2 Y5 W
<div class="dcb">
! T3 m. Q) Y: w8 o: s' Q( k1 D# L <span class="pos">n.</span>7 N. I, ]( v" @$ T( X3 Y2 k: x' {
<span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>" D5 o. l7 K9 @6 m1 w4 O/ t
</div>
+ V, S3 s: X" }</div>9 z3 Y: s. e: H o2 @+ |1 [- f) _
) e! M7 n9 h. \! ~
正确的方法是:& d2 M9 N J1 t# y* k. g
* r" @4 e: i% T' V, T如果您使用jQuery:
. a0 S; U' t. y2 L" ?- e( E$("div#tldimproved div#gdc")
/ K5 C% S% ^/ B或者% o; p q7 y2 a; u
$("div#tldimproved > div#gdc")
' L, e; _' V5 T9 g或者
7 ]/ h/ a6 a" E$("div#tldimproved #gdc")% g/ l \6 F ~
或者
+ |( ]& I9 e- r, W# n$("div#tldimproved > #gdc")" @2 O5 Q1 K4 l# O
# J& I3 g. W. f1 N, ~" B% w# f
/ l, c7 y5 u' d0 @9 j
如果您使用的是vanilla JavaScript,那么正确的方法是:
% R/ @! n2 s+ V. pdocument.getElementById("tldimproved ").getElementById("...")
6 l1 n1 [, q* N& c8 V. M或者0 n# ]. c& d/ l+ q
document.getElementsByTagName("body")[0].getElementById("tldimproved").getElementById("...")
/ E6 _6 }3 T' U: X! [或者! K) y' ~ r6 x6 E/ G
document.querySelector("div#tldimproved")....
) g' w6 B" ] g6 \. w: L' |0 [或者( ?. l+ y' Z$ k- o
document.querySelectorAll("body")[0].querySelector("div#tldimproved")..... r: E% V6 R. n' e/ O
等等,因为vanilla JS写起来比较复杂,我仅仅列出了几个常用的函数,大家应该领会我的意思了,就是你不管干嘛,总要表明“我想要获取的是id等于tldimproved下面的内容”,这个思想和上面的关于CSS的写法是完全一样的,目标只有一个,就是您只是修改您自己的内容,而不会影响其他词典!7 @4 j! g% N4 ^/ `
7 M U1 J' U7 k# X, C- 正确使用CSS reset framework
+ K* u) E$ l( [- a Q: C G 现在有很多CSS reset framework,有些人在自己的mdict词库中使用,上来就是:6 h. M1 a i; K8 q7 g
* {
0 N- H+ J _* ]# g box-sizing: border-box;% i# Y% T8 [; c: @% m
}7 y# K( I8 _! k8 X, o
::before,
& v- A1 F W+ q# ]+ z! v( w::after {2 }1 }- W5 n- k- `
box-sizing: inherit;: e3 B7 K, @, \. E$ G- u2 L8 @
}
0 T+ O7 \3 K: o' b/ Thtml {3 p3 L! K( d( O
line-height: 1.15; /* 1 */
1 r8 s' l7 m4 y( Y( I0 J -webkit-text-size-adjust: 100%; /* 2 */
! H6 C9 h$ `, c0 C/ ^" n -webkit-tap-highlight-color: transparent; /* 3*/4 v6 P. r" u1 \
}
- {% B% ~) Z9 d* I4 Pbody {+ V& }7 M; v, K) c/ ]
margin: 0;
+ G$ u2 v# u1 _}
" \$ @2 Y5 O" h& qmain {
' O% q5 M- I* s4 ~8 U Q display: block;
; B5 G$ a- ]- l* {}- K$ |9 |7 d- U7 V3 w: X' B4 t
: [8 ^# p3 U+ @, e4 i! J) _! b
7 ^( T+ Y h" Y. D% `+ Y
这么做不合适!如果你理解我上面反复强调的内容,你的词条只是最终查询结果网页中的一部分,那么相信你能理解为什么这么做不合适。你的词库只应该设置你自己词条的样式,而上面的CSS修改的所有词条的设置,尤其是box-sizing,这会导致其他大量词典显示不正常。正确的方式是,仅仅修改你自己词典的样式!所以,你可以写成比如像下面这样:' B6 L5 w4 J$ s
1 f. [- L9 S6 b! A. ndiv#tldimproved * {
6 ? O) j! `% q8 Q2 f: p* { box-sizing: border-box;6 z- U) P6 p: f* X; i6 T1 I4 N
}
! d3 Z( }' G9 K' j3 Tdiv#tldimproved ::before,+ a$ v7 N2 r3 A _
div#tldimproved ::after {6 G H* m0 I# G0 i. g
box-sizing: inherit;
2 E! w" v( [& }}
& r* T- a( f2 y# o& s* sdiv#tldimproved main {
, K1 u8 Z6 \7 s( |) F+ M display: block;
8 b5 n s# d2 o+ H0 X8 G% F- f}
5 q; |, x" R7 t0 K+ O; Z6 F/ F* G3 g3 m2 |4 o g$ @' ^
7 s7 b9 O( P2 ?- q! T( h, y大家理解我的意思了吧,牢记一点,只修改自己词典的内容,不要影响到其他词典!0 f( w$ [! C6 S
' Q; e6 L: b9 z8 G |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?免费注册
x
评分
-
2
查看全部评分
-
本帖被以下淘专辑推荐:
- · 词典制作|主题: 217, 订阅: 40
- · 词典制作|主题: 111, 订阅: 24
- · 排版|主题: 62, 订阅: 5
- · MDX制作|主题: 1, 订阅: 0
|