TA的每日心情 | 开心 2023-9-27 20:45 |
---|
签到天数: 847 天 [LV.10]以坛为家III
|
本帖最后由 nullname 于 2019-9-30 10:39 编辑 # D1 H+ B) D- X) i$ Z4 e+ s8 Q
5 T5 K/ @ c) L/ K/ L一、前言
0 I5 L8 \3 H3 N5 P# B5 F! t6 i; u8 S M% f, T* x
本篇文章的所有部分均来源于书伴的《如何把 MDX 格式词典转换成 Kindle 字典》 ,只是仅通过该教程的方法所转出来的词典基本没法用,原因是Kindle不支持@LINK跳转、不需要音频、以及需要添加Kindle支持的变形词搜索功能。经过几天的摸索,逐渐有了点头绪,并制作了AHD5th,试用两天后觉得尚可。便于昨天发布。帖子见此:[Kindle词典]美国传统词典American Heritage Dictionary 5th(精制版)。" f# N/ f1 i# b
4 Q: h: i4 z' Q本文章展示如何通过Python来最大限度的优化以生成体验较好的Kindle MOBI词典,为各位提供一种思路,以期众人群策群力,制作出更多好用的Kindle词典。8 j- I, [# J+ {1 Y9 A: o8 o- `
" t: `( \5 F" ?7 k
为了文章的连续性和完整性,对于完全相同的部分将全文引用这篇文章《如何把 MDX 格式词典转换成 Kindle 字典》 的内容。+ s4 i2 {* q( |, P. \
# _: T* p5 M; k9 u% a6 a" u
0 m& |0 {: r0 k' M8 n- B7 k; c" w
二、正文
9 X2 h9 B9 @( ?) f( Y! C* s g
/ Y& G/ P+ s2 [书伴的这篇教程共有四步,还用到了一些工具。工具请自行下载,因下面所用的代码是Python 3的,所以除了Python 2 ,Python 3 也需要安装。第一步和第二步是一样的,不赘言,仅截一张图于此。
7 o$ T s s9 \+ E4 F
5 K7 [9 N( \2 ~+ ] Z( C7 C* O' z8 M i! f
9 A/ a( C B0 i, g3 q6 o% W
& y: {7 R+ a$ u1 n( z ?8 k9 `9 f8 L! |4 a" Q" q
工具准备好后,选择你想转制的MDX词典(本文只针对英文词典,即英英/英汉),下面以论坛里的American Heritage Dictionary 5th [IPA]为例。
1 @' T3 s, R2 L4 W
" x' x Z& t& P$ }
7 ]; o' O0 z6 r" s经过第一步和第二步的处理,我们会得到一个体积较大(视MDX而定)的TXT文件。其内容格式应该是这样的:
1 L& u J7 B9 |( Z
]( b7 p( f7 X- w" j* ~+ j8 g
0 |) \ \* H m: H) f# n
+ R8 E" S) l4 t0 M# @
9 ]; u! s$ Q) O7 o0 J5 h0 q
" P% v' w8 m& o/ Z; c6 h* c得到该TXT文件后,我们可以选择几行看一下或者搜索一下如".jpg", "<img", ".wav",="" ".mp3"之类的关键词,把图片和音频等等鸡肋全部删掉。同时,这类CSS引用也可以删掉,以减少文件体积,提高后续处理的速度。CSS引用可以在最后一步添加。比如随便看一下,扫一下就有这些:
. x" Y' q5 Q1 @$ O' i* B* u/ \* `4 s8 K7 @! K1 ^
2 Z$ [# I; P, x9 i# y/ J+ F
f) F0 }- c3 v/ e) y# @! \0 {( g" ^5 v! q4 v
. Q- T, y$ l+ n5 @. r+ D8 D3 }. f我用的是Notepad++,以下是我用来替换的正则表达式:
' c1 p T. {: U8 _6 t
: V! h: ^( {; x" K% c3 } 图片:<img.*?>
) h x* [" i, J6 C8 | & a4 \) Y$ w2 T$ t8 L+ ~
音频:<a href="sound://.*?"></a>3 e8 }* s% F- Y5 R6 f
5 @" e0 d' Y/ y9 {# W) q0 A# N
注释行:<!--.*?-->
8 o ~ ]7 _. }- b
" T2 K( j: W4 w; c1 \可能还有一些冗余的标签,视词典而定,比如我这里就有<span> </span>,直接全词匹配删掉即可。/ f* k5 Y- k6 D( ? a& e$ P
5 x! S1 J& ~1 C4 ~* {% E8 [
我这里这样处理了一下之后,文件的体积直接下降了25%(约100MB --> 约75MB)。) A0 ^( s& E9 M& {: \+ c
! f/ Y, T9 e: q7 v( p
简单处理完之后,便是正式处理@LINK跳转了。TXT文件的格式只有这两种:单词 + Tab + 意项 或者 单词 + Tab + @@@LINK=另一个单词
5 j' `! _% J0 t* ?$ B
3 x+ q: D9 D. v+ P4 D这里我们主要要将跳转词后@@@LINK的跳转链接替换成目标词的意项,因为Kindle不支持@LINK跳转。为方便后续称呼的方便,我在此做个定义。以开头两个词条为例:
1 M- @( y( d' y9 E" \
0 u6 v/ w8 A' \8 k/ t" l
9 [* v# n( \, W: k/ b
* M9 _/ x5 P& A p
9 a0 B. z' N+ e. A \6 P7 i3 V- b0 E1 ?) \, i0 T% h
但是这里也要分情况,因为如果一股脑全部将@LINK跳转都替换为目标词意项的话,看起来简单。但实际上会导致文件的体积无比巨大,因为里面存在着大量的像这样的跳转:
) j5 E N, [. B) Y: B; O2 S
. `' b# p' y( v- z/ ^$ G6 [( g: }5 _) M* l+ z
& s( x/ N4 _' \" @6 O
4 a, a( \. L2 ~9 N. f
: t2 c3 C/ l8 g0 i仅仅是advocate这样一个词,就有七个变形词,它们的目标词都是一样的,如果只是粗暴的替换,那么最后生成的词典肯定无比庞大,甚至如果你内存低点最后都不够用来生成词典。(猜想而已,我没这么干过,有兴趣有空闲的朋友可以试试)7 o) O/ x, s, p; ]+ N
7 ?, a, f& u+ A7 U因为Kindle词典支持为某个单词添加不同的变形词,利用这一特点,我们可以在此处判断,如果跳转词是目标词的一个简单变形,那就跳过该词条。判断的依据来源于dsl2mobi这个工具里面附带的英语单词变形词列表。文件名称:forms-EN.txt,内容如下:
7 l8 g1 w5 U8 H+ E. H- ^: H
; S* d" n" L; A) T |3 T5 |1 @3 d0 S: p
% I6 v% a( Z: G0 p- C2 M# F4 |. [
: g3 p& I8 @- X P+ q0 a( T2 R2 ~
简单总结一下,做了个程序流程图:
: K9 U+ E: G) [$ X& d* m: {( }/ U" w/ C. T9 H' l2 l
) Y5 l- R- n/ @0 p- v* D3 A
& M, ]5 X! \- T" ^+ M/ C8 Q2 @
- O! ^" S8 g% f# X( x9 \ ^
5 u) y+ ?3 ^; V* p: V" {这是代码,你需要修改第3、4、5行的文件路径和第50、51行endswith方法和replace方法中的值改为你操作的字典的实际值。详细的内容请看注释。
8 _; C, E4 w& H* W
$ F5 v; x5 }/ @, A5 p9 ~3 p- P2 f5 a. \$ q9 @. ]/ w
( i e, c" z9 y+ f5 |* l% E' W
3 d! [# c# H7 V7 f
; C( I9 H1 P5 f( p
$ M* C8 k7 k7 B, V8 g" M. r; R! K7 i. R
% ~2 E. P1 t- } B# G% @
注意:Fix_Redirections.py有一个同级文件夹wordforms,文件夹内有forms-EN.txt,请勿修改。: g% ^4 ^6 e0 g( n) q
4 n1 u( T# n% Q3 p3 d/ ?. w+ |8 p7 @0 b1 b
修改完了然后执行代码,你看到的图应该是这样的:% w s+ f, r D5 I
9 C& A( U' T5 K! U5 y- c
# N. g5 r7 u$ |6 T; @
: t( M" E" L5 c5 L1 v5 U1 J6 a2 \) K0 I
# W1 }$ O( j0 J- w( }4 {
这一过程的速度取决于你的电脑配置和词典的词头数,我跑这部AHD大概花了大半天的功夫。
7 J- o3 [/ a9 C& s& x5 `* Z9 M) D. L2 `" x$ `9 U
跑完之后的文件可能存在很多空行(不一定,看词典),这里附上一个去空行的脚本,使用方法:
2 T) H" N# r! d. O7 D7 x7 ?# Q6 Q. i; d) G
+ H: W0 l# ?3 V8 u0 T
8 {+ M8 u% [. n$ `) x( R c0 J+ s5 |/ b4 J: H/ }% s
: q+ y, q5 M# X2 h* G" s9 U1 n
4 p; Q$ E; m) v: ^1 ^- }; v6 J
) {( `; p8 e! J( H P5 f8 {执行完成后会在处理的文件目录下生成一个名字带_stripped的文件,这就是去除了空行的文件。$ n" i2 Q# m9 n9 o3 F9 q; v
2 e* N5 H: t( r: [
' j" M: {4 q7 A6 ], X9 o# G6 o) H7 n$ x; x+ { A$ b. I% c% B2 n
# Z- ]9 J+ W1 x6 A& G" `3 R
( e$ ?7 l5 ~4 n# f1 n
这时候可以打开文件看一看,应该是满屏紧凑,没有空行,没有@LINK跳转的,就像这样:
$ h8 w# B- E3 l4 q- ]7 A! b8 Z6 j
' O1 Z! ] e! M9 z; l: `
" }; ^5 k# g1 [1 g
5 Q/ r% F- a2 g+ R6 L
7 k$ W$ S# g+ K& d2 g0 F
& a C( e3 x3 B* G2 x到了这里,就可以开始正式进行第三步了。这里用到的是tab2opf.py这个工具,该工具基于py2,所以要用py2来执行。从书伴直接下载的tab2opf虽然没问题,但是根据我的经验,把253行的print df给注释掉,速度会提升许多,而且出错的机率也会减少。除此之外,由于词典的不规范及其他特殊原因,我们上述生成的xxx_stripped.txt难免会有几个或十几个错误行(MDX词典本身的问题),因此,最好加一个异常处理的块,遇到错误行直接提示一下就跳过,免得程序中止运行,你们可以参照下图修改,注意红色箭头的地方。
% X* h6 B* [. W2 o4 A( V5 @+ Q7 s: @' M5 i. b) L# [3 E
3 B ^4 Z3 e7 ]" s' F) c+ f
& i1 a% `. N& U7 ~4 L
H2 _6 c$ ~/ C" U
8 w$ U7 p* ~- t3 I: o) j
然后执行命令:python2 tab2opf.py -utf xxx_stripped.txt
% N2 [, @8 R5 n6 `- u
9 q/ P L: A* c" H" h5 }$ ]& z执行完毕后会生成一个opf文件和一堆html文件,如下图所示:
5 K" a" H, s0 G% \5 ~) k3 }: M% S4 `* I8 P
: _' U5 M6 L) Y, x4 N6 j+ ^8 o- r1 G5 Q
9 ?; q A2 y: o- \1 _6 p
: {! i, u3 `8 ~: l
在进行下一步之前,我们还得写好CSS,我的电脑配置不行,打开太大的HTML文件很卡很卡,因此我提取一些意项较多的词条来单独修改建议"go", "take", "in", "the"等,这里我提取“go”词条,复制"go"词条所在的一整块<idx:entry> </idx:entry>,然后加上头和尾(头尾可在任意一个html文件中复制即可),保存为html即可。如图所示:
2 {5 i8 p0 V7 {1 u" }1 v( W- [- y5 C! M
# e/ \7 [8 R% e! z, O" }
7 h3 b7 S4 j5 Q. _& F q/ p0 [4 c3 F {5 H7 B" [
! {0 u: z0 m3 S4 {因为我们要测试css,所以再添加一个head标签并在其中用link标签引用一个css文件,然后就可以写css了。6 n; Y0 l5 b% J& c& |2 h/ g5 w$ [
. ?; ]/ o1 ~2 z) b4 |8 ?& o3 h" W) G9 A! Z
. y2 l/ h' k9 J4 o
+ m# Y; `7 H$ a ^
8 ?1 n2 t8 V% gMOBI的字典只能生成v7版本,该版本对CSS的支持极其有限,margin只支持left其他方向都不支持,即使是看起来有效的margin-left,也不过是在转化过程中替换为blockquote而已。所以只考虑粗体、斜体、下划线和颜色即可,当然不管这里用什么颜色,Kindle上都是浅灰色。+ l( j2 U0 E, H" d X( ~
1 R8 y% M3 u0 U这是我修改完毕后的效果。
. T* q) x; ^/ z! w" Y5 r9 X9 w2 u! ?8 J
" d, s/ {& i$ ]
2 P. W- ^6 E/ y, L W. y+ J
( h2 r6 t5 i0 d8 @6 L. n/ d5 o
$ b' |# G! B, a$ _ @; f
css满意后,那就可以给所有的html文件批量添加link引用了,这里notepad++可以单独完成,就不写脚本了。方法如下:2 o5 ^+ f; F. H2 c
; c7 L- l. X7 x打开任意一个html,Ctrl + F,然后切换到文件查找选项卡,下面注意选择正则表达式,如图所示:$ h) o5 {/ a' g) T2 V
5 |! N3 y5 X- k" X1 i. ?* @8 |# D% T `
4 ^9 A0 U8 W' Q
" V2 I: b/ i8 p+ u/ y+ b6 ?, @ u7 \. k& T% N: u/ P! j
% x" ~5 ^4 L0 ~+ v查找目标: (<html.*?>)
0 Y/ D1 R, c' \- w: _0 v5 C/ X* f2 U& ?
替换为:\1<head><link rel="stylesheet" type="text/css" href="test.css" /></head>5 O% @7 |# B( i( r
% O! G% n$ `9 k, }; E# u
文件类型:*.html
+ i4 n* F- r0 O6 y# X
5 H6 s$ k7 e0 b+ U- o9 p目录:即html文件所在的目录
% S( v( s4 r% l$ \( d
, f* A+ I3 j- }4 g" c1 e
. ?; J' Z" G9 o# |/ I Y! q3 y1 K+ T5 w% D: B" r
然后点击文件中替换即可,这样,所有HTML都添加了CSS引用了。# b$ j9 m. @- V- S, O, q& k g* S
4 i" Q- h! K1 q. I0 X# T/ l# H
现在到了另一个重要时刻了:为即将生成的Kindle词典添加变形词,原理就是检测forms-en.txt里面的单词然后提取出变形词添加进去,上面说过了,此处不再赘言。
/ _0 X3 J6 S# E7 \' I6 }" n/ g/ {/ w& s; O' M
代码很长,不贴了。用法很简单:Add_Infl.py html文件所在的目录3 E8 C9 k1 x+ S/ l
. c8 j6 N' a. u. N% M
! I$ f0 M! E% ~ x3 u# M7 S- L
& t2 C/ s* ` }0 k+ u1 x+ O
1 o3 b4 {' N v% t4 y. ? ?; B: V; G* x1 x0 n4 c7 V" C
文件在此,解压后其他文件和文件夹勿动,以免程序不能正常运行。3 l& `, T' p: X+ S) c3 T) f
y! f9 c- A; H: i" h: F6 {% {
$ g8 J2 g0 v6 G- m4 P0 k+ ]# k/ G" F: k( y2 H9 H0 F/ N# W6 I. Y
然后会在目录下生成一个名为OK的新目录,新的HTML文件即在此。
' m) O4 x& q2 M' d# f g! O1 P; p( @- B0 q0 k$ @
最后就是把之前的opf和css复制进去,然后用mobigen.exe生成即可,mobigen.exe -unicode xxxx.opf
1 G1 S. w5 c4 m$ Q# b% c, s8 t2 G- G3 D0 ^% L/ Q F Y. d) ^
如果你想修改生成后的词典名称,打开opf,修改这一行即可3 w( _2 c h# R; K
: B7 |, |+ P2 v3 F j% w1 H
! J! U+ ~# e4 f/ h5 T0 P* {( j
( G" r3 [8 }& S6 U% K6 S# p+ z3 y
; |5 ]/ I5 M/ D* }* G0 G% B! A( D9 G' j+ W
完。) y8 I+ w, }" y5 p" J
$ M( K4 S; }- B9 B三、结束* C( G& k, N. B2 d6 e6 U' K
) y" l3 q. |0 j! H: a1 V. e9 C
第一次写这种教程帖,步骤、截图等等都很繁琐,几次我都差点晕了。简单看了几遍,算不上流畅但也不至于晦涩。若诸位有什么问题或发现什么错误也可以在下面回复,希望能有更多优秀的Kindle词典出现。
0 O/ d+ w+ r/ P @2 t/ g0 c" B5 a( w& N' P T
另外:关于Kindle上的汉语词典,我发现kindle支持将繁体作为简体的变形词,意味着若处理得当,那就直接为简体词头添加繁体的变形就够了,不必再另添词条,词典体积将大大减少。各位有兴趣可以试试。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?免费注册
x
评分
-
10
查看全部评分
-
本帖被以下淘专辑推荐:
- · 词典制作|主题: 217, 订阅: 40
- · 语言态度|主题: 150, 订阅: 19
- · MDX制作|主题: 46, 订阅: 17
- · 玩转词典|主题: 46, 订阅: 11
- · tech|主题: 2, 订阅: 0
|