TA的每日心情 | 开心 2023-9-27 20:45 |
---|
签到天数: 847 天 [LV.10]以坛为家III
|
本帖最后由 nullname 于 2019-9-30 10:39 编辑
3 m6 F% W, @% v; a4 Q) y3 J1 ` j3 s: v/ y- S/ T6 `" ^6 d$ n
一、前言
2 w. P: U2 ]' |" E9 D2 X1 L! F) L$ m. f+ u+ c0 Z0 q
本篇文章的所有部分均来源于书伴的《如何把 MDX 格式词典转换成 Kindle 字典》 ,只是仅通过该教程的方法所转出来的词典基本没法用,原因是Kindle不支持@LINK跳转、不需要音频、以及需要添加Kindle支持的变形词搜索功能。经过几天的摸索,逐渐有了点头绪,并制作了AHD5th,试用两天后觉得尚可。便于昨天发布。帖子见此:[Kindle词典]美国传统词典American Heritage Dictionary 5th(精制版)。
5 ?% n+ D8 z2 d
& H c2 h; t- i& {9 b7 Z+ V3 _本文章展示如何通过Python来最大限度的优化以生成体验较好的Kindle MOBI词典,为各位提供一种思路,以期众人群策群力,制作出更多好用的Kindle词典。
. A h- g! f, O M
, M2 W5 w% `( |6 D: Z; u为了文章的连续性和完整性,对于完全相同的部分将全文引用这篇文章《如何把 MDX 格式词典转换成 Kindle 字典》 的内容。! o9 g- n! a+ b4 _# m
) V+ m/ Q; W W! H6 D0 }
1 A6 G0 z7 V/ W* y4 [: p$ z二、正文 " c# A( M9 i) }
' O5 x, W+ [4 i |! K6 ?( J0 U% D9 g书伴的这篇教程共有四步,还用到了一些工具。工具请自行下载,因下面所用的代码是Python 3的,所以除了Python 2 ,Python 3 也需要安装。第一步和第二步是一样的,不赘言,仅截一张图于此。
- c3 C8 F8 ^' d6 Y5 ~1 d2 T$ |9 d* |( e9 k2 F/ g
' a( H( ]6 B% M4 }: k/ W
# Y) X; f `7 {, b
8 U" i: G* O- E9 a3 {5 I9 m
1 ^' k/ b# k& r7 \工具准备好后,选择你想转制的MDX词典(本文只针对英文词典,即英英/英汉),下面以论坛里的American Heritage Dictionary 5th [IPA]为例。
; w) k/ R7 O |/ z0 G' L+ h
- a: D* V0 e- d5 R4 m/ D# |! g" [
' _% m* ]& X- I& i经过第一步和第二步的处理,我们会得到一个体积较大(视MDX而定)的TXT文件。其内容格式应该是这样的:- i" t+ n4 ]! b1 l
( h. S$ U6 m8 f6 ?! H! T" _) ?- p' K& o% |
8 X% G! v7 w1 n. H0 [% l+ R
( w" S6 {% v2 V% F- ?; d, E: g5 Y4 }* }1 ]
得到该TXT文件后,我们可以选择几行看一下或者搜索一下如".jpg", "<img", ".wav",="" ".mp3"之类的关键词,把图片和音频等等鸡肋全部删掉。同时,这类CSS引用也可以删掉,以减少文件体积,提高后续处理的速度。CSS引用可以在最后一步添加。比如随便看一下,扫一下就有这些:
& s% i5 m* b# z( @, t& B* H3 q# A; [( h3 J) U( ^& d0 r- T( |
: i9 P" L5 `7 R5 T3 v1 A" Z. ~' w. {7 z: k% n3 p& S$ R
. j& s3 t0 k3 j' k5 H# V
( a! A' f0 x+ C! b0 B0 D4 ]我用的是Notepad++,以下是我用来替换的正则表达式:
2 O- l9 }+ p$ `! T9 y1 [; }
% Z- S+ Z9 \2 H* Q! w 图片:<img.*?>
# l, {& [$ w+ H- \% W 9 j/ h; n( h4 \$ e( D
音频:<a href="sound://.*?"></a>
; r" V+ f- K& X+ B3 h0 g( T0 T9 v+ K! f! @; Z3 [
注释行:<!--.*?-->
) v3 g( X; ]& a0 y( h! L6 V+ {
1 p; Y5 ]# L# p* L! \可能还有一些冗余的标签,视词典而定,比如我这里就有<span> </span>,直接全词匹配删掉即可。
9 {/ [7 Q, v! h4 q$ S
$ Q- F, r) o+ t8 \& |9 n2 v我这里这样处理了一下之后,文件的体积直接下降了25%(约100MB --> 约75MB)。
: C" S& T1 n3 m9 Z' N- ^
/ L1 ~" ?, S7 ?* i0 Y1 ^简单处理完之后,便是正式处理@LINK跳转了。TXT文件的格式只有这两种:单词 + Tab + 意项 或者 单词 + Tab + @@@LINK=另一个单词8 O& m1 {* D$ k7 i1 h
7 J- S# ?! M- @8 T1 |这里我们主要要将跳转词后@@@LINK的跳转链接替换成目标词的意项,因为Kindle不支持@LINK跳转。为方便后续称呼的方便,我在此做个定义。以开头两个词条为例:+ g" X p6 t8 S/ U
. b4 F0 U, k( u# i8 f$ K
4 h# N! p: I# b# ~9 ~
9 S. d$ k6 ]" d! @
1 T( J7 _& I& n9 x; t8 R- ?% ^! t1 m( G
但是这里也要分情况,因为如果一股脑全部将@LINK跳转都替换为目标词意项的话,看起来简单。但实际上会导致文件的体积无比巨大,因为里面存在着大量的像这样的跳转:
! Y) L9 c0 L; k8 v* _
3 C L s- y: i# P
8 m6 p% W9 Z( R. e3 v( Q8 l: O/ \/ C7 X
- N& L }9 g! }' d! `4 J/ v5 {
- G8 L/ |* ^; Z S# ^0 X仅仅是advocate这样一个词,就有七个变形词,它们的目标词都是一样的,如果只是粗暴的替换,那么最后生成的词典肯定无比庞大,甚至如果你内存低点最后都不够用来生成词典。(猜想而已,我没这么干过,有兴趣有空闲的朋友可以试试)4 `/ H/ R0 U; K% i* ^* m
4 U$ a- d, t. P3 {( @# h% m
因为Kindle词典支持为某个单词添加不同的变形词,利用这一特点,我们可以在此处判断,如果跳转词是目标词的一个简单变形,那就跳过该词条。判断的依据来源于dsl2mobi这个工具里面附带的英语单词变形词列表。文件名称:forms-EN.txt,内容如下:
0 `) `% a& p. f1 Z, E. k) W
1 `( X! h" Z7 p, L4 w8 V! L
0 g6 |5 j; ^! _& c7 m1 u' U
! B9 \, I$ T! _7 R d7 q, ]3 _ n
c; a6 V2 n3 F
简单总结一下,做了个程序流程图:* o7 a( a0 d' d3 \4 p k# Q5 {2 \
0 M2 y, P: M4 r9 c
7 F( r& u4 x8 P/ B0 T
( f4 P8 d m& S: Z- \& x7 }" L- m: g
3 t* w# V# }' I( U: B! m3 V$ ?; D C0 A( C' a' q+ l
这是代码,你需要修改第3、4、5行的文件路径和第50、51行endswith方法和replace方法中的值改为你操作的字典的实际值。详细的内容请看注释。3 I. L# Z/ k6 l. d
) }9 ~- L; e3 H4 X2 h( V4 G O' {3 T- N6 M- x
* N. `4 ~) l( v+ i- E! k
* S$ C0 ^' |4 \1 R, N. \9 ~' C' I' R# x3 _/ ^1 v; D
6 g s& b( [- _+ z* T! {* z+ |% |# ~
& t& P. M7 H* j3 J* i
注意:Fix_Redirections.py有一个同级文件夹wordforms,文件夹内有forms-EN.txt,请勿修改。
9 F K9 n+ R4 L
, o/ u5 s! ]3 t3 `8 Z0 \. r
: ]; r: Q1 \" S$ H$ ^( e- u修改完了然后执行代码,你看到的图应该是这样的:
( N3 W( l0 [/ B. Y0 T1 X# q: k1 v* }
+ _. G: y6 } y$ g9 d
5 K7 A1 T* ^9 v8 Y% m4 T ^
* w, v! B3 l' Y% D$ j% [& o+ \& U
% g) f" x2 A, v% }, b这一过程的速度取决于你的电脑配置和词典的词头数,我跑这部AHD大概花了大半天的功夫。2 p- M: d$ H. _: _/ l
9 y$ Z5 j. M$ W$ T' i
跑完之后的文件可能存在很多空行(不一定,看词典),这里附上一个去空行的脚本,使用方法:# y3 T. S5 v$ O1 u! l
& e+ v1 T" r% Z3 d; }0 D
; u5 `7 q6 @! p( Y8 I6 P/ r0 `* @& g8 ^+ [# C$ v: m
1 F' b; W6 `& N
* _- c* d( V" D- g( a9 A k6 f
" j0 c4 Y" |8 i5 d6 p: I
( v7 @; y& l4 C9 P执行完成后会在处理的文件目录下生成一个名字带_stripped的文件,这就是去除了空行的文件。7 `" U" y' R: Z8 g" ?% z7 E
( J5 k8 Y0 [3 X# g0 ]
$ \, `0 a; ~- ^: e
9 I, i( b' p8 l9 F. n, J
8 D' p+ x, H$ x2 J+ z& d4 d4 X) g6 D% S6 Y
这时候可以打开文件看一看,应该是满屏紧凑,没有空行,没有@LINK跳转的,就像这样:
( q" T0 Z6 B4 e' j: D! ]$ A. G3 h" d+ P1 G5 ]* P# E
; B3 Y( w4 ?3 `1 C+ a( m- W3 s
: }* b( G; F" R6 Z1 D3 I2 H
: P- v- q Y( A+ w5 f
, V4 A4 m; ?, w! X+ ]6 U( s到了这里,就可以开始正式进行第三步了。这里用到的是tab2opf.py这个工具,该工具基于py2,所以要用py2来执行。从书伴直接下载的tab2opf虽然没问题,但是根据我的经验,把253行的print df给注释掉,速度会提升许多,而且出错的机率也会减少。除此之外,由于词典的不规范及其他特殊原因,我们上述生成的xxx_stripped.txt难免会有几个或十几个错误行(MDX词典本身的问题),因此,最好加一个异常处理的块,遇到错误行直接提示一下就跳过,免得程序中止运行,你们可以参照下图修改,注意红色箭头的地方。
; W* M1 W( V: ]: u. i: M8 [% n$ k, o' ?* m1 D
8 ?6 ]6 p& Y# `2 i
/ j+ H% o6 W! F& V* ~1 @6 p8 ^' i7 K+ H% r6 X7 p E. a2 Z0 l4 Z
4 |, h4 J+ _( @& c; L2 R2 G( D
然后执行命令:python2 tab2opf.py -utf xxx_stripped.txt8 U7 n; p# Y% x, c g- S1 N
3 s8 O) N* w' g2 h; e7 C% C; q执行完毕后会生成一个opf文件和一堆html文件,如下图所示:
( H$ _5 b3 N+ P
# g% r" j: K6 a
1 ~8 Q _! C4 d: z6 U, D( Y* T) s7 a$ q& [, b( J
1 K ^% G3 Q7 l U: A* C5 \4 a. ^! u1 }8 \( _9 s
在进行下一步之前,我们还得写好CSS,我的电脑配置不行,打开太大的HTML文件很卡很卡,因此我提取一些意项较多的词条来单独修改建议"go", "take", "in", "the"等,这里我提取“go”词条,复制"go"词条所在的一整块<idx:entry> </idx:entry>,然后加上头和尾(头尾可在任意一个html文件中复制即可),保存为html即可。如图所示:" l/ J6 e6 s W' [
4 P4 A* o/ {- I2 l4 c' q7 @
1 F l4 |* G& U$ C. ^
5 E& r$ q4 `* E% [! N& A# s1 c) [4 ~4 P6 S9 \! U. \
/ F: H0 J4 w# |* ?$ [
因为我们要测试css,所以再添加一个head标签并在其中用link标签引用一个css文件,然后就可以写css了。4 p5 r$ ]" [3 W
4 r& ~0 Z5 y) t3 S. w3 j7 N% b- V
) O1 }2 a3 R% d, P, ?
`9 r! _- D% l3 Z8 G3 N7 p4 }0 C* Q, ]5 p( ^, o& |
/ k' P2 v. v. _3 h. I0 T9 V
MOBI的字典只能生成v7版本,该版本对CSS的支持极其有限,margin只支持left其他方向都不支持,即使是看起来有效的margin-left,也不过是在转化过程中替换为blockquote而已。所以只考虑粗体、斜体、下划线和颜色即可,当然不管这里用什么颜色,Kindle上都是浅灰色。/ j; G( a- Y& Z- R% ?
% J& d, C7 T" c* F
这是我修改完毕后的效果。" n8 q2 D- g6 t/ G
J5 S2 ?/ m- Y
& k; o- o- e" H. Z1 h% F. g: {. b8 C2 b1 `
- v" B& _6 G7 X
9 w7 D3 U' c! Z6 ucss满意后,那就可以给所有的html文件批量添加link引用了,这里notepad++可以单独完成,就不写脚本了。方法如下:% U* r8 C3 n% S* Z0 u1 l
+ P: H2 }7 x3 q2 T/ F* P# o
打开任意一个html,Ctrl + F,然后切换到文件查找选项卡,下面注意选择正则表达式,如图所示:
4 M$ N( d/ J. u5 V% _
5 Y* m8 i+ A' ^
8 H9 H: _! p* Q8 t8 U* Z, P" i* [3 ]
1 Y, r; ^5 v% R: M( Q5 m( u8 N- W$ y# x. R4 a
; Q3 z: H3 ~3 d* Y6 Y$ p0 o5 @) b) B: c% G, T1 S* f& z
查找目标: (<html.*?>)
0 a! m7 F0 x3 a( t6 D L
, O: U( S2 s, P0 ~% P V! l3 ? a+ d替换为:\1<head><link rel="stylesheet" type="text/css" href="test.css" /></head>
+ _8 t% k4 \: S! q
; |3 Y1 I& M' x0 L ~文件类型:*.html$ k- t8 u% K4 R/ c ^& |
/ V! |4 Z8 ]4 N* a
目录:即html文件所在的目录
, |5 ~; P& B5 ?8 l- C% Z( Q9 p" o
5 O/ \0 f' d. n* q) r$ ~0 Q# g
3 @1 g) l' ^3 r然后点击文件中替换即可,这样,所有HTML都添加了CSS引用了。+ c6 Z* U2 ^3 F
4 O/ u7 r, c) m" }$ y
现在到了另一个重要时刻了:为即将生成的Kindle词典添加变形词,原理就是检测forms-en.txt里面的单词然后提取出变形词添加进去,上面说过了,此处不再赘言。
( m* p' L0 }" g) P. u6 \2 P1 N; X. W6 m0 b; M
代码很长,不贴了。用法很简单:Add_Infl.py html文件所在的目录, C* p1 w6 I* g% p. O n: q! ~
% t9 B" d$ W N* h
6 G& u: D# K. O' b. r V3 |* R9 o( a; o6 f
- e. |$ U% r7 B7 M
" X- Q' l! F. k& }: G" V文件在此,解压后其他文件和文件夹勿动,以免程序不能正常运行。* `2 W; W! M8 I$ ?+ {
0 i4 T. h$ l+ X7 m5 C8 }2 N5 k) ?7 J/ t8 B' X
6 w6 q' \% [7 ^7 s, W3 l5 d然后会在目录下生成一个名为OK的新目录,新的HTML文件即在此。. ] C4 `1 f( p9 H6 ~! X, c9 V G4 T
! u/ ], t, o1 M [/ F- S
最后就是把之前的opf和css复制进去,然后用mobigen.exe生成即可,mobigen.exe -unicode xxxx.opf% ^) u% |: X" q( k
F* a& L: ~! j. V如果你想修改生成后的词典名称,打开opf,修改这一行即可
: j @5 C5 n4 h/ H. B- {) p" r3 e# N. ?5 d( A6 {3 A
0 T2 Q7 C& k' W! p) b
0 S; i2 H4 ?1 u% D
8 }' p$ T0 S6 j) J, g% W/ Z
) {; z( R5 C. G- c完。- \& H2 r: m5 d$ i3 I
. I$ ]+ `# R3 l5 v7 M, S; H8 [9 L
三、结束! A6 ?% D: m0 H5 H2 V
8 N- V( D( X; I& ^! O+ v) s0 r第一次写这种教程帖,步骤、截图等等都很繁琐,几次我都差点晕了。简单看了几遍,算不上流畅但也不至于晦涩。若诸位有什么问题或发现什么错误也可以在下面回复,希望能有更多优秀的Kindle词典出现。
/ M$ R v9 j2 M
7 k, L) O5 ?" c2 n" L* A另外:关于Kindle上的汉语词典,我发现kindle支持将繁体作为简体的变形词,意味着若处理得当,那就直接为简体词头添加繁体的变形就够了,不必再另添词条,词典体积将大大减少。各位有兴趣可以试试。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?免费注册
x
评分
-
10
查看全部评分
-
本帖被以下淘专辑推荐:
- · 词典制作|主题: 217, 订阅: 40
- · 语言态度|主题: 150, 订阅: 19
- · MDX制作|主题: 46, 订阅: 17
- · 玩转词典|主题: 46, 订阅: 11
- · tech|主题: 2, 订阅: 0
|