TA的每日心情 | 开心 2023-9-27 20:45 |
---|
签到天数: 847 天 [LV.10]以坛为家III
|
本帖最后由 nullname 于 2019-9-30 10:39 编辑 $ j; E E! ^8 O6 Q/ M& B, {2 `
7 j8 [) l! t" h3 y& I一、前言1 L: H4 v! {9 H- F
1 ~2 J" M% i+ f) h+ n
本篇文章的所有部分均来源于书伴的《如何把 MDX 格式词典转换成 Kindle 字典》 ,只是仅通过该教程的方法所转出来的词典基本没法用,原因是Kindle不支持@LINK跳转、不需要音频、以及需要添加Kindle支持的变形词搜索功能。经过几天的摸索,逐渐有了点头绪,并制作了AHD5th,试用两天后觉得尚可。便于昨天发布。帖子见此:[Kindle词典]美国传统词典American Heritage Dictionary 5th(精制版)。3 \% r8 S3 Y) G# K; j6 f* c
! ~$ t, }! m" Z' J7 v) j* Y% \% \本文章展示如何通过Python来最大限度的优化以生成体验较好的Kindle MOBI词典,为各位提供一种思路,以期众人群策群力,制作出更多好用的Kindle词典。
& }0 Q9 u# j/ M+ G1 E$ ]' O1 Z1 b% D0 E6 h/ J! T
为了文章的连续性和完整性,对于完全相同的部分将全文引用这篇文章《如何把 MDX 格式词典转换成 Kindle 字典》 的内容。/ D4 F, t6 W& \1 L" m. M4 i F
% Z7 K' N, c5 `' |* f) M
1 M# T3 U* S0 M8 A1 w& k) o$ V/ x
二、正文 - s! `/ R4 ^$ s; K( V
6 F1 W; Y. h+ w
书伴的这篇教程共有四步,还用到了一些工具。工具请自行下载,因下面所用的代码是Python 3的,所以除了Python 2 ,Python 3 也需要安装。第一步和第二步是一样的,不赘言,仅截一张图于此。
8 V0 G( X1 X* x& c! Z V0 Q
3 [$ m, V- A( ^4 Y* T% j1 X0 \1 V, W. L
2 k7 T Z3 u' W( E* z* [
! W. M. U Z! s0 V8 M
3 u5 L5 @4 l4 _9 ^; y工具准备好后,选择你想转制的MDX词典(本文只针对英文词典,即英英/英汉),下面以论坛里的American Heritage Dictionary 5th [IPA]为例。( m/ J3 o# z+ ]$ M( M% X
* }% D7 r. c a- u4 Q- Z
, W6 D( j! x3 t" Q+ Q经过第一步和第二步的处理,我们会得到一个体积较大(视MDX而定)的TXT文件。其内容格式应该是这样的:
0 I& U2 l' I9 W3 u3 L4 M. X; X( ?& c5 e; z* @0 g
, ]5 Y. d' `! C! b
" }. t- f3 v1 a' r/ l" j; v
" c1 N' Y _, j4 K
8 v: M8 V1 F; C# I( R+ x$ C" X
得到该TXT文件后,我们可以选择几行看一下或者搜索一下如".jpg", "<img", ".wav",="" ".mp3"之类的关键词,把图片和音频等等鸡肋全部删掉。同时,这类CSS引用也可以删掉,以减少文件体积,提高后续处理的速度。CSS引用可以在最后一步添加。比如随便看一下,扫一下就有这些:
$ Q+ q- y1 e( `- g
6 x' M$ Y; A) O% ^7 M" h/ u7 O3 p- C/ j. T. K
6 W y4 i9 O% U' v9 k% n9 K8 o N' J+ g9 `' {' }; q, e
' L" v1 K# W- h7 S% A
我用的是Notepad++,以下是我用来替换的正则表达式:) x4 v) M' u- N( y9 D+ z5 t: g
9 T& L2 o8 w- N( d, Z5 z l/ U 图片:<img.*?>/ @9 o4 j- E2 h* u7 ]
; f9 Z O% e* I1 |4 ?& H, V. i2 C 音频:<a href="sound://.*?"></a>
# L+ c$ d; t9 e8 D$ M+ c7 x6 k2 d4 t2 O6 b) U. I
注释行:<!--.*?-->8 l. | p$ [+ _# l' X
4 d2 b: H2 j$ [ z/ u' x可能还有一些冗余的标签,视词典而定,比如我这里就有<span> </span>,直接全词匹配删掉即可。: S2 v% |/ m- ~$ t9 T
8 Z- p# {1 Y2 i
我这里这样处理了一下之后,文件的体积直接下降了25%(约100MB --> 约75MB)。
# q+ f9 X% h. s' G. b* I& r5 \- P- Y
简单处理完之后,便是正式处理@LINK跳转了。TXT文件的格式只有这两种:单词 + Tab + 意项 或者 单词 + Tab + @@@LINK=另一个单词
% D: o2 ^0 D2 d+ a
* q/ q1 ]3 F: j" b0 S$ P1 J这里我们主要要将跳转词后@@@LINK的跳转链接替换成目标词的意项,因为Kindle不支持@LINK跳转。为方便后续称呼的方便,我在此做个定义。以开头两个词条为例:. s. p/ k9 N i$ D/ N; W! M
9 b# g( ~, A) M1 l5 B" y, L
+ p& J- C" ~+ b Y9 n4 X2 n
" Z, E& K+ u8 U3 V! ^4 X4 D* q( C5 v8 Y# a/ U ]3 ~1 _
! J- q" M/ Y/ [, T
但是这里也要分情况,因为如果一股脑全部将@LINK跳转都替换为目标词意项的话,看起来简单。但实际上会导致文件的体积无比巨大,因为里面存在着大量的像这样的跳转:
+ r* f4 t# p9 H @+ F/ u+ ?, p a/ X1 I" I+ k& W( T" \! Y
; ~2 L3 ?9 |8 ]$ X" ^* i2 ^0 O$ d% T
3 l6 f' i$ H5 ]* l
/ Q( v M x# Q) c4 p仅仅是advocate这样一个词,就有七个变形词,它们的目标词都是一样的,如果只是粗暴的替换,那么最后生成的词典肯定无比庞大,甚至如果你内存低点最后都不够用来生成词典。(猜想而已,我没这么干过,有兴趣有空闲的朋友可以试试)
3 E8 p: z/ o6 j/ u* [ q/ }& D. P) O; K4 a
因为Kindle词典支持为某个单词添加不同的变形词,利用这一特点,我们可以在此处判断,如果跳转词是目标词的一个简单变形,那就跳过该词条。判断的依据来源于dsl2mobi这个工具里面附带的英语单词变形词列表。文件名称:forms-EN.txt,内容如下:
; D3 k. K) e$ Z5 k5 l! \ s* Y% c: s' s0 ?+ s5 ]7 u- y
. E- B2 ^# |: {
) G& [4 E) Q! ] 2 C3 {7 J7 ~- U0 G, |" Q( M
8 w% N4 [% M1 R' l) o- A' a
简单总结一下,做了个程序流程图:
4 m- P% n- p" d' w" r% w- v3 E# M3 K: I A6 i- C
0 D8 V% w3 U4 S: C5 J% I
( N8 I* \7 i0 u, _
4 b9 V! a0 E' k& H9 W5 i" L$ `8 s
2 q2 z9 w' U2 j这是代码,你需要修改第3、4、5行的文件路径和第50、51行endswith方法和replace方法中的值改为你操作的字典的实际值。详细的内容请看注释。( N8 _& k- T5 w$ }, C+ P9 E
; c7 x1 [5 o* s* E
5 H% J0 r$ r2 {! h) N
$ l) ~9 j4 n1 C6 O
6 z! y p0 j6 Y: a; y3 y
' \' F& {4 k2 v8 i( [, t0 b1 U6 W7 H- q- F6 o) q* U
$ g# C0 C( g- X" r
" Y3 j4 U% B1 T5 p- W: E, H注意:Fix_Redirections.py有一个同级文件夹wordforms,文件夹内有forms-EN.txt,请勿修改。' ?" S b/ Y6 c
% g6 y9 K, @$ C0 G5 W4 t$ E! V
8 t7 H3 ]8 Z2 ]; ~" E4 j0 R! K
修改完了然后执行代码,你看到的图应该是这样的:
" q/ v. n, P' p) K% G6 }1 D9 W- _/ s
7 A8 Y5 M6 l* [# W- V, t& x
+ J9 `2 f9 {) C/ n% m! v" m- L- o/ {9 K9 G& {
9 C4 V! s! Y6 F- y* c) T1 Y
这一过程的速度取决于你的电脑配置和词典的词头数,我跑这部AHD大概花了大半天的功夫。
9 f' E2 M2 C- _* h2 K% J1 X! a) Y' {. p! \! Q! p
跑完之后的文件可能存在很多空行(不一定,看词典),这里附上一个去空行的脚本,使用方法:
- a& h: _2 N8 u/ f* Y; j
$ _0 l$ n* ?. C5 X5 @1 y" v! G) v) {7 j- i1 M
$ m/ m& w$ A5 O( `5 d& d( f
! ?. [" t9 p+ P4 g# k2 c1 ]6 z+ t
- @- r& B- O. ^3 g& @6 T! g9 L3 y
9 r, e- S/ h& }4 B6 d6 [6 u$ O$ j2 a1 i' d9 I$ h6 J; T; Z
执行完成后会在处理的文件目录下生成一个名字带_stripped的文件,这就是去除了空行的文件。! k3 V1 B+ f0 g
, ~& Z. s- J0 a* O6 [& N9 p
4 r) s" S4 p7 @
: `+ U2 m9 A8 n, l& _7 Y# J
1 i* M2 Q2 [* h% v
3 s. X) }+ c' Y h4 W! g$ J. B! J% N% i
这时候可以打开文件看一看,应该是满屏紧凑,没有空行,没有@LINK跳转的,就像这样:1 H& t0 E! x& o1 C" ~
3 T/ v. }9 I c; }4 {1 p5 ]9 X6 I
! V$ e6 @, u9 @" k$ J
0 t. \7 g: I# r3 S/ i9 k- l
1 R9 I& N3 x* [3 t; N2 a# f1 k( L" G" C2 ~
到了这里,就可以开始正式进行第三步了。这里用到的是tab2opf.py这个工具,该工具基于py2,所以要用py2来执行。从书伴直接下载的tab2opf虽然没问题,但是根据我的经验,把253行的print df给注释掉,速度会提升许多,而且出错的机率也会减少。除此之外,由于词典的不规范及其他特殊原因,我们上述生成的xxx_stripped.txt难免会有几个或十几个错误行(MDX词典本身的问题),因此,最好加一个异常处理的块,遇到错误行直接提示一下就跳过,免得程序中止运行,你们可以参照下图修改,注意红色箭头的地方。
1 Y3 E$ y. @( P5 b& s
* J8 E: `4 n3 e& x7 U J$ A+ G S# Y8 `
3 x* p1 y) e: R- H- F3 }
/ h3 s$ p! P/ k
& {6 s2 K* O8 B- S+ V然后执行命令:python2 tab2opf.py -utf xxx_stripped.txt/ j0 V& J( ^* l' P
1 |) i, H" s" i$ e$ h
执行完毕后会生成一个opf文件和一堆html文件,如下图所示:( e- x7 T% U9 A# L, A% }
# u u: T& m: X( S+ f
/ }! u8 {8 W8 B/ `2 b
) l2 ^+ R+ e/ J R& s9 D% c; H4 I# X/ b h1 c! T7 r- X k
$ |, q. q9 f! o在进行下一步之前,我们还得写好CSS,我的电脑配置不行,打开太大的HTML文件很卡很卡,因此我提取一些意项较多的词条来单独修改建议"go", "take", "in", "the"等,这里我提取“go”词条,复制"go"词条所在的一整块<idx:entry> </idx:entry>,然后加上头和尾(头尾可在任意一个html文件中复制即可),保存为html即可。如图所示:
! y% J8 [- z. g; `& B: Z6 N1 G# a
{( U& [5 H. i# |* [7 c8 x8 ]% D2 ^5 U2 z+ O
- K) r/ ^9 b& x9 |9 Z6 l/ y1 o6 t% \, j$ P$ ]3 D; [; O
4 k# I z2 w4 B* a) z因为我们要测试css,所以再添加一个head标签并在其中用link标签引用一个css文件,然后就可以写css了。2 j- m5 F% A3 g% [7 ?" |. S- S
% b3 D! w6 g% u. v( O& T
; O1 f6 `4 d) |# Q
* ^/ l: t' T5 U; @
( r; s& s/ Z _) m8 ~+ y0 x: P. ~& B. o4 m4 i, j! d- e
MOBI的字典只能生成v7版本,该版本对CSS的支持极其有限,margin只支持left其他方向都不支持,即使是看起来有效的margin-left,也不过是在转化过程中替换为blockquote而已。所以只考虑粗体、斜体、下划线和颜色即可,当然不管这里用什么颜色,Kindle上都是浅灰色。
3 J2 r1 r* o& l# V7 t5 C5 s2 h" n
这是我修改完毕后的效果。
7 g1 f" E9 @' ~) b9 t4 M0 B' Z7 U; i H4 k
; w( Z3 N+ B! F$ N7 ]
4 [& U8 I X! h& |) H7 d
' {& ]: |% V1 ~, S! c& [1 c8 X; i: z% `, o6 n* Q5 n/ y
css满意后,那就可以给所有的html文件批量添加link引用了,这里notepad++可以单独完成,就不写脚本了。方法如下:% m- m' h- G! y2 d V/ n* G" i# N Q
h5 S# I2 p, A6 `3 H K
打开任意一个html,Ctrl + F,然后切换到文件查找选项卡,下面注意选择正则表达式,如图所示:; L& L, P: T2 h" X7 X- t! p
$ u) I* R" C% t" G: e; q; P. B
/ R3 D, @4 R# h+ x2 s$ Y2 X( I2 C* c! S! O K/ C# @) b G
( }$ z+ C6 Z0 V4 A' k
' h; ~# Y. P' I; x
3 g# \! e$ W6 t$ B7 r0 W( m, e2 }0 L查找目标: (<html.*?>)
9 p( g i5 f6 l* F/ S
( V( ?! G* ~. j: ?) X替换为:\1<head><link rel="stylesheet" type="text/css" href="test.css" /></head>
) v) Y s. A W! Q& b; p7 C( ^9 h: b. _! T6 f* @- W
文件类型:*.html
. z6 b1 [8 O# `" U) N+ J% _6 _" w4 r; d+ E8 V k% Z
目录:即html文件所在的目录' ~( ]6 T0 g0 v% A% ^) }
u, ^; V H" m, y c
- S2 l2 d" F, R) `# R( C/ G n( s, Z8 ~2 q. v
然后点击文件中替换即可,这样,所有HTML都添加了CSS引用了。
8 O8 D) D9 l9 x3 Y9 C* U! u8 T! P) p8 l" Q$ U: t! n
现在到了另一个重要时刻了:为即将生成的Kindle词典添加变形词,原理就是检测forms-en.txt里面的单词然后提取出变形词添加进去,上面说过了,此处不再赘言。
6 O; @0 X9 ?8 H0 u Y7 p$ Y
& m0 ?3 N, g) C' C. `8 x代码很长,不贴了。用法很简单:Add_Infl.py html文件所在的目录
, \. g5 I5 z; Q/ ^# F: D0 @) J4 v n& w' K+ v$ ], |: D9 f
8 {) p0 x- V8 U1 Q7 c: G
# c- M- X E$ d9 h# q5 R/ o* _% r
, J% k- W0 x( V& p
! O# U* T" \7 u& |6 B$ A0 M& D文件在此,解压后其他文件和文件夹勿动,以免程序不能正常运行。
" A+ [- ^; k. W1 J, k
* I/ C- H; G2 W) s M) {$ {" l! f2 T2 y9 }% Y$ U
- }0 {& W/ U2 `& F8 ?% E$ ^: i
然后会在目录下生成一个名为OK的新目录,新的HTML文件即在此。
* G' U: i2 K$ Z5 \( C" g
2 N+ L/ }+ H1 k, O: H7 ]. O最后就是把之前的opf和css复制进去,然后用mobigen.exe生成即可,mobigen.exe -unicode xxxx.opf
- S" Q8 [1 r: K1 g0 L$ u% }: O7 b: n
如果你想修改生成后的词典名称,打开opf,修改这一行即可% \* |! r1 z3 l5 x, C
( M' W, h& B9 g. a- g# f# A9 E
( Y! Y" L; `+ |+ {0 r: `% B6 u9 H0 }) {( T$ G8 _8 G
, ]1 S% r' s4 Z
( ~4 w/ V. J ?$ o/ `% o. j! V* U
完。
6 H# G/ q/ g9 ~6 o
8 S3 ]' x8 d8 Y- B, q4 Q. A X* \三、结束) a! o0 G" x2 F8 @( `
) O8 d9 R& j5 }3 D! X( {第一次写这种教程帖,步骤、截图等等都很繁琐,几次我都差点晕了。简单看了几遍,算不上流畅但也不至于晦涩。若诸位有什么问题或发现什么错误也可以在下面回复,希望能有更多优秀的Kindle词典出现。
% f) t) L" E- @: D9 A' g( f9 A
& X1 B+ p* ?6 ^+ ~& A4 G另外:关于Kindle上的汉语词典,我发现kindle支持将繁体作为简体的变形词,意味着若处理得当,那就直接为简体词头添加繁体的变形就够了,不必再另添词条,词典体积将大大减少。各位有兴趣可以试试。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?免费注册
x
评分
-
10
查看全部评分
-
本帖被以下淘专辑推荐:
- · 词典制作|主题: 217, 订阅: 40
- · 语言态度|主题: 150, 订阅: 19
- · MDX制作|主题: 46, 订阅: 17
- · 玩转词典|主题: 46, 订阅: 11
- · tech|主题: 2, 订阅: 0
|