TA的每日心情 | 开心 2023-9-27 20:45 |
---|
签到天数: 847 天 [LV.10]以坛为家III
|
本帖最后由 nullname 于 2019-9-30 10:39 编辑
( i: ^) ^' E. }6 c
8 j1 B% B% y, [' ]5 X1 s4 t8 x! ^一、前言
2 e4 Z, b1 {( W7 Z6 S" _; I% C0 K: w& _2 s
本篇文章的所有部分均来源于书伴的《如何把 MDX 格式词典转换成 Kindle 字典》 ,只是仅通过该教程的方法所转出来的词典基本没法用,原因是Kindle不支持@LINK跳转、不需要音频、以及需要添加Kindle支持的变形词搜索功能。经过几天的摸索,逐渐有了点头绪,并制作了AHD5th,试用两天后觉得尚可。便于昨天发布。帖子见此:[Kindle词典]美国传统词典American Heritage Dictionary 5th(精制版)。' C5 s& W# ] W$ J
7 C' X8 d! H5 t6 s: W8 h+ E本文章展示如何通过Python来最大限度的优化以生成体验较好的Kindle MOBI词典,为各位提供一种思路,以期众人群策群力,制作出更多好用的Kindle词典。
5 o6 d* ^5 R0 J( j0 |0 v5 D0 n+ l5 W, M# {
为了文章的连续性和完整性,对于完全相同的部分将全文引用这篇文章《如何把 MDX 格式词典转换成 Kindle 字典》 的内容。
1 z a9 ~! q- B, S. h& s3 ]8 o5 p x4 t" v
8 j" Y/ L6 ~- r* `$ a) O$ t
二、正文
, u7 x/ g K2 o& |4 M! Y/ v/ o9 y
6 H. U' A- s0 j2 P$ i书伴的这篇教程共有四步,还用到了一些工具。工具请自行下载,因下面所用的代码是Python 3的,所以除了Python 2 ,Python 3 也需要安装。第一步和第二步是一样的,不赘言,仅截一张图于此。
! X$ J: { ]4 L7 |
9 B% f3 A7 i" j& K! m) L
) b+ T2 u( H% ~* K7 N/ p2 T8 W4 Q3 p# @9 V
3 N3 I4 [( d; C( W2 H8 V' a9 ^
7 ~ V u7 {$ J' s
工具准备好后,选择你想转制的MDX词典(本文只针对英文词典,即英英/英汉),下面以论坛里的American Heritage Dictionary 5th [IPA]为例。) V. ?) ^( u+ U
" K( J6 y3 W! v. x
! y& Q/ C0 r! ^经过第一步和第二步的处理,我们会得到一个体积较大(视MDX而定)的TXT文件。其内容格式应该是这样的:
/ y* ^$ G* ]; O7 F1 \2 e. q. W
% E* y. e2 \5 S" J" x* R- }& a
. G( m6 m' @/ ^' y; G( s3 d" p+ N1 {* x* q$ `7 F8 f& W* I
! A* ^- O ~0 ^$ Q/ D3 @
得到该TXT文件后,我们可以选择几行看一下或者搜索一下如".jpg", "<img", ".wav",="" ".mp3"之类的关键词,把图片和音频等等鸡肋全部删掉。同时,这类CSS引用也可以删掉,以减少文件体积,提高后续处理的速度。CSS引用可以在最后一步添加。比如随便看一下,扫一下就有这些:1 v( X# }6 t i( k& Q$ n/ X
3 o6 N8 h: j% w1 `
. b- A; V* U: v0 _* I, A6 m; `3 t+ O* p u. J" L# A
& o" p, v+ A4 X: D. r' M/ s# ` ~
9 S8 U! o- d+ }! g7 Q2 m* w" ?+ K) w
我用的是Notepad++,以下是我用来替换的正则表达式:
2 _" a! w) ?- q' Q% a% s5 M1 Q* J2 Q& j
图片:<img.*?>$ ]1 o i1 A& E$ M/ X" J+ `
0 p3 k7 L/ I; R/ V- l
音频:<a href="sound://.*?"></a>3 z6 A9 I Y6 g" h
+ Z4 @; W' |7 k' B" D, {
注释行:<!--.*?-->% W' ?0 f* }* G
; i$ f K( K% d) f( ~可能还有一些冗余的标签,视词典而定,比如我这里就有<span> </span>,直接全词匹配删掉即可。* N! R0 N0 i6 `1 B% ~, c
4 z2 d+ p: |# m2 `
我这里这样处理了一下之后,文件的体积直接下降了25%(约100MB --> 约75MB)。
Y- B5 |# Y. X# T& G& V w( f9 q8 N7 m. P. [4 c
简单处理完之后,便是正式处理@LINK跳转了。TXT文件的格式只有这两种:单词 + Tab + 意项 或者 单词 + Tab + @@@LINK=另一个单词% v+ z7 ~3 r$ D5 u5 r% v
) l; V3 P4 |7 M! z# T
这里我们主要要将跳转词后@@@LINK的跳转链接替换成目标词的意项,因为Kindle不支持@LINK跳转。为方便后续称呼的方便,我在此做个定义。以开头两个词条为例:8 V( \, q% b8 k f4 i. G
5 X) ^# N1 Q$ H5 }
7 P3 v9 b* C. c
3 ~/ ]1 P$ s/ F' Z: _. g; {0 ^% B
: S6 l) {# t* f \0 p
但是这里也要分情况,因为如果一股脑全部将@LINK跳转都替换为目标词意项的话,看起来简单。但实际上会导致文件的体积无比巨大,因为里面存在着大量的像这样的跳转:! [4 W9 O* x6 {
5 Y z- Z6 P. _) @4 F; N4 v1 m) Z- Q6 e
. j. B$ C& d4 Y
) y# [; V0 E6 O' n/ ?4 B$ z% a4 I& c4 t! ~
仅仅是advocate这样一个词,就有七个变形词,它们的目标词都是一样的,如果只是粗暴的替换,那么最后生成的词典肯定无比庞大,甚至如果你内存低点最后都不够用来生成词典。(猜想而已,我没这么干过,有兴趣有空闲的朋友可以试试)
+ f! y: P. z/ ]6 i" z, Y/ d1 W4 N/ v. z
因为Kindle词典支持为某个单词添加不同的变形词,利用这一特点,我们可以在此处判断,如果跳转词是目标词的一个简单变形,那就跳过该词条。判断的依据来源于dsl2mobi这个工具里面附带的英语单词变形词列表。文件名称:forms-EN.txt,内容如下:
. ]0 h) O( g2 c+ v" j0 w
8 Q4 T6 k8 g$ f( D. w y
& [7 y7 ]" b6 ?: m8 Z9 o4 n i: [. |5 H
/ G5 o% n2 U5 J3 {# h; K
! [8 B$ O9 v- K* s
简单总结一下,做了个程序流程图:
; ~0 c$ _( D3 ]" n
3 G& r8 B2 z5 E* K" x# o' r# w# X& t7 x, L. F
' i! u4 {7 D: m0 w# l, i' z- _4 T+ h
: o! g- A1 ~( J2 ~) k x这是代码,你需要修改第3、4、5行的文件路径和第50、51行endswith方法和replace方法中的值改为你操作的字典的实际值。详细的内容请看注释。
9 N5 c" j, a ^1 Z9 A; _1 m0 D# G) A2 g* o( S) U
9 L- n& k/ ~4 q
% f8 v% b; U+ G X
+ n9 c5 X9 C/ i0 p. P7 f1 m+ A0 {
( m" Q: ~- l& B
! S* V) @5 P; H& a% N* @0 y9 h4 e! t7 b% l
注意:Fix_Redirections.py有一个同级文件夹wordforms,文件夹内有forms-EN.txt,请勿修改。
1 M0 o, ^1 n' q9 T
1 X; G6 ]" u( f, X) I3 N, [( u. @* j: k0 k
修改完了然后执行代码,你看到的图应该是这样的:
. x8 D* \+ ]/ h& v; {
7 z, Q" ]& ~/ _1 n8 v5 G5 e- C, k. _9 Z$ i
6 z9 }6 D. B+ _5 t5 i1 F( J5 ]7 ^
( H) C! d2 k, K/ T" V7 n9 s
% `( c0 }6 i! }" I2 m: a% o- z这一过程的速度取决于你的电脑配置和词典的词头数,我跑这部AHD大概花了大半天的功夫。
7 N; M( A- F3 L$ o$ o
* t! j$ A$ t$ r跑完之后的文件可能存在很多空行(不一定,看词典),这里附上一个去空行的脚本,使用方法:
: @7 F! O% z/ r9 T; m+ U/ @. @" C( u8 v: i4 }+ J$ Y
: z% ^& l4 Z6 V% c9 P
2 j N b8 @4 k, {# Q' [
, }8 h. S, k* h6 R4 i, V# y+ S0 H1 l' ^ `# G4 o
6 Z! Q; ^4 X' B/ ^
. h) w2 A1 F) A执行完成后会在处理的文件目录下生成一个名字带_stripped的文件,这就是去除了空行的文件。. x& Z8 Q; f9 ~8 X. ^6 Y
- v5 M/ Q$ B5 Y, C4 v
( s& f7 U% B9 w/ a, r: m7 S. ^+ K3 _3 h- ^; T' ?
( g, H: s2 w( |* j* l3 K' j8 c
- ?. P2 {' d# k$ D4 X9 M+ A
这时候可以打开文件看一看,应该是满屏紧凑,没有空行,没有@LINK跳转的,就像这样:
: k* S7 K# w, y: U6 C- u0 a5 V; q$ A1 S, G5 _ Q# ^& \8 ^: p
# X" M) M C9 }+ \2 s0 L: b& B
2 u5 ?. C( `5 k& x7 v" g" o2 u& t! `
. R% {5 `. d% i8 @) v到了这里,就可以开始正式进行第三步了。这里用到的是tab2opf.py这个工具,该工具基于py2,所以要用py2来执行。从书伴直接下载的tab2opf虽然没问题,但是根据我的经验,把253行的print df给注释掉,速度会提升许多,而且出错的机率也会减少。除此之外,由于词典的不规范及其他特殊原因,我们上述生成的xxx_stripped.txt难免会有几个或十几个错误行(MDX词典本身的问题),因此,最好加一个异常处理的块,遇到错误行直接提示一下就跳过,免得程序中止运行,你们可以参照下图修改,注意红色箭头的地方。& f; S0 g! w, E6 \9 b: r- Y7 c
7 l, {9 |$ Q% @2 c3 Y$ |' P( m3 z" f z: d L! D% Z. x2 G) E* n
+ G2 k* u3 p9 O ^9 g7 ]
" ^0 L3 W7 Z0 P' v' d5 E
- t0 ?+ O6 {8 X$ V% G然后执行命令:python2 tab2opf.py -utf xxx_stripped.txt% X* j2 Z9 A5 V3 p- H& P
0 M) b3 X7 K1 r# o执行完毕后会生成一个opf文件和一堆html文件,如下图所示:+ [7 J, X& i7 w
+ J: x; j! z; v5 J( T. r
% m+ ?% o# q4 |! U0 k) Z
9 g. q, f4 @9 H- v7 J* g F- E6 O# i1 F. W, s& d p4 k+ Y0 [8 r( \* F* J/ H
( R2 c! U! y& V! Z1 J5 C在进行下一步之前,我们还得写好CSS,我的电脑配置不行,打开太大的HTML文件很卡很卡,因此我提取一些意项较多的词条来单独修改建议"go", "take", "in", "the"等,这里我提取“go”词条,复制"go"词条所在的一整块<idx:entry> </idx:entry>,然后加上头和尾(头尾可在任意一个html文件中复制即可),保存为html即可。如图所示:
9 I3 O" P4 R/ p0 T) m7 H: V
2 a2 N- {/ e; z
* N# e$ J* R9 g: D* r
/ S8 f9 f% H% i$ x( y9 a+ ~, M! v3 ]. N ~* I% c/ ]3 N
5 \: R; t, A: ~/ p& v% I因为我们要测试css,所以再添加一个head标签并在其中用link标签引用一个css文件,然后就可以写css了。
& d/ \2 Y. O. X9 z
# R7 v, R( U/ N* B5 I9 Q( H0 w: ?: Q3 {$ c2 b
7 [! {0 T0 _$ R! q+ d g1 o4 x% @
0 B1 ]2 c2 P! l& E: Y
7 ~- ~1 J* q2 s: \MOBI的字典只能生成v7版本,该版本对CSS的支持极其有限,margin只支持left其他方向都不支持,即使是看起来有效的margin-left,也不过是在转化过程中替换为blockquote而已。所以只考虑粗体、斜体、下划线和颜色即可,当然不管这里用什么颜色,Kindle上都是浅灰色。
. k! B$ U) d! V$ X c" u' T6 y! }! v& J& N8 u; \3 ?1 l
这是我修改完毕后的效果。% E+ ~& J1 x) `6 m+ Q, y
( b; K8 c \# h
0 M0 V+ \3 w. n9 q2 X6 w) E( D* a) {
6 r7 b; E0 d* ^$ ~5 R. Y' ^0 f! ^, a2 k9 A* c
css满意后,那就可以给所有的html文件批量添加link引用了,这里notepad++可以单独完成,就不写脚本了。方法如下:
* O( F( [7 T9 q9 p# [. `; U
8 z$ H: y6 G- _+ } l, l打开任意一个html,Ctrl + F,然后切换到文件查找选项卡,下面注意选择正则表达式,如图所示:
/ u; M- {6 K' D/ {9 _! E9 Z+ B C
6 V; `# u" h0 C. c. q2 \; `/ X& ^# l1 j, a) B) C8 E
: V8 p" F1 z' N. ~: N
4 d( f. Z8 y n: ?
5 B% P( @3 s B9 f4 v( }
- B( v f/ I2 G k. m( h, d查找目标: (<html.*?>)9 u% ^7 Q# |3 a z% N; A7 Y
& @9 ?# J' i$ j+ H, g) _8 t
替换为:\1<head><link rel="stylesheet" type="text/css" href="test.css" /></head>* a: w, ]* {* o0 a" E N2 _
G, }0 l) J1 y( p6 X4 _( }7 s: j
文件类型:*.html2 Q1 S0 n) j, d% D1 f
! f( ~: O: ~% L& z1 ~目录:即html文件所在的目录/ Q, J. a( J: R j
6 }. Z+ ~5 b. B" @! x( v4 c4 q: V# K+ c+ N0 X5 U5 J7 C
, U0 |7 `- W& m8 o9 W
然后点击文件中替换即可,这样,所有HTML都添加了CSS引用了。
8 `; E' {6 T' ]0 I' q3 e. {& N. |$ _7 L% C- r
现在到了另一个重要时刻了:为即将生成的Kindle词典添加变形词,原理就是检测forms-en.txt里面的单词然后提取出变形词添加进去,上面说过了,此处不再赘言。1 l* r+ r& l2 u* o% j4 P
, n$ q. ?0 L, S+ s& H代码很长,不贴了。用法很简单:Add_Infl.py html文件所在的目录
$ [5 ?- s. s( ~( z. n7 g3 U$ j( O$ s2 l
# V0 ~: R j5 W: p
! i' z% x; o) @4 e- T' [2 x$ Z: t1 ~! r! V& |6 ~
& N% K# t" X3 f文件在此,解压后其他文件和文件夹勿动,以免程序不能正常运行。/ W' ~ p. `8 R5 l2 Q! X2 S4 b
# w! ]7 t' R" S+ q* D7 y" r& t
8 I Y# }6 Y/ X9 @
. H5 |$ j! M s5 I然后会在目录下生成一个名为OK的新目录,新的HTML文件即在此。
. G' b* G5 P" K3 Q8 K: w: ]; I
; X9 k1 ]; j( u& p最后就是把之前的opf和css复制进去,然后用mobigen.exe生成即可,mobigen.exe -unicode xxxx.opf
" W4 H0 r6 ]$ F8 p& V6 U
! ]% o" t- X" x! \0 ~' R如果你想修改生成后的词典名称,打开opf,修改这一行即可( G, q- a% S; ~: h
4 a G- b9 Y$ g" U2 k# G, L
, I% z& j4 O1 y2 C/ } U4 y* r; D$ Z5 t# i; c
3 O4 U# G3 N# o; A# n G6 Y, i
$ K) r7 E' V. P- y完。
3 Y1 w& R$ i9 B( N9 c) O; J) z4 b) ]& n+ k0 Y. j2 m
三、结束
+ j+ z. B1 y+ a$ G: ~- _, h! E7 u p1 N- E/ T
第一次写这种教程帖,步骤、截图等等都很繁琐,几次我都差点晕了。简单看了几遍,算不上流畅但也不至于晦涩。若诸位有什么问题或发现什么错误也可以在下面回复,希望能有更多优秀的Kindle词典出现。& B. |/ p/ I5 T$ G+ ?; l
G. p- S+ t2 ?3 d2 y5 w+ [9 c另外:关于Kindle上的汉语词典,我发现kindle支持将繁体作为简体的变形词,意味着若处理得当,那就直接为简体词头添加繁体的变形就够了,不必再另添词条,词典体积将大大减少。各位有兴趣可以试试。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?免费注册
x
评分
-
10
查看全部评分
-
本帖被以下淘专辑推荐:
- · 词典制作|主题: 217, 订阅: 40
- · 语言态度|主题: 150, 订阅: 19
- · MDX制作|主题: 46, 订阅: 17
- · 玩转词典|主题: 46, 订阅: 11
- · tech|主题: 2, 订阅: 0
|