TA的每日心情 | 开心 2023-9-27 20:45 |
---|
签到天数: 847 天 [LV.10]以坛为家III
|
本帖最后由 nullname 于 2019-9-30 10:39 编辑
4 P" \; T1 c5 k6 e0 o* u9 |! j
3 U2 S; ]3 t9 V/ l1 A9 R一、前言3 s7 I( e0 K3 r: l/ ~) G$ [
$ R4 x; a2 \: j7 _6 B+ v本篇文章的所有部分均来源于书伴的《如何把 MDX 格式词典转换成 Kindle 字典》 ,只是仅通过该教程的方法所转出来的词典基本没法用,原因是Kindle不支持@LINK跳转、不需要音频、以及需要添加Kindle支持的变形词搜索功能。经过几天的摸索,逐渐有了点头绪,并制作了AHD5th,试用两天后觉得尚可。便于昨天发布。帖子见此:[Kindle词典]美国传统词典American Heritage Dictionary 5th(精制版)。5 |* Q6 x( d$ y$ i9 J# w2 Q
6 b( J5 K# H/ d2 s a# N本文章展示如何通过Python来最大限度的优化以生成体验较好的Kindle MOBI词典,为各位提供一种思路,以期众人群策群力,制作出更多好用的Kindle词典。
' Y! i4 M& G. \# `' d) Q% }; v/ D W
8 k+ v5 }6 o, N为了文章的连续性和完整性,对于完全相同的部分将全文引用这篇文章《如何把 MDX 格式词典转换成 Kindle 字典》 的内容。
4 y) P/ l8 C( J. r1 m/ G; B5 P8 e
5 s2 e' i: Y" x0 o1 u1 Z F9 `4 M
! d" U) Z' Y& Q7 v. \) _& a8 q8 t二、正文
" d g5 ^3 Y9 q: o5 T/ `
: R: x$ L+ l) [4 N$ j书伴的这篇教程共有四步,还用到了一些工具。工具请自行下载,因下面所用的代码是Python 3的,所以除了Python 2 ,Python 3 也需要安装。第一步和第二步是一样的,不赘言,仅截一张图于此。
* h1 ]) A j+ c/ R' {
; \& [% t- j8 X* J# ~4 O8 D
! F) U; k' Y! a+ V+ Q: e5 S" S3 H6 A8 y: |2 T! _, h$ \0 L4 a
/ z9 w# k+ x' g' L- G: j) G0 w% w/ I. Q) w; f4 m; u
工具准备好后,选择你想转制的MDX词典(本文只针对英文词典,即英英/英汉),下面以论坛里的American Heritage Dictionary 5th [IPA]为例。
1 f+ _% [2 h9 |4 w1 _) j
* h# Y/ S# } c) {# K% q
8 K, D% r: U& K! s4 F# d1 J. M经过第一步和第二步的处理,我们会得到一个体积较大(视MDX而定)的TXT文件。其内容格式应该是这样的:+ g/ \7 Y, }* P' @0 `* e) a
3 ] J) y/ T, e- q- ^3 c. [
/ S3 N5 x+ `! B6 Q7 P$ V1 p- P+ n$ y- l. e6 V5 A2 Z8 |, R9 [8 D
. J; N# N; `5 J) @& Z; p* o
8 _! G" }( s8 j* S
得到该TXT文件后,我们可以选择几行看一下或者搜索一下如".jpg", "<img", ".wav",="" ".mp3"之类的关键词,把图片和音频等等鸡肋全部删掉。同时,这类CSS引用也可以删掉,以减少文件体积,提高后续处理的速度。CSS引用可以在最后一步添加。比如随便看一下,扫一下就有这些:0 _6 a$ u' z: B
0 P, Y+ l3 D) [+ _& ?* H( o( U8 J
$ B/ o" F" c" L: j5 A
9 i7 ^$ g2 x3 O0 M
5 H1 K& r: ]% @3 Q) s" h! s, Q. u/ L# R. A* }
我用的是Notepad++,以下是我用来替换的正则表达式:% J( G8 |4 ^8 }: Q& d7 M
2 A- [9 @: k1 O* F- h3 h1 x+ B 图片:<img.*?>
' T5 G0 }( R8 {% }8 L2 z. E2 Y & f: ?" ~2 c1 n& T0 B4 J. p: y6 }
音频:<a href="sound://.*?"></a>
1 i5 q! r I5 Z: v @" B1 R
1 X3 T3 j. N9 Q2 `% \ 注释行:<!--.*?-->
3 A8 _' @8 T n2 L, B( O) r6 A! H; p0 M# U$ c
- [7 [& H5 s4 o) G可能还有一些冗余的标签,视词典而定,比如我这里就有<span> </span>,直接全词匹配删掉即可。% N: [5 K9 g# \ f* } z
" ]7 Z' y4 }! |; c- h
我这里这样处理了一下之后,文件的体积直接下降了25%(约100MB --> 约75MB)。
! G2 {: H( }% l2 i" W/ ^/ h# y# ^- I6 O- i. l$ @2 Y" K8 x
简单处理完之后,便是正式处理@LINK跳转了。TXT文件的格式只有这两种:单词 + Tab + 意项 或者 单词 + Tab + @@@LINK=另一个单词0 u2 h: `- M3 g8 C
6 I; Z: B& ?. g! N$ o这里我们主要要将跳转词后@@@LINK的跳转链接替换成目标词的意项,因为Kindle不支持@LINK跳转。为方便后续称呼的方便,我在此做个定义。以开头两个词条为例:
V6 R. \, o: _) O4 {; y9 A2 P4 p; w `4 y
/ z4 \+ P( F& A' ~# E' p# \6 D( k
& q! ^! L: B" x" C3 v% l- C
2 j2 @: \5 W$ y; P7 ]/ l8 \. B
但是这里也要分情况,因为如果一股脑全部将@LINK跳转都替换为目标词意项的话,看起来简单。但实际上会导致文件的体积无比巨大,因为里面存在着大量的像这样的跳转:
" d, p- g& X3 w. w6 E! T- {$ x; x
) z' t' R) M3 r( d Y# u. M, o/ V
! B7 k3 h2 d; w0 v5 P# a! x
( y# e6 I, Q1 W4 w* H- ^
: J8 u7 z X. |* [" J" M( s仅仅是advocate这样一个词,就有七个变形词,它们的目标词都是一样的,如果只是粗暴的替换,那么最后生成的词典肯定无比庞大,甚至如果你内存低点最后都不够用来生成词典。(猜想而已,我没这么干过,有兴趣有空闲的朋友可以试试)
4 G& B; E/ q. l! s2 F! u
8 i2 d8 N6 q/ v3 O$ i! z' Z因为Kindle词典支持为某个单词添加不同的变形词,利用这一特点,我们可以在此处判断,如果跳转词是目标词的一个简单变形,那就跳过该词条。判断的依据来源于dsl2mobi这个工具里面附带的英语单词变形词列表。文件名称:forms-EN.txt,内容如下:
, q3 i% t& o) W( q
6 `- A' a5 {6 s* B( O' \
2 y. Q- t/ {+ V3 K" {0 ~7 U
5 G* b7 y' }8 H$ _6 @; n$ F 9 s2 X! W, T' f* Z3 C N* z6 g
" N& t' _- N4 \+ a4 `
简单总结一下,做了个程序流程图:
! c5 s6 O3 n1 G5 F7 G* n7 ~3 N2 ~! z$ [* r, ~5 [
# U8 f+ B; ^# V6 O) C2 {
+ J, _" ]5 b! x `3 `' X
* a+ ]8 b+ ]- t+ \1 a$ e, ?7 M/ q0 u0 v9 {2 Q/ W6 \$ _0 n( L
这是代码,你需要修改第3、4、5行的文件路径和第50、51行endswith方法和replace方法中的值改为你操作的字典的实际值。详细的内容请看注释。. }' W5 F3 d3 W; x
5 ^$ S' K( C* I5 a% V: D. Q
" o$ l- ? p8 Z$ F& k
+ V; \9 f- O& s N/ F$ P
/ o( y5 D( H, y3 W+ r* l/ ~
% ^0 K. u" ?( T6 ^) }6 Y
+ m, ?; e7 Y- f* u
( N" s' R0 j H: C+ G
8 c1 J- x6 _3 U6 S! i/ T) p注意:Fix_Redirections.py有一个同级文件夹wordforms,文件夹内有forms-EN.txt,请勿修改。
1 d) T5 f3 I, H6 q. U
+ b( h% g H, y1 v) j$ n/ F
1 ~' ]7 t* u8 U$ J" ~) S修改完了然后执行代码,你看到的图应该是这样的:4 i/ u4 T/ m# [) n
' L' K- k/ F8 C x# F7 ?
/ _- h: O) f* r; R% ?. @3 F' D X) T- M2 h, B
~& X; T$ H- E: b2 ^8 @6 s& e4 A. ]6 Z2 v8 j( y. M3 d( `1 B
这一过程的速度取决于你的电脑配置和词典的词头数,我跑这部AHD大概花了大半天的功夫。# v3 ~% d9 j7 ]5 `7 |
6 h6 H. w7 o1 Q2 m& z跑完之后的文件可能存在很多空行(不一定,看词典),这里附上一个去空行的脚本,使用方法:3 K1 d6 ^7 V9 W* _9 r
( T: x$ D2 R' i( @* R8 L! E! r
/ \- C" h( q& Q9 G+ p- l# s/ @ P( v% z+ ]* Q8 m8 @$ X4 q# P+ I
: m8 ^6 H/ |4 _- t& r
6 {, S6 j% E* H9 |" h. `9 i4 n- O0 m# Q1 A
' m2 f# ~6 r; I$ Q' X, m
执行完成后会在处理的文件目录下生成一个名字带_stripped的文件,这就是去除了空行的文件。
- p* Q/ W+ P$ M G2 o+ Z5 ]. y4 Y# y
5 }$ h6 E9 Z2 {, l i/ W8 n# [ n, a2 i* r! {" L6 m/ x S+ T& H& t
* ~- |3 _( ]" C
) C; U6 G! t$ J$ ~. d* g$ a
6 `% c# w7 X/ V这时候可以打开文件看一看,应该是满屏紧凑,没有空行,没有@LINK跳转的,就像这样:
# p: V# Y; B8 o( k( v4 x
4 l, m" K! `- j
5 s& L7 [" T, G1 B" G3 R4 p# t& s' e: s. U
2 q" z4 ~* K P# r# Z0 F% y, c o/ r1 K& C" t4 H( W
到了这里,就可以开始正式进行第三步了。这里用到的是tab2opf.py这个工具,该工具基于py2,所以要用py2来执行。从书伴直接下载的tab2opf虽然没问题,但是根据我的经验,把253行的print df给注释掉,速度会提升许多,而且出错的机率也会减少。除此之外,由于词典的不规范及其他特殊原因,我们上述生成的xxx_stripped.txt难免会有几个或十几个错误行(MDX词典本身的问题),因此,最好加一个异常处理的块,遇到错误行直接提示一下就跳过,免得程序中止运行,你们可以参照下图修改,注意红色箭头的地方。( O1 K; y9 z8 ^5 m7 Z
$ @" b' E# } i( _1 t# E6 b- t0 F; F. ?% m( _
/ W6 X. E6 j$ k$ T6 E& c. @
" c4 ]8 [7 r1 l8 w( z' r: g
2 d4 j S2 b! I7 \9 {' w$ h然后执行命令:python2 tab2opf.py -utf xxx_stripped.txt# b" e6 W7 ^. F- |+ b
8 ?1 [% W/ _; S9 d4 p! ^3 f) L
执行完毕后会生成一个opf文件和一堆html文件,如下图所示:
5 r! S! ^8 p$ _
, X2 S I0 L; e- E2 {: m
6 p+ M0 U/ F* \! f3 n
6 t0 k8 M0 x1 Y4 O1 c3 h) Z/ Z3 b5 C* [5 w3 f7 T5 a; y
3 h; M& x5 D5 ]) C/ U
在进行下一步之前,我们还得写好CSS,我的电脑配置不行,打开太大的HTML文件很卡很卡,因此我提取一些意项较多的词条来单独修改建议"go", "take", "in", "the"等,这里我提取“go”词条,复制"go"词条所在的一整块<idx:entry> </idx:entry>,然后加上头和尾(头尾可在任意一个html文件中复制即可),保存为html即可。如图所示:
: N! ?! I" Q' s4 G: F' L8 U; s Q3 O& P' P7 M8 J0 _5 b
1 w0 I& r6 K/ N5 e, P, d# ?' t/ A4 p2 Z/ u+ _
( R- `! {2 H) w
* c# j* i7 v' s m$ x4 Z. F. w) H因为我们要测试css,所以再添加一个head标签并在其中用link标签引用一个css文件,然后就可以写css了。1 f L( C! R* R/ u
g% A% }3 l+ q4 H. T
$ w( @; N7 Y- f6 |% p
. x% N1 ~/ H# u6 s8 `1 a: @8 p; ?6 v$ k2 d* H% I9 j( Z% L
, ?# w& t. B. x& [! |MOBI的字典只能生成v7版本,该版本对CSS的支持极其有限,margin只支持left其他方向都不支持,即使是看起来有效的margin-left,也不过是在转化过程中替换为blockquote而已。所以只考虑粗体、斜体、下划线和颜色即可,当然不管这里用什么颜色,Kindle上都是浅灰色。; D. H2 ^ e( q. ^6 O( J$ o, }
! @3 q& {. v2 P5 a- O: V" `2 B; \2 B这是我修改完毕后的效果。7 v: g! P G" s! l& l. y
" y) k8 k' N' S' F) M6 y
2 |; R! }' G& r: ?5 |& ^
2 J( A) ~+ q0 ?9 a3 _
0 G% _- l9 R2 R7 L8 a- T
* X% M) F y" Rcss满意后,那就可以给所有的html文件批量添加link引用了,这里notepad++可以单独完成,就不写脚本了。方法如下:
6 l# V9 \0 z: W% j' |3 K, M, \7 ]! l+ i! J
打开任意一个html,Ctrl + F,然后切换到文件查找选项卡,下面注意选择正则表达式,如图所示:. M) h+ M; O: U& x
- F( T8 k5 M, x5 p
. w9 U! q h9 {5 S7 ~- p. T" e* r0 i, t: f
! h) Q+ q" G* h" ]( q) t/ s9 ~4 l4 e; f @
6 M# s7 t, B+ c( x# W查找目标: (<html.*?>)
: }, s1 M& ?$ i) D9 U2 [
- |% e) I5 R6 V替换为:\1<head><link rel="stylesheet" type="text/css" href="test.css" /></head>
# n( H( w1 x' ]* q+ A" j4 d
) x) A0 U d* p2 V$ t# W文件类型:*.html
( c& ~* f! }! i% h5 b
+ ?9 M0 [2 ~9 x9 u1 M目录:即html文件所在的目录
; a- ~* d- [! H8 H2 F# V4 c0 |" g* ?7 s; B1 ]( x# l g3 e/ w$ [
. L n2 Y d* K; f( \" ^8 u+ _! P
+ X$ K. w) t( I5 n, c
然后点击文件中替换即可,这样,所有HTML都添加了CSS引用了。* x H( V2 P" j( Z/ c
* \- m& j3 p; P7 u: g
现在到了另一个重要时刻了:为即将生成的Kindle词典添加变形词,原理就是检测forms-en.txt里面的单词然后提取出变形词添加进去,上面说过了,此处不再赘言。
- \9 K' }1 P4 g/ y$ K, F2 t( @, X; t8 Q D6 T _
代码很长,不贴了。用法很简单:Add_Infl.py html文件所在的目录
' Y; ?5 O% S3 \3 X& n% i4 _
) d, b* M- V: } d- m
% R0 [+ X/ j* t
2 a1 w& R, m0 c$ ?( l3 o r+ g* A. \( J
$ h4 t! [0 S7 s9 _文件在此,解压后其他文件和文件夹勿动,以免程序不能正常运行。
* E1 d4 V! @; ^/ o' A$ d& d9 C
* b- W, f7 T4 K" e6 X* C% e8 a. v4 x2 [) K0 u$ B
/ |8 E+ ~$ }9 {7 [
然后会在目录下生成一个名为OK的新目录,新的HTML文件即在此。
8 E! J5 E% R0 R) J3 o! U
! v/ r" P* z. `' ~; p+ I最后就是把之前的opf和css复制进去,然后用mobigen.exe生成即可,mobigen.exe -unicode xxxx.opf
+ \9 ]* w Z1 K' G' ^
' a9 X' P, q9 I3 I如果你想修改生成后的词典名称,打开opf,修改这一行即可
/ Y* \2 h, h: C+ ?1 \
8 ~ a' ^2 c3 k8 m
! _" U- A) A2 [0 X: ~2 n" X b. R, D: ?6 q4 ^
3 u( [- y w% U; J1 e- _) n" k0 z) D& N" {) d
完。$ a% P: k- k# l. v4 x( M; e L
3 x% m5 S; J& K' x+ \三、结束
0 b1 I! \- n. ]$ f* ] w/ Q
5 C6 L1 u* g+ L, T2 ?6 L第一次写这种教程帖,步骤、截图等等都很繁琐,几次我都差点晕了。简单看了几遍,算不上流畅但也不至于晦涩。若诸位有什么问题或发现什么错误也可以在下面回复,希望能有更多优秀的Kindle词典出现。, Y6 } j% }' I$ I# {* ~
; K: f' G* D1 ?. h5 m另外:关于Kindle上的汉语词典,我发现kindle支持将繁体作为简体的变形词,意味着若处理得当,那就直接为简体词头添加繁体的变形就够了,不必再另添词条,词典体积将大大减少。各位有兴趣可以试试。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?免费注册
x
评分
-
10
查看全部评分
-
本帖被以下淘专辑推荐:
- · 词典制作|主题: 217, 订阅: 40
- · 语言态度|主题: 150, 订阅: 19
- · MDX制作|主题: 46, 订阅: 17
- · 玩转词典|主题: 46, 订阅: 11
- · tech|主题: 2, 订阅: 0
|