|
|

匿名
发表于 2019-4-24 17:21:38
|阅读模式
本帖最后由 匿名 于 2020-10-9 02:27 编辑 % g, i; n* F! A5 i) ^' R
7 l {. E# L% p; q* ]! K( @
( d; Y$ i4 N- t% A; n
更新历史
) c! \2 G3 y. u) i1 Z( y/ L1 m( V8 S+ {: Z/ D
2019.4.24 9:22 PM添加新内容
2 T+ r* Q2 U, S2 G5 [: f3 ~ l% b+ S* s0 v
2019.4.24 5:21 PM
! G6 t$ L1 B! b# ? f# _开始写此文,尚未完成先保存一下
$ s* X% a2 g! V% Q
% X" c( g, q; G/ l/ J& U; J ' `3 {/ g( u9 ^9 C
前言, H" Q1 x% R( F0 o0 _
8 @) m! k5 ?% G4 T& x4 X大家好啊!: @! I2 \( u' }8 u
! b) Y/ f& ]+ x
最近我自己制作了Macmillan在线词典,也修改了其他几个词典,都已经发出来了。大家也给了很多反馈,绝大多数的问题我也都修复了。这个过程中确实学习到了很多东西,有技术方面的,当然也有和mdict词库紧密相关的。这个帖子就是想分享一下我在制作mdict词库方面的经验,和大家讨论一下。下面的内容仅仅代表我(ogrishman)的一家之言,具体说的对不对,我们一起讨论讨论。然后我们一起完善这个帖子,并且宣传这个帖子,这样大家制作词库的时候都follow best practice,词库的质量一定会得到提高,而且问题还会少很多。下面我就一条一条列出我要说的这些best practices。0 K/ a, w8 [& y' i. _
5 P e5 p" g# v
: X5 x1 I: \5 k* E+ U0 G# {+ R( `: k: g

$ n/ E. w9 S: V' V) q正文
/ J" r5 x% d6 l" G& Z' b. g" B. ^- |: S8 |
- 词库相关文件的命名要一致,并且清晰全面' U4 D/ }5 v/ g. f
比如我们要制作一个Oxford Advanced Learner's Dictionary第九版的词库,那么相关的文件名可以命名为:
0 M6 T0 @& O( B, a/ D8 g: r; t% K k# x6 F1 m, V7 c- G5 w
Oxford Advanced Learner's Dictionary 9th.mdx. W6 |! @5 Y' l- I* ]
Oxford Advanced Learner's Dictionary 9th.mdd
5 P- L* F0 `* M3 t& i! _$ fOxford Advanced Learner's Dictionary 9th.1.mdd
& B# A1 ^1 u( S, Q/ D+ KOxford Advanced Learner's Dictionary 9th.js! B1 k0 m" e( i" U4 T+ D, v% x( v6 n
Oxford Advanced Learner's Dictionary 9th.css
6 k1 d! |3 s$ ~! p% L5 i |我们要考虑到,某些情况下我们可能必须把很多词库的文件放到一个文件夹里,这时遵守这一点的优点就突显出来了,用户可以一眼看出哪些文件属于哪个词典,而且文件排序一般也会把这些相关文件排在一起。这里要注意,不要用缩写,比如OALD9.mdx,这样不够清晰!
' h1 [8 ^3 h" M3 K9 u& F3 \; J3 ~( R
" O3 ^% K, F4 [% `- l- 每个词典都要提供外置的js文件和css文件供有能力的用户深度定制词典
" G- B4 h7 {: E6 Q- a6 k9 B+ e 每个词典最好都有外置的js文件和css文件。css文件基本上现在所有词典都会有,但是我建议,即使你的词库没有用到js,也在你的词条里加入一个外置js文件,这样可以给用户留下自己扩展的空间。: l t8 q) q% i1 q5 a! [' w
0 r0 X9 T- J& ^ a4 f! P+ e! ], P- 你的词库中的一个词条只是整个网页中的一部分,深入理解这一点,并且牢牢记住9 `- H, H' `3 A" w2 S" R
现在主流的词典软件(欧路词典、GoldenDict)在渲染一个单词时候都是用网页的形式。现在基本上所有用户都会安装多于一本的词典,这些不同的词典中的相同的词条凑成了一个网页,也就是您看到的结果。比如下图是我在Windows上的欧路词典查询frequency后的结果,其中部分词典的结果被我折叠起来了,其中每个红色方框表示一个词典的结果:
2 ?+ Y, |+ D7 |" i" N9 E* Q9 W) Q; h1 [5 V. m% r$ N! G" I
! g. E! u/ u; S
g8 U3 h3 H5 I9 i2 V
这里要理解的是,这里每个红色方框不是单独的一个网页,而是整个网页的一部分!理解这一点非常重要,不然你制作的词典可能会有各种各样的问题,比如影响了其他词典的正常显示,或者被其他词典的CSS或者JS所影响。具体在应用中怎样实践对这一点的理解,请继续看下面的内容。
; `2 T1 p+ n& \8 o6 S' X. n3 W# C- m8 O) z3 Z
) |7 g/ l3 |. ]% x8 |3 y' x- mdx源文件中,每个词条要用单独的一个<div>标签包含起来' v$ I8 }4 }0 z5 x0 W
比如在mdx源文件中,有一个词条:
3 a5 c8 U0 B$ |8 Y& H" f5 z
. ~ [5 Q% Z+ b. J; g3 F) m5 @9 _3 k
这样写非常不好!我们已经说过,您的词典中的一个词条只是最终整个查询结果网页的一部分。现在您的这个词条虽然有一些div标签有class属性,可以用来添加CSS,但是如果其他的某个词典里面也有<div class="pf">,那么您针对您的词典制作的CSS就会影响其他词典。正确的做法是,把整个词条的所有内容包含在一个div标签内,并且给这个div标签一个很独特,针对您当前制作词典的一个id或者class属性。比如我们可以修改上面的例子,如下: ?$ h0 a4 \% K; F/ o6 F1 q: ?! ~
$ {& p9 h0 w5 G: W! J7 [6 e
) c, H% g; g2 w! J
9 ^. M8 j- \' f- `# G( m5 l这个示例中,我们用了<div id="tldimproved">来包住了您的词条的所有内容,这样,在CSS和JS中您可以仅仅针对您的词典内容进行样式的设置,而不会影响其他词典。那具体该怎样设置CSS和JS呢?请继续看。# @- c! E2 f5 F1 `. x1 X
) n/ {) g9 J9 v" R$ I8 `. k
( Q, T9 ]* o* K% ^3 }- 正确使用CSS,仅仅对您自己的词条设置样式/ F; ^. V# e9 F4 v2 t( h. v
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您设置CSS时候必须只针对您自己的词典,这样才不会影响其他词典的显示。有了上一条的包含住整个词条的div标签,这个任务就很好完成了。
, ^$ F. Y" w& {7 t' w2 a$ x, v b% R4 p( y
比如假设您的词条中有一段内容:
; b- w$ y/ L. Z# I# ?, }
; V7 F2 H/ R% b @<div class="gdc">
' Y) A e0 N% |: R( X2 P <div class="dcb">: l7 K' A( m, C! m6 j. f
<span class="pos">n.</span>
( v7 M" R6 z8 q- T1 ?( j! M" g <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>
6 `1 K4 } s- B3 s </div>
7 L& Q" q4 } Y# c</div>8 ^. p/ `3 A: {6 m: m" o8 I+ S
6 I: a. }: ~, i9 G4 s
; T9 H* C" i; b9 x+ x; p要对这个class="gdc"的div标签设置CSS,你可能会写:
8 f) [! i4 e- V' t" @# d1 W7 O& T+ m x. l; Y
.gdc {...}7 o4 i$ }* {( O% A' f7 e4 \4 I% V: z& v
/ }# @+ W0 G5 U( u
或者& b, l7 B- S# n( y: S
# s1 K# {" R5 Z0 P. g! m+ y8 U' _
div.gdc {...}9 G+ t S. `/ x0 a2 f- C) S* q d
, x0 X5 {9 k: D1 }- m% |4 a. d这两种写法都不好!因为我们已经有了<div id="tldimproved">包含住整个词条的内容,那么正确的写法是:) }, o* ~0 g( Q& H" m# ?. p
. U5 c; t; e0 n3 |8 I- p6 Fdiv#tldimproved .gdc {...}
: e6 R5 K# J6 L5 ^5 `2 Z$ ]% p或者
% }: R9 H; }1 m' S( |- `div#tldimproved div.gdc {...}
3 h- C; K# \8 d# b! T% P或者
/ W, B9 c, s6 q+ K+ `div#tldimproved > .gdc {...}3 x. H3 k( P4 X* m9 R
或者, N2 x3 ~0 [2 s% x$ R
div#tldimproved > div.gdc {...}- X4 G$ T$ A4 H8 E
D* Z5 ~" n3 e: G$ }这样写的效果是,您指定的CSS只会对<div id="tldimproved">里面的那个css等于gdc的标签生效,而其他词典不可能有一个div叫做tldimproved的,这样也就避免了CSS的冲突。
; L5 B3 y- G* X- L6 x
! r7 v9 U- }1 O; I$ r* Z: n: z3 K: q
- 正确使用JS,仅仅对您自己的词条内容进行修改. N5 D% k7 T. h# m0 J- g
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您编写JS的时候必须只针对您自己的词条,这样才不会影响其他词典的显示。有了包含住整个词条的div标签,这个任务就很好完成了。
1 o' |: ?% N8 s! U通常在JS中,您最终的目标是动态地修改您的词条,不管是修改内容还是修改CSS,反正目标就是修改。修改的第一步是获取要修改的对象,获取的对象如果错了,那么您做的修改可能就应用到了不正确的地方。比如您想给您的词条中的图片加一个三个像素的边框,如果您使用JS不当,那最终结果可能是您修改了所有词典中的图片,都加上了边框。那么怎样正确地获得你要修改的对象呢?我们还以上面的示例代码为例:
7 H6 L% U- n, n3 w. o3 H. z. ^. ?7 Z9 S- [& b3 S
<div class="gdc">
9 Y- `+ {! j9 p! ^ <div class="dcb">: D2 U& s* i8 n h
<span class="pos">n.</span>
. F Q; n! f4 W8 m7 j- C6 I/ Q- O <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>8 q+ Q2 r, c5 u- q3 K1 \( y
</div>
$ f; d; W0 t, R% m</div>8 i5 R- i" f; `: K
+ m$ G X4 s' _ \+ T; G正确的方法是:
- r }6 M. k3 w( M/ G, ~2 {
* g" y5 t1 D! Y8 M如果您使用jQuery:
* T; g* _# w3 k! O3 @* h$("div#tldimproved div#gdc")5 Y( b1 ~+ @; d5 ~
或者
" N) d7 R5 s$ i# M0 r; A* |$("div#tldimproved > div#gdc")
" V+ ^9 l) ]; ^9 \& U或者6 ^* }. }1 Q2 U7 O
$("div#tldimproved #gdc")
. V, W" }! \9 N M' e+ u或者* j# s0 J: {5 Q+ O* ^
$("div#tldimproved > #gdc")& }: _* t( h- X; O7 J( ?" e: a# h# ^! o
! j3 I) a0 ^) ~) R. F3 _ U
$ L2 S5 i1 `/ w- N; m1 P" A8 x
如果您使用的是vanilla JavaScript,那么正确的方法是:' s/ G' Q) j0 `& b. t4 A1 Q9 Z
document.getElementById("tldimproved ").getElementById("...")2 F# j/ e* {- Q( E' t
或者: A4 y3 J* D5 z" x: t5 S
document.getElementsByTagName("body")[0].getElementById("tldimproved").getElementById("...")
1 I! r V+ }0 R; `. c/ ^+ ?或者. D" @- z7 T6 c
document.querySelector("div#tldimproved")....
9 H: x1 x2 s2 I7 S4 Q' n( F7 L或者+ t/ e/ o, z N. u
document.querySelectorAll("body")[0].querySelector("div#tldimproved")....
1 N- c6 z' \; N等等,因为vanilla JS写起来比较复杂,我仅仅列出了几个常用的函数,大家应该领会我的意思了,就是你不管干嘛,总要表明“我想要获取的是id等于tldimproved下面的内容”,这个思想和上面的关于CSS的写法是完全一样的,目标只有一个,就是您只是修改您自己的内容,而不会影响其他词典!$ G4 K& [" L, Q& o5 L
7 E, n9 ^2 R8 w+ a- 正确使用CSS reset framework( i) q) w; m2 z! E T. s1 W
现在有很多CSS reset framework,有些人在自己的mdict词库中使用,上来就是:
9 f; U x2 S( z9 b b* {
2 m g3 ]; e* S: s box-sizing: border-box;' o7 |0 C) k2 P1 x: }
}# }" {) N* y/ k- n* @
::before,
3 R8 N' n. E3 Y) ^::after {
6 F$ T) Q/ R$ B+ X box-sizing: inherit;
/ ]2 @+ n6 F& H# a8 I9 t}4 a# p: h2 y, f1 q' r* W* A0 ^
html {
8 w8 G, N& k' F0 H& x. h line-height: 1.15; /* 1 */# {; Q3 K( s# f
-webkit-text-size-adjust: 100%; /* 2 */
9 g5 b. p$ R) j7 j6 u9 N4 I -webkit-tap-highlight-color: transparent; /* 3*/
. Q: w2 b V7 p: |% R2 g4 s}
5 a1 |' O# b" D6 x" ]3 S! n: Gbody {
8 @+ M3 [4 {2 |" l2 l4 w8 `, R margin: 0;/ F4 W4 f, O* J
}1 j* ~* n& P2 A5 j, J2 h
main {
3 D1 v3 Q" r1 s% X7 d) I. Z2 v* H display: block;& s% U9 q w+ w+ p$ @
}
' y. W$ H2 G$ _5 _7 e' d# J& J/ k! [0 \. Y# U9 c* O% [
1 A v) y4 Q6 D0 |
这么做不合适!如果你理解我上面反复强调的内容,你的词条只是最终查询结果网页中的一部分,那么相信你能理解为什么这么做不合适。你的词库只应该设置你自己词条的样式,而上面的CSS修改的所有词条的设置,尤其是box-sizing,这会导致其他大量词典显示不正常。正确的方式是,仅仅修改你自己词典的样式!所以,你可以写成比如像下面这样:0 A! @ D& W9 T6 u
& p0 y3 ^& J! d; S- ~( F) N2 g
div#tldimproved * {
- A0 `2 J7 A2 \0 L) m box-sizing: border-box;7 _. y, N' D8 T+ p3 _
}( K& I" w) H, }, \
div#tldimproved ::before,: }* P% i* S$ W: }
div#tldimproved ::after {8 _- l6 P. i3 D7 v
box-sizing: inherit;' b/ g1 x* C* N3 b0 A9 A
}
( r7 A& ` C2 G( S. Fdiv#tldimproved main {
6 g2 K. Z, n; _ display: block;
; t6 e# i3 p8 d, W) L( D6 {}" |/ U( V" U5 T9 s& j
) O; i8 E; I6 A; p
; a! Y/ Z M' ~4 f! ^! B% K% H0 V大家理解我的意思了吧,牢记一点,只修改自己词典的内容,不要影响到其他词典!4 w: X4 w' T3 P& H& D$ [4 {/ c \/ U
) g: c. a7 K+ a! P5 q
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?免费注册
x
评分
-
2
查看全部评分
-
本帖被以下淘专辑推荐:
- · 词典制作|主题: 217, 订阅: 40
- · 词典制作|主题: 111, 订阅: 24
- · 排版|主题: 62, 订阅: 5
- · MDX制作|主题: 1, 订阅: 0
|