|
匿名
发表于 2019-4-24 17:21:38
|阅读模式
本帖最后由 匿名 于 2020-10-9 02:27 编辑
3 n8 M. s9 v1 m$ e, P5 X: v7 E' \. w5 t) |
! A9 ^# r* m8 T! i8 @更新历史 x1 W; E) E& x! C. ^6 A1 q$ ]
. W, a! d7 g: H ~# x
2019.4.24 9:22 PM添加新内容' V- t) e M. f3 A# J; z
. f9 q8 H$ i- \8 F7 O" Z
2019.4.24 5:21 PM' g) B o5 |2 \9 k }1 x z3 T ]
开始写此文,尚未完成先保存一下; }5 L7 L! v4 e$ j
7 n4 D# x. {' n
: T' [' h( e9 ^- T0 f# S- N前言) F: N: q# o/ h" X
7 |4 W( Y2 p; q4 w" Z大家好啊!; _4 W' R2 p, Q% @6 _
3 e5 L7 X9 l( S3 e7 A0 _$ n最近我自己制作了Macmillan在线词典,也修改了其他几个词典,都已经发出来了。大家也给了很多反馈,绝大多数的问题我也都修复了。这个过程中确实学习到了很多东西,有技术方面的,当然也有和mdict词库紧密相关的。这个帖子就是想分享一下我在制作mdict词库方面的经验,和大家讨论一下。下面的内容仅仅代表我(ogrishman)的一家之言,具体说的对不对,我们一起讨论讨论。然后我们一起完善这个帖子,并且宣传这个帖子,这样大家制作词库的时候都follow best practice,词库的质量一定会得到提高,而且问题还会少很多。下面我就一条一条列出我要说的这些best practices。7 p, R, z6 n8 G Y
& M, L! C: E' o7 Z6 j- @( ?! E* e- `
3 i1 v& O$ b0 m
正文
3 B2 F1 |8 j' P- X( X8 ~$ M6 j b Q$ i! i% G
- 词库相关文件的命名要一致,并且清晰全面
G0 l: d! J5 Q0 o8 T0 I3 o# M. M 比如我们要制作一个Oxford Advanced Learner's Dictionary第九版的词库,那么相关的文件名可以命名为:" s) ~+ Q! f1 N) ^
8 M! o$ g9 ]. h/ U/ N+ N" WOxford Advanced Learner's Dictionary 9th.mdx
* O% j6 G+ u# W& w5 i4 K vOxford Advanced Learner's Dictionary 9th.mdd, m# H- Q9 h& s! B; x. h
Oxford Advanced Learner's Dictionary 9th.1.mdd$ u6 g8 y6 K, S) p3 \ x$ Z. ?7 W
Oxford Advanced Learner's Dictionary 9th.js: F3 D6 }# Q% ]
Oxford Advanced Learner's Dictionary 9th.css ! r5 h8 C/ z& J" ^+ L- i
我们要考虑到,某些情况下我们可能必须把很多词库的文件放到一个文件夹里,这时遵守这一点的优点就突显出来了,用户可以一眼看出哪些文件属于哪个词典,而且文件排序一般也会把这些相关文件排在一起。这里要注意,不要用缩写,比如OALD9.mdx,这样不够清晰!
% e! P, B% G1 _0 ?
& H# e w" N# r+ D5 P7 I9 W& h+ P0 r) J* L! Z& T
- 每个词典都要提供外置的js文件和css文件供有能力的用户深度定制词典9 T- j: ^' O" u: t
每个词典最好都有外置的js文件和css文件。css文件基本上现在所有词典都会有,但是我建议,即使你的词库没有用到js,也在你的词条里加入一个外置js文件,这样可以给用户留下自己扩展的空间。4 |2 K7 z9 ^; ^5 q: O+ g' u
8 |" |% s* w5 `3 ]- 你的词库中的一个词条只是整个网页中的一部分,深入理解这一点,并且牢牢记住3 {" C- U# B& F
现在主流的词典软件(欧路词典、GoldenDict)在渲染一个单词时候都是用网页的形式。现在基本上所有用户都会安装多于一本的词典,这些不同的词典中的相同的词条凑成了一个网页,也就是您看到的结果。比如下图是我在Windows上的欧路词典查询frequency后的结果,其中部分词典的结果被我折叠起来了,其中每个红色方框表示一个词典的结果:
% m% p& c6 M( Q) a! C+ @) d: h7 b; G0 w( f% F
8 m( \* N% ]# l
2 m0 D3 ^# U' @; F9 z这里要理解的是,这里每个红色方框不是单独的一个网页,而是整个网页的一部分!理解这一点非常重要,不然你制作的词典可能会有各种各样的问题,比如影响了其他词典的正常显示,或者被其他词典的CSS或者JS所影响。具体在应用中怎样实践对这一点的理解,请继续看下面的内容。: X8 @& I+ |; J: u$ P, k8 @( y8 i
( W. {" Z2 g; @. m$ u
- v0 r) K5 H$ b2 T- mdx源文件中,每个词条要用单独的一个<div>标签包含起来1 s. ?) g5 i- y" {$ k
比如在mdx源文件中,有一个词条:0 @1 ]3 ?& ^% m5 ]
2 r( V2 N8 ^. P+ `" M/ c) ~5 j( h. H) q5 d
这样写非常不好!我们已经说过,您的词典中的一个词条只是最终整个查询结果网页的一部分。现在您的这个词条虽然有一些div标签有class属性,可以用来添加CSS,但是如果其他的某个词典里面也有<div class="pf">,那么您针对您的词典制作的CSS就会影响其他词典。正确的做法是,把整个词条的所有内容包含在一个div标签内,并且给这个div标签一个很独特,针对您当前制作词典的一个id或者class属性。比如我们可以修改上面的例子,如下: ?9 o0 U# @" _* J* G- o1 i
9 W" e' K# ]# L$ w
# ?; _/ W9 \4 B
" `9 L0 s; X0 r这个示例中,我们用了<div id="tldimproved">来包住了您的词条的所有内容,这样,在CSS和JS中您可以仅仅针对您的词典内容进行样式的设置,而不会影响其他词典。那具体该怎样设置CSS和JS呢?请继续看。
Y9 o9 x# Y; _1 k6 |
. W T- @# ?9 ~# I6 j0 A; e$ w+ _! b2 x4 e
- 正确使用CSS,仅仅对您自己的词条设置样式7 p" T1 c+ {) g! G& F
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您设置CSS时候必须只针对您自己的词典,这样才不会影响其他词典的显示。有了上一条的包含住整个词条的div标签,这个任务就很好完成了。1 M& J, U8 J9 Q- w
8 u K$ h, c5 H" w3 _
比如假设您的词条中有一段内容:/ h) d! j. p1 ~- V* V
8 S; W6 F+ `% e; d: X3 O8 P<div class="gdc">
5 u/ y( a& K4 R) |- l2 | <div class="dcb">4 H% G$ V" H6 j2 _' O7 l% @
<span class="pos">n.</span>* [( V$ M( F2 i7 S/ o9 _& O& u) @
<span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>
( W. a5 h j7 O6 c" F' ?) c) C7 j </div>/ J% r* q \( F7 @
</div>3 {- V& f6 a) l9 f8 w3 _
; x3 o; N: Q4 @; M x E
) M# T& a, P" o Q6 F2 ?! y* a/ K要对这个class="gdc"的div标签设置CSS,你可能会写:
* J$ s7 W, P5 g; \' @) f6 w8 }4 z9 B+ ~1 q# J1 Q% S8 g" W5 ?7 Z8 `
.gdc {...}6 t5 {+ U& h' d7 q7 Z- l; y
: G) q. o @( N, Y* o7 ?或者. Z* h; L8 ~: v
6 @2 l; l# [# u
div.gdc {...}; m( f9 B R1 G! S q2 ~3 z% g/ y
- O. K) |/ @! R) c- g
这两种写法都不好!因为我们已经有了<div id="tldimproved">包含住整个词条的内容,那么正确的写法是:
( }6 X1 K8 C2 G7 x( X
6 o: C1 F) W! J" c2 |$ pdiv#tldimproved .gdc {...}
: z2 { _6 Z% h5 R8 U+ Q8 \或者
; _9 ^/ h) m& b8 x( d& Kdiv#tldimproved div.gdc {...}
0 P/ L+ s0 J+ L1 j9 V, p或者5 k$ b+ T) m% Z% e
div#tldimproved > .gdc {...}
/ j9 J' S& T1 d; J或者0 i# T4 V- c- P: U$ k' i
div#tldimproved > div.gdc {...}* T! a% U- P1 c2 W
) a1 G" T4 m6 E
这样写的效果是,您指定的CSS只会对<div id="tldimproved">里面的那个css等于gdc的标签生效,而其他词典不可能有一个div叫做tldimproved的,这样也就避免了CSS的冲突。
, V' `# M+ F, H% j7 V; [; L v; g
2 w' u& R5 n* h8 R( N3 o- 正确使用JS,仅仅对您自己的词条内容进行修改
- r* m' b% S+ v& b0 S' I 上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您编写JS的时候必须只针对您自己的词条,这样才不会影响其他词典的显示。有了包含住整个词条的div标签,这个任务就很好完成了。
# u. x, t# r/ C0 L9 C# M, J通常在JS中,您最终的目标是动态地修改您的词条,不管是修改内容还是修改CSS,反正目标就是修改。修改的第一步是获取要修改的对象,获取的对象如果错了,那么您做的修改可能就应用到了不正确的地方。比如您想给您的词条中的图片加一个三个像素的边框,如果您使用JS不当,那最终结果可能是您修改了所有词典中的图片,都加上了边框。那么怎样正确地获得你要修改的对象呢?我们还以上面的示例代码为例:
: O! u5 p3 J* u8 U
0 U. z( [5 g+ t<div class="gdc">
x- E5 f0 s( ]* s4 D3 s" v <div class="dcb">8 d' c1 Q, d5 w8 k/ Z* ], z9 S
<span class="pos">n.</span>+ n2 A4 |1 x9 p* h! o
<span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>0 `' x4 K$ a9 \# c5 X
</div>. A0 l& b0 E& n# h& ]) \( m, U
</div>& E$ N w5 ?# `
1 @# B/ w# {( Z( |1 I: H7 `
正确的方法是:/ @ d& a% I! u7 X$ h
8 Y2 ^% H) S2 J
如果您使用jQuery:
4 j7 k1 L. ^" r; g) y5 U$("div#tldimproved div#gdc")
3 q: ~4 P; T! Q+ p/ p' P6 D或者" ~' K& _* C% u; |
$("div#tldimproved > div#gdc"), j( W0 v& ~* [) p
或者
_5 s( q' @0 {: A* W! C* [$("div#tldimproved #gdc")
6 _) i+ |* V6 }或者$ V3 _! a: e2 n& s
$("div#tldimproved > #gdc")
- x' q9 J2 N( C, H$ K) `0 h3 C, a- N7 ^8 l
$ D7 l# T2 ` g! ]+ w如果您使用的是vanilla JavaScript,那么正确的方法是:6 k( E$ B& |* C# j, f9 H* e
document.getElementById("tldimproved ").getElementById("...")
0 L6 Q+ R: e H4 z# y7 ] i或者
O' C7 r: x/ e' r! z( O! udocument.getElementsByTagName("body")[0].getElementById("tldimproved").getElementById("...")
7 h( {6 V% V, E, r或者
2 b$ Q) r A9 L8 v& M/ Jdocument.querySelector("div#tldimproved")....; r: O; u& X& u2 k7 i" o
或者0 X3 ~* {8 Y& E
document.querySelectorAll("body")[0].querySelector("div#tldimproved")....
$ x8 t7 H2 H [6 @- N等等,因为vanilla JS写起来比较复杂,我仅仅列出了几个常用的函数,大家应该领会我的意思了,就是你不管干嘛,总要表明“我想要获取的是id等于tldimproved下面的内容”,这个思想和上面的关于CSS的写法是完全一样的,目标只有一个,就是您只是修改您自己的内容,而不会影响其他词典!
) Q6 D2 O) r T/ l; Y- c- L5 V+ T( C, k5 X9 E) T
- 正确使用CSS reset framework+ g) O ~" O0 T. U
现在有很多CSS reset framework,有些人在自己的mdict词库中使用,上来就是:- a% N8 [ l" k' q: @
* {3 j; P6 |2 Z4 s4 [$ a, I2 x; H
box-sizing: border-box;
7 {1 w4 o5 G7 ^2 |! I/ t8 t0 Q}( @2 {/ ?; I* `2 U7 d
::before,
2 J, s, [# j3 g1 Z::after {
3 n% x( o: G/ {% y O5 [ box-sizing: inherit;/ A* ]5 o9 j8 q
}
+ h) I; I3 X+ e1 X- h: uhtml {% |, t( b! @$ `) {6 X
line-height: 1.15; /* 1 */
0 E! B! C6 K. ?/ z8 L' ` -webkit-text-size-adjust: 100%; /* 2 */. D R; j! z. y0 ?
-webkit-tap-highlight-color: transparent; /* 3*/
. n6 {' u6 v4 \2 Z}
0 N8 g2 G0 I8 v& ~$ m1 j z pbody {( z4 k0 S3 g. R! k3 L2 z+ B
margin: 0;
! l, _* g3 A* b}/ q6 ?9 S! Z9 e$ W& R5 o7 u
main {0 l5 u- h; d; [9 t
display: block;
% ?! v+ d" N8 _, E; D7 n4 |}, M6 I# _: g: l G. q: ~
$ w* p' ]! g+ B6 ^- U8 t- m
9 }( _! b3 K \% X这么做不合适!如果你理解我上面反复强调的内容,你的词条只是最终查询结果网页中的一部分,那么相信你能理解为什么这么做不合适。你的词库只应该设置你自己词条的样式,而上面的CSS修改的所有词条的设置,尤其是box-sizing,这会导致其他大量词典显示不正常。正确的方式是,仅仅修改你自己词典的样式!所以,你可以写成比如像下面这样:
' l) v: R- ?+ E1 \) [% O3 s+ L; M; [# A
, v- @& v! E# Z4 O6 ?' {div#tldimproved * {
8 v* H9 y# m" N0 k box-sizing: border-box;
& X6 E a# O. b7 y' ]8 s2 g}4 `1 P; I7 j7 ]; f4 K
div#tldimproved ::before,
: }9 z9 p5 K9 Hdiv#tldimproved ::after {8 z* n" U2 T+ n: m/ B
box-sizing: inherit;0 w# i) P1 B0 l% g3 q
}1 V2 \9 q( ?) l- L& p0 j J1 {
div#tldimproved main {% R* l& I. W2 p: ?7 |
display: block;
& G4 Y% S/ h. l2 j7 N5 n# {}: f" Y* [% s& P/ |: }
8 M7 ]# C; d6 ^: e/ [5 B3 v
( e$ {4 g1 |; j o大家理解我的意思了吧,牢记一点,只修改自己词典的内容,不要影响到其他词典!
9 l3 k, N; @* B3 ~* Q. ^! O. I
/ |; c1 ]" T t6 ^% E |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?免费注册
x
评分
-
2
查看全部评分
-
本帖被以下淘专辑推荐:
- · 词典制作|主题: 217, 订阅: 40
- · 词典制作|主题: 111, 订阅: 24
- · 排版|主题: 62, 订阅: 5
- · MDX制作|主题: 1, 订阅: 0
|