TA的每日心情 | 开心 2023-9-27 20:45 |
---|
签到天数: 847 天 [LV.10]以坛为家III
|
本帖最后由 nullname 于 2019-9-30 10:39 编辑 9 W( i, }8 P+ |( z" ?
: a9 L" ~# x! b. y- e+ W
一、前言& a- v: a5 b* v. P+ o H/ _
& p2 I4 e( Y& g本篇文章的所有部分均来源于书伴的《如何把 MDX 格式词典转换成 Kindle 字典》 ,只是仅通过该教程的方法所转出来的词典基本没法用,原因是Kindle不支持@LINK跳转、不需要音频、以及需要添加Kindle支持的变形词搜索功能。经过几天的摸索,逐渐有了点头绪,并制作了AHD5th,试用两天后觉得尚可。便于昨天发布。帖子见此:[Kindle词典]美国传统词典American Heritage Dictionary 5th(精制版)。5 I. [& F6 ^6 B
% ~. j5 d% q0 R0 P+ N! J
本文章展示如何通过Python来最大限度的优化以生成体验较好的Kindle MOBI词典,为各位提供一种思路,以期众人群策群力,制作出更多好用的Kindle词典。. X# x" k( v) e T
2 ?0 F3 _2 U) A' j! K$ C4 o为了文章的连续性和完整性,对于完全相同的部分将全文引用这篇文章《如何把 MDX 格式词典转换成 Kindle 字典》 的内容。
9 C( \# `& A: |2 s
" ~# u9 `* B3 ^# \0 @) }; f$ _4 y! K8 R: a6 o- J
二、正文 2 M6 k) J. O5 {5 K- h
& p. b! z( @/ C, I7 d/ X书伴的这篇教程共有四步,还用到了一些工具。工具请自行下载,因下面所用的代码是Python 3的,所以除了Python 2 ,Python 3 也需要安装。第一步和第二步是一样的,不赘言,仅截一张图于此。' E; i {# ]- A9 m, `3 r% t( p8 K
0 o& f* ]+ _& p6 f6 p
7 {/ u9 B; k$ i$ ^
P! h. x# T7 B4 ]. a8 X
# a" R' {3 O# _2 a8 B5 z7 ^, `) r6 f
工具准备好后,选择你想转制的MDX词典(本文只针对英文词典,即英英/英汉),下面以论坛里的American Heritage Dictionary 5th [IPA]为例。
) p+ Z/ p2 U! m \( x! D) z; E6 y9 H1 f/ q
s8 V; E' u4 S5 [) Y* [- V经过第一步和第二步的处理,我们会得到一个体积较大(视MDX而定)的TXT文件。其内容格式应该是这样的:
- I& T; T4 K: D" H# i. o$ z( o# K! ~$ f& `! d3 i
' R/ V! G9 l5 R) N4 f6 I; b. x8 {7 d0 P6 p7 R( ^! e: Q8 X
( f/ H d- F) Y; ^+ [- n' X _7 h$ `4 q
得到该TXT文件后,我们可以选择几行看一下或者搜索一下如".jpg", "<img", ".wav",="" ".mp3"之类的关键词,把图片和音频等等鸡肋全部删掉。同时,这类CSS引用也可以删掉,以减少文件体积,提高后续处理的速度。CSS引用可以在最后一步添加。比如随便看一下,扫一下就有这些:
9 S) z8 D, T$ C2 I) ^ h7 o/ `' b) C) N) G. v3 W7 u. q; @
0 o1 g9 j4 s5 ?
7 M' c, K# A8 R. J6 J+ W
5 Q0 A! [: Y0 I* J9 Q3 l9 `+ c5 W
我用的是Notepad++,以下是我用来替换的正则表达式:% n" m8 I# W- G8 f) K; h" G! ^ f' X
7 n1 F1 O0 k5 m N! b4 x 图片:<img.*?>$ m( J9 B. t/ H# f- b
8 ]/ K: I) K' x$ O5 B
音频:<a href="sound://.*?"></a>$ T" |4 W( W' D; k: c
# Z/ H l7 s8 B8 ~1 N6 y6 }
注释行:<!--.*?-->! G( w, ^3 a" c4 c) D, \
( r* _ N: j) b+ z Y; c可能还有一些冗余的标签,视词典而定,比如我这里就有<span> </span>,直接全词匹配删掉即可。
w, C" F/ P- q0 |! r! v( D& u7 k4 Y$ B/ C
我这里这样处理了一下之后,文件的体积直接下降了25%(约100MB --> 约75MB)。* v1 u9 G$ b, Y/ H/ U
6 V4 V4 z# u6 g
简单处理完之后,便是正式处理@LINK跳转了。TXT文件的格式只有这两种:单词 + Tab + 意项 或者 单词 + Tab + @@@LINK=另一个单词9 U& C7 _! h' [$ F
1 K' H8 k0 K& p1 M5 p
这里我们主要要将跳转词后@@@LINK的跳转链接替换成目标词的意项,因为Kindle不支持@LINK跳转。为方便后续称呼的方便,我在此做个定义。以开头两个词条为例:8 }) I2 [9 P' i( G x$ R" j1 t
1 E% t( w) x$ ^3 Z/ H8 X) V6 m% Z$ @7 D* c3 e) K
7 J! Y$ Q6 s( v' M4 ?( P
. d- d# t; ]9 \4 Z* r- J& K! L
9 u5 \+ K' q( Z9 v: K" u但是这里也要分情况,因为如果一股脑全部将@LINK跳转都替换为目标词意项的话,看起来简单。但实际上会导致文件的体积无比巨大,因为里面存在着大量的像这样的跳转:" ^# R% P. q' g
- M# O% p- E/ w; j
' G, Y/ j# ^4 s! B. }6 P7 ]+ K! d2 I) C7 Y3 L; K
& I) ^& K# W4 U
, L j; ~: o: ~
仅仅是advocate这样一个词,就有七个变形词,它们的目标词都是一样的,如果只是粗暴的替换,那么最后生成的词典肯定无比庞大,甚至如果你内存低点最后都不够用来生成词典。(猜想而已,我没这么干过,有兴趣有空闲的朋友可以试试)
# I1 G7 {% v7 [6 Q8 @9 J$ p4 q1 p2 ~$ J/ h8 b3 r. c1 n; y/ @1 [
因为Kindle词典支持为某个单词添加不同的变形词,利用这一特点,我们可以在此处判断,如果跳转词是目标词的一个简单变形,那就跳过该词条。判断的依据来源于dsl2mobi这个工具里面附带的英语单词变形词列表。文件名称:forms-EN.txt,内容如下:
4 q% n2 D+ s! z) D. `. j
( @$ l: _) [1 q' g9 {% m
% m( |, U1 ?; |0 Q. x% {/ h; n$ m3 b" b& M4 u+ T
' P3 I# i1 }* V$ [: B4 c8 i
) p% u! j' ~! a% }/ M# @& e: {4 {简单总结一下,做了个程序流程图:
; M* u! {' A' B* l1 g4 h9 [3 A* \% ^, U) c$ U% h; d* ]
- k4 f! g7 u. j; j. z' y+ A6 l
( p, Y3 ^6 U9 {* L3 X
. u9 n# w8 ^3 m7 R0 V% r* `/ \, a' D0 D, O$ o0 N% M) [
这是代码,你需要修改第3、4、5行的文件路径和第50、51行endswith方法和replace方法中的值改为你操作的字典的实际值。详细的内容请看注释。( H% r) N# W p0 I# u* i
# E; @ X( p+ D0 N
3 `( _4 j1 t6 O5 ]( Z
: S* v7 ~6 w2 [' U: h
6 R' B. P: M% }6 k7 u5 b$ C9 L/ q
) u$ C5 E; r% b( r
+ R: g6 q) N% J( t6 l6 q1 s% Z0 G; O( D$ c% m3 h
8 [4 i! B1 Q0 O$ |
注意:Fix_Redirections.py有一个同级文件夹wordforms,文件夹内有forms-EN.txt,请勿修改。* U7 l6 f! Y. |
8 s9 C2 q# w8 ]" W" L
?5 G1 N7 }, u S. {2 d修改完了然后执行代码,你看到的图应该是这样的:
* w6 S3 A+ g1 T0 ?3 Z; e/ Y. I8 y
" z$ g0 @5 _& Y9 G9 b! C: c4 q5 }) S
9 @3 k0 |+ _" m3 d0 g' k9 P6 Y2 m' t @
: i- D1 T0 v5 Q: R- r6 l
; P' e0 j3 o9 w, Q3 h7 [/ z这一过程的速度取决于你的电脑配置和词典的词头数,我跑这部AHD大概花了大半天的功夫。
8 z, |/ m6 T) F/ [1 ^6 o, Q' W3 H& J9 j
跑完之后的文件可能存在很多空行(不一定,看词典),这里附上一个去空行的脚本,使用方法:
, G* k! r9 ~! c1 u2 u8 y. g/ L9 }. d# S1 B J
, [5 U- B2 C# c) ? o: w0 z0 m+ F3 A2 {( B5 o- U
' d8 R$ j' W0 S- N) m3 c
8 t8 ~4 v! m- }9 }7 r# W; A/ ]6 B6 Q6 h t0 ]$ E4 ?
- |# I) _2 p% U6 p$ p+ o e
执行完成后会在处理的文件目录下生成一个名字带_stripped的文件,这就是去除了空行的文件。+ [2 `" c9 j7 D* {) N
8 ]3 X; m# o3 R" X
( j7 r0 T4 E9 N# x0 p X2 Q' @9 i
# {) h; @# m5 q
9 W$ @; l$ u9 I) ?1 m5 q这时候可以打开文件看一看,应该是满屏紧凑,没有空行,没有@LINK跳转的,就像这样:: z2 d4 m! {4 v0 O9 Y
: H O7 c4 h3 l' R* T. N8 s
# i2 O+ x0 L9 K3 o, f' S( s; s0 N- M/ \
( J) r6 \* w$ x5 W; g8 |
7 l4 y( t2 I0 N8 Q7 |# m3 ]
到了这里,就可以开始正式进行第三步了。这里用到的是tab2opf.py这个工具,该工具基于py2,所以要用py2来执行。从书伴直接下载的tab2opf虽然没问题,但是根据我的经验,把253行的print df给注释掉,速度会提升许多,而且出错的机率也会减少。除此之外,由于词典的不规范及其他特殊原因,我们上述生成的xxx_stripped.txt难免会有几个或十几个错误行(MDX词典本身的问题),因此,最好加一个异常处理的块,遇到错误行直接提示一下就跳过,免得程序中止运行,你们可以参照下图修改,注意红色箭头的地方。: U3 x3 L: F: J B
" C# D' t0 ]: k! n3 I
D u1 K$ a. M1 |
8 W2 I1 v( S& y3 i% K; |9 w T
( U" R0 i$ ^ j# Q9 c
8 X- G ?5 b2 Y( \ Y然后执行命令:python2 tab2opf.py -utf xxx_stripped.txt
: B; X3 ^* n* P+ a5 o; e# w
4 [3 b6 w. H; _+ q: ~执行完毕后会生成一个opf文件和一堆html文件,如下图所示:
5 l; E) ]! Z0 V: s ~9 f- l
. e/ I2 I8 j$ a/ q7 L4 V
4 W! S' ^* v: E; D+ m5 O
7 @$ s' ^6 L4 ?1 O! Z$ \0 o2 @( B2 r' g
9 h5 J/ s) m5 i* @5 A
在进行下一步之前,我们还得写好CSS,我的电脑配置不行,打开太大的HTML文件很卡很卡,因此我提取一些意项较多的词条来单独修改建议"go", "take", "in", "the"等,这里我提取“go”词条,复制"go"词条所在的一整块<idx:entry> </idx:entry>,然后加上头和尾(头尾可在任意一个html文件中复制即可),保存为html即可。如图所示:6 Q+ }* j% K& b" e9 }; v! w5 O3 |5 u
4 y& R: S9 Z7 r" M, p( q+ V0 P$ T' Z/ e( W. s5 Q6 h8 `3 A
- Q$ n* f3 ?( l: Z( f9 g& ]- Y) [
- a _- K5 z" s0 x7 m; j
4 k" J3 z( p Z' ]) M4 T因为我们要测试css,所以再添加一个head标签并在其中用link标签引用一个css文件,然后就可以写css了。1 A% F: D& K& k+ Y5 u5 m! _2 K
3 }( b) H. R8 ~4 l5 B; d
' V, }0 B5 l3 I* n3 d: ~: U, Z) G
; p( O" ?# g2 Z0 Q+ @
5 f: q$ G( `2 E0 o% P3 T* k, I6 ? K
MOBI的字典只能生成v7版本,该版本对CSS的支持极其有限,margin只支持left其他方向都不支持,即使是看起来有效的margin-left,也不过是在转化过程中替换为blockquote而已。所以只考虑粗体、斜体、下划线和颜色即可,当然不管这里用什么颜色,Kindle上都是浅灰色。" m4 J6 b Z; a' a! M% r: Q
& o: n3 u7 N0 L, P5 w2 w$ Z这是我修改完毕后的效果。
$ r5 n5 }/ Q6 {3 r% {: C; k
- `* a% b% D v+ Q
2 N$ G! _$ Z: R1 T1 k$ a) b% ?9 L: {& [1 s5 |1 {
7 o4 x# D; G, s5 m
9 K+ B6 F) Z3 L( g
css满意后,那就可以给所有的html文件批量添加link引用了,这里notepad++可以单独完成,就不写脚本了。方法如下:
( r6 m2 ^( q0 G7 i. {2 c- h, Y* l' Q( Q
打开任意一个html,Ctrl + F,然后切换到文件查找选项卡,下面注意选择正则表达式,如图所示:/ k. B' t Q# H8 v/ G, E' B
% M9 r j. Z$ ?
6 k' Z1 {4 R! V8 J2 g9 o2 E0 V2 M, d/ K) e7 M& l8 T
; `4 G% T- ~% B0 h
8 `; Q9 S! b' P( l( q2 i. v
! |/ u% P5 L' J) G
查找目标: (<html.*?>) O. O4 m# L' E4 A4 E' i" ~7 @
& S/ \+ \ a3 r4 V6 B3 P
替换为:\1<head><link rel="stylesheet" type="text/css" href="test.css" /></head>
. O, e- ?; b/ O+ A3 x* O! |$ l, ]6 r! o) h% ~! n
文件类型:*.html
( o4 C$ }% u2 Z7 L/ L; v8 ]! J) \ s+ z! V! Y, k2 E* X3 O
目录:即html文件所在的目录
+ x9 g" O: D- Y. z) e# k! G) N( l. e8 Y
. a6 j7 y, X( T4 ?( l! ^: G9 `, {6 y5 H: O7 w! l
然后点击文件中替换即可,这样,所有HTML都添加了CSS引用了。
. h1 e" X5 m2 ]2 C( d
( R0 j3 `5 P4 A/ _. Z j5 x& t1 [现在到了另一个重要时刻了:为即将生成的Kindle词典添加变形词,原理就是检测forms-en.txt里面的单词然后提取出变形词添加进去,上面说过了,此处不再赘言。+ W7 ?0 O& D' J& L- _
e9 _9 x( o$ v; ]7 k
代码很长,不贴了。用法很简单:Add_Infl.py html文件所在的目录, o: n, p9 d6 C, D
$ c9 C9 \$ G E& I' X2 |
9 K2 ~2 h% I) D# t. @/ ?, Q
% C9 ]( o' e. a4 E, R
6 D U& p0 Q0 _
' M1 X+ R# v. [7 O" G文件在此,解压后其他文件和文件夹勿动,以免程序不能正常运行。/ l) E9 w. \+ o7 |
" M5 w5 X- V( F+ w! N% V; X) i
$ j$ r8 h/ Z! S; T
( u* x9 g8 J$ t$ P
然后会在目录下生成一个名为OK的新目录,新的HTML文件即在此。
% I% U( K3 Y5 I( ^5 v' f$ F
: Z1 O* M. @% r7 R- T3 ^( w9 K最后就是把之前的opf和css复制进去,然后用mobigen.exe生成即可,mobigen.exe -unicode xxxx.opf% K) c4 o5 @$ M7 F. Q# m+ ]) V
$ [5 v' K/ x9 l* Y: Y9 k如果你想修改生成后的词典名称,打开opf,修改这一行即可- l( w. }3 ?: E
/ L! @5 j4 w- U$ W1 R8 i
+ J" P9 n; T7 _- M1 `$ h$ ?
: j7 y! @' w2 U: ]% z8 H9 N$ j6 H
6 `$ R; k- L# @+ { I4 E0 K; m5 Q3 h) @7 _+ I# n! `
完。
8 D6 V0 `! c# H4 f+ ~
: u/ f3 P+ g# O( J8 `# `5 e三、结束
# L M7 B; A3 g, r% {' r
& l+ H9 `' V( u2 u! d第一次写这种教程帖,步骤、截图等等都很繁琐,几次我都差点晕了。简单看了几遍,算不上流畅但也不至于晦涩。若诸位有什么问题或发现什么错误也可以在下面回复,希望能有更多优秀的Kindle词典出现。
N: O4 D2 H& X% d
- ?; B+ ?, b, g9 ]另外:关于Kindle上的汉语词典,我发现kindle支持将繁体作为简体的变形词,意味着若处理得当,那就直接为简体词头添加繁体的变形就够了,不必再另添词条,词典体积将大大减少。各位有兴趣可以试试。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?免费注册
x
评分
-
10
查看全部评分
-
本帖被以下淘专辑推荐:
- · 词典制作|主题: 217, 订阅: 40
- · 语言态度|主题: 150, 订阅: 19
- · MDX制作|主题: 46, 订阅: 17
- · 玩转词典|主题: 46, 订阅: 11
- · tech|主题: 2, 订阅: 0
|