掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 4289|回复: 9

[教程] 最近学习到的制作mdict词库时候的一些经验

[复制链接]
匿名
匿名  发表于 2019-4-24 17:21:38 |阅读模式
本帖最后由 匿名 于 2020-10-9 02:27 编辑 & {1 c6 L- X- b7 g" k
. x/ ~$ F& D: c* V0 F' x

, Q( b  a2 v9 Q. F, Q0 G更新历史
6 p; `0 ?1 m  g! q3 a0 f& {4 X4 w
2019.4.24 9:22 PM添加新内容
) E7 W3 p6 w7 q, r8 B7 I8 t2 e9 e
/ s- z8 @! \' t, T* r, |' P2019.4.24 5:21 PM9 y2 h) d: j! n- g0 @
开始写此文,尚未完成先保存一下/ ?" k% c8 k  I, z* ^* i; M# g: y
) m( k4 N' v- o5 t& e; E
+ J. g5 e1 Q8 B* |/ F' v
前言' a/ W: O: k" U3 \
/ }/ j& V0 J% M1 g
大家好啊!* I, o; v. F- J( V6 E+ w
. ~8 Y( U9 i" N2 \6 f
最近我自己制作了Macmillan在线词典,也修改了其他几个词典,都已经发出来了。大家也给了很多反馈,绝大多数的问题我也都修复了。这个过程中确实学习到了很多东西,有技术方面的,当然也有和mdict词库紧密相关的。这个帖子就是想分享一下我在制作mdict词库方面的经验,和大家讨论一下。下面的内容仅仅代表我(ogrishman)的一家之言,具体说的对不对,我们一起讨论讨论。然后我们一起完善这个帖子,并且宣传这个帖子,这样大家制作词库的时候都follow best practice,词库的质量一定会得到提高,而且问题还会少很多。下面我就一条一条列出我要说的这些best practices。
+ Q0 \2 x, c& S# T( y  V
: g7 j4 z: I) g8 L) R4 V
) F( O+ ^2 V+ k/ S0 S, t
+ y; a1 F0 d0 L: v9 m正文# B( q3 R( |5 h: m, I* k9 R" H
+ E" Y5 F- g' V) @
  • 词库相关文件的命名要一致,并且清晰全面
    9 ?0 t3 @6 r4 j$ l, M! F) M0 d
比如我们要制作一个Oxford Advanced Learner's Dictionary第九版的词库,那么相关的文件名可以命名为:- Q2 n9 t; K5 g, I
6 m7 Y$ n: j' m. a. O8 l
Oxford Advanced Learner's Dictionary 9th.mdx/ J- M6 @7 E+ @8 B9 h- ?
Oxford Advanced Learner's Dictionary 9th.mdd
1 A" m4 M$ D' t# ^. @  z9 s$ g$ FOxford Advanced Learner's Dictionary 9th.1.mdd
  Q, _9 T" b2 c( Q( SOxford Advanced Learner's Dictionary 9th.js- ], d- i, `+ H9 }
Oxford Advanced Learner's Dictionary 9th.css

/ j: x6 S8 U. S, F! W我们要考虑到,某些情况下我们可能必须把很多词库的文件放到一个文件夹里,这时遵守这一点的优点就突显出来了,用户可以一眼看出哪些文件属于哪个词典,而且文件排序一般也会把这些相关文件排在一起。这里要注意,不要用缩写,比如OALD9.mdx,这样不够清晰!
( X% X! c! Q5 \
) ]8 l! v4 J2 _
. s; p3 v, l) _
  • 每个词典都要提供外置的js文件和css文件供有能力的用户深度定制词典6 m, k6 B/ j. C  p
每个词典最好都有外置的js文件和css文件。css文件基本上现在所有词典都会有,但是我建议,即使你的词库没有用到js,也在你的词条里加入一个外置js文件,这样可以给用户留下自己扩展的空间。
0 n8 l2 M% y0 ?, V7 J9 i7 |# v# c( N. k+ }
  • 你的词库中的一个词条只是整个网页中的一部分,深入理解这一点,并且牢牢记住
    9 d9 ?9 U, u/ l* T" K
现在主流的词典软件(欧路词典、GoldenDict)在渲染一个单词时候都是用网页的形式。现在基本上所有用户都会安装多于一本的词典,这些不同的词典中的相同的词条凑成了一个网页,也就是您看到的结果。比如下图是我在Windows上的欧路词典查询frequency后的结果,其中部分词典的结果被我折叠起来了,其中每个红色方框表示一个词典的结果:- O. m7 ]9 V, ?6 |% _: t  f  y* \

! `- l. t+ G2 e( R+ a0 I) c
! t/ i9 \1 @( z' Y
, G  m- W; j4 e; n& X这里要理解的是,这里每个红色方框不是单独的一个网页,而是整个网页的一部分!理解这一点非常重要,不然你制作的词典可能会有各种各样的问题,比如影响了其他词典的正常显示,或者被其他词典的CSS或者JS所影响。具体在应用中怎样实践对这一点的理解,请继续看下面的内容。
6 h% ^& U* Y0 e+ }6 e
* P$ v2 [3 v* z) ^0 `2 Y- V- T3 T& s3 c" O: r- H+ `7 ^2 i
  • mdx源文件中,每个词条要用单独的一个<div>标签包含起来  d% N1 ~0 ~" x+ T- [/ }, \3 ?# |9 u3 I
比如在mdx源文件中,有一个词条:
2 Z+ [. ?/ E8 |( {+ t5 w& X8 y7 Y1 \! B0 q+ V6 Y

  ]2 z# ^2 P0 L; q9 h这样写非常不好!我们已经说过,您的词典中的一个词条只是最终整个查询结果网页的一部分。现在您的这个词条虽然有一些div标签有class属性,可以用来添加CSS,但是如果其他的某个词典里面也有<div class="pf">,那么您针对您的词典制作的CSS就会影响其他词典。正确的做法是,把整个词条的所有内容包含在一个div标签内,并且给这个div标签一个很独特,针对您当前制作词典的一个id或者class属性。比如我们可以修改上面的例子,如下:
) T( D% j- y+ ~& C# a4 I- |# E" |& p# a$ T% j5 H

: n$ b0 c$ u" g5 ?8 Y
; `6 M# D) y* v! ^' E这个示例中,我们用了<div id="tldimproved">来包住了您的词条的所有内容,这样,在CSS和JS中您可以仅仅针对您的词典内容进行样式的设置,而不会影响其他词典。那具体该怎样设置CSS和JS呢?请继续看。9 z8 f' C( S3 N- D6 s
! Y) [# H, o2 g& j: T! j

$ B8 }: s' P, g9 s. ?8 T1 O9 K
  • 正确使用CSS,仅仅对您自己的词条设置样式
    5 ]* i, S& p# H
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您设置CSS时候必须只针对您自己的词典,这样才不会影响其他词典的显示。有了上一条的包含住整个词条的div标签,这个任务就很好完成了。
! |1 D) m- C, C8 g' K3 K4 J
: _0 G% k7 s, i; g  x7 L比如假设您的词条中有一段内容:
, [4 {  a8 v1 h5 V* n  R8 l7 L; w  O- q9 O3 U/ r
<div class="gdc">
+ f2 h+ c& X* ]' N5 A        <div class="dcb">
  u' z2 C8 t. d  k3 \            <span class="pos">n.</span>. O0 _; [7 \* h' l. s; n
            <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>
% U/ O5 H8 y' a2 S        </div>) O8 P1 A6 i/ X& N/ `4 }. T1 H
</div>
$ [% Y* y/ Q+ W- c% Y( W, v1 I: d) W" Y( X8 X* Z

! e4 @1 n1 H! Z要对这个class="gdc"的div标签设置CSS,你可能会写:5 r6 O7 {! W; j: d& I! W

, u5 d: `7 \& D.gdc {...}: y% X3 d7 X+ M; K2 R, q: p% l

* b( k" \# [; K& W' D3 p或者
0 m+ M  {! J' V' g' w9 T# Y" u- E& a; T$ R
div.gdc {...}3 Y1 O. z# e  T1 c

# k4 m8 C/ t4 n) s8 }. W: x这两种写法都不好!因为我们已经有了<div id="tldimproved">包含住整个词条的内容,那么正确的写法是:
# R9 O. C6 X! i. k& y, Z/ h$ x' y' `% G8 o$ I1 i
div#tldimproved .gdc {...}
/ P! f: F6 Z2 i. d8 N& ~2 ~. z或者
' r& R& c& @1 X) k5 k  L+ Jdiv#tldimproved div.gdc {...}
: T: i) j- R( w, p! o或者- D! F& f0 ?; Z' j* h' Q/ ]% L# I: I
div#tldimproved > .gdc {...}3 D1 @: c# f% Z6 U
或者
9 r4 e+ J9 ]* W0 b4 ~/ C  mdiv#tldimproved > div.gdc {...}- o2 U( ?: N3 [& ~+ Z
9 r: e# [1 U/ Z+ z, ]9 _
这样写的效果是,您指定的CSS只会对<div id="tldimproved">里面的那个css等于gdc的标签生效,而其他词典不可能有一个div叫做tldimproved的,这样也就避免了CSS的冲突。7 o6 J' f; i3 r9 `$ V0 @

% I" Y; p# f) J! }6 }$ Y2 B! T+ G2 L8 Q0 v6 B8 X% u
  • 正确使用JS,仅仅对您自己的词条内容进行修改! |* ]0 @. e/ D& R% ?! E
上面我说了,最终查询结果的网页中,您的词条内容仅仅是其中的一部分,所以您编写JS的时候必须只针对您自己的词条,这样才不会影响其他词典的显示。有了包含住整个词条的div标签,这个任务就很好完成了。
$ v4 ?$ c9 s* V通常在JS中,您最终的目标是动态地修改您的词条,不管是修改内容还是修改CSS,反正目标就是修改。修改的第一步是获取要修改的对象,获取的对象如果错了,那么您做的修改可能就应用到了不正确的地方。比如您想给您的词条中的图片加一个三个像素的边框,如果您使用JS不当,那最终结果可能是您修改了所有词典中的图片,都加上了边框。那么怎样正确地获得你要修改的对象呢?我们还以上面的示例代码为例:
& f" q0 f' t( N  ^
: e5 _' `9 R2 T1 f<div class="gdc">/ w+ I; Y7 ^8 n1 P- M1 d
        <div class="dcb">( I( ~1 H. m! p# [; P
            <span class="pos">n.</span>" H8 N* R2 J/ V/ n) u5 L
            <span class="dcn">(提供各种生活和服务设施的)汽车宿营地</span>1 @3 w9 Z2 N5 {
        </div>5 D2 g3 H; ?9 B8 `4 Q
</div>9 k- Q/ p) t: P+ n6 G4 |
5 C1 n$ I/ m. l- W# n% `+ \  q5 ^9 n
正确的方法是:
- x  l, [# P6 V
. o3 C5 C; z& S1 r3 f如果您使用jQuery:
' }- W! L: j4 E- m+ M7 h$("div#tldimproved div#gdc")
7 P$ y) i9 o6 E2 K7 P: ~# o或者
) q! z+ h" b5 r/ ^8 j6 Y! d$ a. M$("div#tldimproved > div#gdc")
$ r  g1 a8 f2 I% ?, `* t  R或者' M, ?9 l9 f# J% p, p- f
$("div#tldimproved #gdc")
1 Q) U% Q8 g) O9 N或者
. a- y% ]/ H6 k0 P$("div#tldimproved > #gdc"). t7 B$ o; {- m; `
$ Q3 y3 K8 u" S5 A( A& ?
2 A" H* C2 T: G9 i5 t6 c& q( t
如果您使用的是vanilla JavaScript,那么正确的方法是:; ]' i& [$ j; E) f/ S' H$ U4 U5 H/ u
document.getElementById("tldimproved ").getElementById("...")* H1 V4 j) ~* Q
或者
% x: _8 S7 N+ R( K- M9 j8 r( k* ]' Kdocument.getElementsByTagName("body")[0].getElementById("tldimproved").getElementById("...")
# U1 f4 t& Y. h  T* b或者2 T" z" Z: W% B# V5 S- b
document.querySelector("div#tldimproved")....
/ ]7 _6 u2 T% A或者
& R% ]. b$ K4 e& L1 adocument.querySelectorAll("body")[0].querySelector("div#tldimproved")...." `! f, O  q6 ?$ U" V2 B
等等,因为vanilla JS写起来比较复杂,我仅仅列出了几个常用的函数,大家应该领会我的意思了,就是你不管干嘛,总要表明“我想要获取的是id等于tldimproved下面的内容”,这个思想和上面的关于CSS的写法是完全一样的,目标只有一个,就是您只是修改您自己的内容,而不会影响其他词典!/ Z$ m; Z3 {4 t8 M+ ^7 L

) l0 R, C) v$ [7 M- \5 p& J, \& ?' T
  • 正确使用CSS reset framework
    ' m- b- q/ `2 y5 A8 u/ r
现在有很多CSS reset framework,有些人在自己的mdict词库中使用,上来就是:8 q; e# m( t8 S0 A+ y; v
* {
4 F# W/ c5 F, K( l5 Q) D  box-sizing: border-box;
. E2 b9 c% N' f; T}
. q/ A+ s: c+ Z. V. m. p# _4 F( v$ ^::before,
6 t2 k  n5 d  z! e  x8 ~::after {
- O' P% E9 I. A% Y' P& \+ e  box-sizing: inherit;
$ K  n# S# P. T/ H4 L, L. h3 b}
! o7 W( a, c7 Z9 phtml {
6 `6 W9 n4 F; G" b7 F4 f! f  line-height: 1.15; /* 1 */
7 z# X1 Y4 _# K  -webkit-text-size-adjust: 100%; /* 2 */
: v; H4 j# Q) V' Q# U+ {9 _( U7 z% Y  -webkit-tap-highlight-color: transparent; /* 3*/4 L; f- P& W4 Y) Z7 e. U/ k
}6 r) u- J6 \- {+ O6 b
body {' a2 ?0 P+ Y1 a* J
  margin: 0;: p! x! Y+ H+ Z: S* }# D) |
}) ]- o; a: _, e  K" C; y, f5 E
main {" x! t7 [$ J- v0 E$ z; O9 k
  display: block;
$ q* U1 ~* ~0 R1 o5 o/ ]}
; Y% W7 J$ a. E2 P- x( L" J0 g4 [

+ `4 [2 g: X; m这么做不合适!如果你理解我上面反复强调的内容,你的词条只是最终查询结果网页中的一部分,那么相信你能理解为什么这么做不合适。你的词库只应该设置你自己词条的样式,而上面的CSS修改的所有词条的设置,尤其是box-sizing,这会导致其他大量词典显示不正常。正确的方式是,仅仅修改你自己词典的样式!所以,你可以写成比如像下面这样:
2 Q# B0 }2 p. o, A* Z
/ `1 i0 ?& Z% P. U) Mdiv#tldimproved * {
2 _2 |* R" x$ `4 h$ r. F6 }    box-sizing: border-box;3 g$ o) }, x9 g! c+ T& `
}1 S  V, N! K. O3 n* O: e6 H' ~
div#tldimproved ::before,
4 E. }% [# p- \div#tldimproved ::after {
, `1 T& H# x6 \% \) R# l7 [    box-sizing: inherit;
6 Z7 h  D: U4 E}9 `/ c. ~: \* R# ~$ q8 H
div#tldimproved main {
% d; h# R! n  O7 W* c0 `8 S4 S/ b    display: block;
! x4 V( c8 N" I! m. r}
; T% `. U' k" J& z8 X5 {+ Q# t# e( h

3 g* w& B- \1 O- I大家理解我的意思了吧,牢记一点,只修改自己词典的内容,不要影响到其他词典!0 C: s/ [2 Y4 M# O
1 |+ l: C4 u& r/ G7 s# f

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

评分

2

查看全部评分

本帖被以下淘专辑推荐:

  • TA的每日心情
    擦汗
    2024-2-8 08:54
  • 签到天数: 902 天

    [LV.10]以坛为家III

    发表于 2019-4-24 20:25:05 | 显示全部楼层
    经验好贴,先收藏起来。赞。
  • TA的每日心情
    开心
    2022-1-21 00:52
  • 签到天数: 699 天

    [LV.9]以坛为家II

    发表于 2019-4-24 18:44:09 | 显示全部楼层
    本帖最后由 cocowind 于 2019-4-24 18:45 编辑
    : C) ^# x; ~" L/ R, w9 ]* x- i0 K& B: q  ]4 _. a1 K9 `6 e5 ~; V
    赞成总结一下制作词库应follow的 best practices。
    + {" C2 H. ?& ?0 S. ]1 {! X9 r, q2 g* M
    3 A2 S2 G1 \+ e7 u$ \9 [  K正如楼主所说的,手机上可能必须把很多词库的文件放到一个文件夹里,因此命名不能过于简单,否则可能因名称重复而导致js/css互相干扰。
    & r4 M3 a/ j. _另外,鉴于有The little dict这样的发音词典大全集,所有词典的音频文件都应放在“词典名字.1.mdd”里,用户可根据需要选择是否下载以避免臃肿。同时,css中设置自适应代码,当文件夹中没有“词典名字.1.mdd”时隐去发音图标。# }! c: S: f3 j( Q3 n# W
    还有,双解词典应该有中文翻译内容的隐藏功能,要有标注以便可通过js来实现。' |: V8 O; Q% U& r
    6 ^! l' l) K9 S& t# b2 S: e

    * L# I3 Q/ B- g0 L/ x
  • TA的每日心情

    2020-8-15 10:40
  • 签到天数: 146 天

    [LV.7]常住居民III

    发表于 2019-4-24 20:21:05 | 显示全部楼层
    cocowind 发表于 2019-4-24 18:44
    % J$ v4 ?* T% ~! |. \7 p' H; ^赞成总结一下制作词库应follow的 best practices。
    9 {6 P4 ?8 ]3 M; ?6 T% K+ E/ F" i
    ' T. a1 y6 D- A% {7 L正如楼主所说的,手机上可能必须把很多词库的文件放到 ...

    6 v3 l& |6 U' V# S, T, x, c2 e1 U在手机 必须把很多词库的文件放到同一个文件夹里,这个到没想过。
  • TA的每日心情

    2020-8-15 10:40
  • 签到天数: 146 天

    [LV.7]常住居民III

    发表于 2019-4-25 06:01:26 | 显示全部楼层
    - c. D: P6 g- k3 W' S
    经验虽好,但是不可能实行。
    % p+ g2 O( E7 v& V" \/ l; T
    / K. j% h" h: T现在好多词典基本的 html / css 规范都不能保证,如何保证你这些额外要求。' g! C4 C: Z! ^7 j: H$ J
  • TA的每日心情
    开心
    2019-6-23 00:02
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2019-4-25 12:31:22 | 显示全部楼层
    zzzz_sleep 发表于 2019-4-25 06:01
    5 r; L; _' e# T: i7 Y+ k3 [经验虽好,但是不可能实行。
    + V! B& |) o: ?
    $ s4 Z! A# h( B3 `现在好多词典基本的 html / css 规范都不能保证,如何保证你这些额外要求。
    : G: G$ K% N% H$ u
    您说的很对,昨天看了一下朗文五加加,标签都没有闭合。这个只能自己修改了,或者自己做词库的时候遵守这些。( i' x% _+ t( x3 f! n& i

    该用户从未签到

    发表于 2019-6-7 00:40:30 | 显示全部楼层
    thanks alot
  • TA的每日心情
    开心
    2022-1-21 00:52
  • 签到天数: 699 天

    [LV.9]以坛为家II

    发表于 2019-12-20 13:44:17 | 显示全部楼层
    正确的做法是,把整个词条的所有内容包含在一个div标签内,并且给这个div标签一个很独特,针对您当前制作词典的一个id或者class属性。
    $ l7 p( I4 [( W, ]& j! R+ g-------! b- }- v3 A1 q6 Z( @
    学了点HTML/css的皮毛,回头看这个贴,觉得楼主说的这一点确实不错。
    1 Z' n2 Q1 B. u& @很多mdx/css没有做到这一点,好在GoldenDict自动把各个词典查询结果分别包含在一个div标签内,不然真的很容易乱套。
  • TA的每日心情
    开心
    2026-5-27 19:42
  • 签到天数: 1051 天

    [LV.10]以坛为家III

    发表于 2020-3-9 08:35:42 | 显示全部楼层
    学习了,收藏。
  • TA的每日心情
    开心
    2023-6-12 12:16
  • 签到天数: 451 天

    [LV.9]以坛为家II

    发表于 2021-7-26 13:35:13 | 显示全部楼层
    请问一下,我想把一万多个单词的mp3音频制作成一个mdd格式的发音库,该怎么弄?
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2026-8-9 06:53 , Processed in 0.024317 second(s), 29 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表