TA的每日心情 | 开心 2023-9-27 20:45 |
|---|
签到天数: 847 天 [LV.10]以坛为家III
|
本帖最后由 nullname 于 2019-9-30 10:39 编辑
" O( K1 u6 L# h1 T# L- [& Q' x9 c0 D& u5 s! y
一、前言
+ A: s/ @9 _+ O' V X) x
0 l9 O$ x8 h9 z R本篇文章的所有部分均来源于书伴的《如何把 MDX 格式词典转换成 Kindle 字典》 ,只是仅通过该教程的方法所转出来的词典基本没法用,原因是Kindle不支持@LINK跳转、不需要音频、以及需要添加Kindle支持的变形词搜索功能。经过几天的摸索,逐渐有了点头绪,并制作了AHD5th,试用两天后觉得尚可。便于昨天发布。帖子见此:[Kindle词典]美国传统词典American Heritage Dictionary 5th(精制版)。' e6 w8 ?/ N' o0 ]5 v
* C5 J- ^. A5 B, x本文章展示如何通过Python来最大限度的优化以生成体验较好的Kindle MOBI词典,为各位提供一种思路,以期众人群策群力,制作出更多好用的Kindle词典。% t" J! M1 j" ^+ I
4 q" X6 |% V/ K3 j+ ^! L1 \
为了文章的连续性和完整性,对于完全相同的部分将全文引用这篇文章《如何把 MDX 格式词典转换成 Kindle 字典》 的内容。 r+ c. b& J) R! N a p( G7 Y
% K( i1 _8 p8 H1 |3 b
/ {9 n$ S7 q @/ l6 K+ a
二、正文 & `: e% i" Z8 k; ~! Q. |9 D1 g- m2 r
/ W% U6 o! R. W/ q" {书伴的这篇教程共有四步,还用到了一些工具。工具请自行下载,因下面所用的代码是Python 3的,所以除了Python 2 ,Python 3 也需要安装。第一步和第二步是一样的,不赘言,仅截一张图于此。
/ o( e, `9 }% o$ A* v: M8 l0 ]4 Y3 D, x B% a! R
, j2 @4 U1 Y4 N
) f' G8 V2 i2 I
% D: M; ~. S6 z) L! c- m9 t* `' v$ `+ K) r( o# ^
工具准备好后,选择你想转制的MDX词典(本文只针对英文词典,即英英/英汉),下面以论坛里的American Heritage Dictionary 5th [IPA]为例。
# Y0 `* S7 n6 R# t: X3 f# S4 |8 p& G. U7 P1 V
u; P$ N& D4 b* @0 m经过第一步和第二步的处理,我们会得到一个体积较大(视MDX而定)的TXT文件。其内容格式应该是这样的:" U: P* D% {/ o" ]- l9 |
% V8 `) Y) h9 S! G6 P& M
( T5 W# c0 q7 ~. v3 ^, a1 |$ y
+ T6 w$ u* \7 R- w
2 J6 K# s+ p( ]
; J; s& V O# [: k5 }- c2 p/ y; I
得到该TXT文件后,我们可以选择几行看一下或者搜索一下如".jpg", "<img", ".wav",="" ".mp3"之类的关键词,把图片和音频等等鸡肋全部删掉。同时,这类CSS引用也可以删掉,以减少文件体积,提高后续处理的速度。CSS引用可以在最后一步添加。比如随便看一下,扫一下就有这些:# X. `: p/ i4 q' u3 {1 c9 W
' Q/ N8 R! H$ Q
# L ]" @4 c# Z* J: Y- J5 S) I9 w: m) _7 m) {8 i
! d; k; L2 Z. y" W
% l1 z0 x9 }7 ~我用的是Notepad++,以下是我用来替换的正则表达式:
1 |# y2 q! O. P7 F, b- V& G! W1 U: ~8 j' A+ N
图片:<img.*?>
) C* n% E3 K0 W1 o2 x
u! a" j3 Y% t! a) [ 音频:<a href="sound://.*?"></a>: E; t1 i5 B" b \$ {1 _
- l4 r( m# e# x1 V% i# O6 h" S, Y. H ^
注释行:<!--.*?-->$ t# }* [) Y Z2 h6 Y1 X Y
. U* r ?' f [$ f( c
可能还有一些冗余的标签,视词典而定,比如我这里就有<span> </span>,直接全词匹配删掉即可。
2 U; u d J! d* P9 v: ^( E; q7 {2 M8 ~5 [* B; D4 I
我这里这样处理了一下之后,文件的体积直接下降了25%(约100MB --> 约75MB)。
8 l2 P) U9 u" p3 S" \( H
9 t; i$ n' K% p0 R% e! h' ~简单处理完之后,便是正式处理@LINK跳转了。TXT文件的格式只有这两种:单词 + Tab + 意项 或者 单词 + Tab + @@@LINK=另一个单词
+ m9 Z7 J5 e. G+ {& z D# Z0 r' B. V& U; P1 {
这里我们主要要将跳转词后@@@LINK的跳转链接替换成目标词的意项,因为Kindle不支持@LINK跳转。为方便后续称呼的方便,我在此做个定义。以开头两个词条为例:0 H/ r( ~3 F$ a
% P) E& u4 u3 y. }$ w5 b- d
/ q/ R3 C0 p7 o; T4 \) ^
! f. P) R1 ^. p! I G" r
: S6 p: d9 p: ]; l k! `
* q+ @8 F( P" p2 T5 }但是这里也要分情况,因为如果一股脑全部将@LINK跳转都替换为目标词意项的话,看起来简单。但实际上会导致文件的体积无比巨大,因为里面存在着大量的像这样的跳转:: b3 u! ~% {7 n7 X; B* ]# |, [
' d$ L. Z8 U3 V! t7 r
7 X# Q8 q' M0 F2 f4 r! S4 V0 A
4 q: w/ v) [" j2 p' o
- C, [9 V' m$ [% A) P; z& t3 s仅仅是advocate这样一个词,就有七个变形词,它们的目标词都是一样的,如果只是粗暴的替换,那么最后生成的词典肯定无比庞大,甚至如果你内存低点最后都不够用来生成词典。(猜想而已,我没这么干过,有兴趣有空闲的朋友可以试试)
" v& q6 T6 \7 A r P$ V
- \) F0 K& f9 c1 {. V/ m5 y9 P因为Kindle词典支持为某个单词添加不同的变形词,利用这一特点,我们可以在此处判断,如果跳转词是目标词的一个简单变形,那就跳过该词条。判断的依据来源于dsl2mobi这个工具里面附带的英语单词变形词列表。文件名称:forms-EN.txt,内容如下:
, t& S* `' O O1 ]8 k4 m9 E e8 I7 a# U+ J$ H& V3 _
+ C! n9 w) o" E, g' s2 c
K1 a4 |4 \0 X. y
5 _' C! m* z, _6 f% k
( m) h2 P6 s! z0 h简单总结一下,做了个程序流程图:
9 x/ x/ z: |- Q7 j9 p @: i) R! s( I. s! q" @+ Z! q) ^5 Y4 i
8 @. _5 f J1 [3 }! y, u
! m* M: y& A1 ?* @/ [' q( T
" y' k" B0 I8 s6 U* r
3 z* Q& L8 z4 V$ T, e( |- t L% o% }这是代码,你需要修改第3、4、5行的文件路径和第50、51行endswith方法和replace方法中的值改为你操作的字典的实际值。详细的内容请看注释。1 Q4 D! c) B9 Y" N7 `+ I
% T( s& T$ @" e4 u# @
* n9 k7 e4 u/ ]# u5 g
4 x P( D+ J' f9 \$ S' t# C- S- `* T+ [7 @. Q' K* {$ r
+ i, |- ^" E* @; w! C
\' C2 }( i9 m! u0 B! I2 W
# M: L- \$ \5 ` {. I7 Y9 X" F) a; x5 ^; }
注意:Fix_Redirections.py有一个同级文件夹wordforms,文件夹内有forms-EN.txt,请勿修改。7 c9 l7 o0 H6 Z) D: e
, z+ X( r. `2 p4 w7 J9 |' c: _" e7 H% n1 j. ?: O
修改完了然后执行代码,你看到的图应该是这样的:4 b9 V8 w' y+ u0 p# U
, s8 |3 W& y8 o, \8 G. B! @& }7 j
9 R, B- @( c9 ^' R
9 B/ o0 D/ ]) U. J: d% d
; L3 Z! Q- r! u
, S* l( F% A3 e这一过程的速度取决于你的电脑配置和词典的词头数,我跑这部AHD大概花了大半天的功夫。/ r6 j# G6 P9 U- L2 p0 z
. q; `' B. B3 F- w" \4 a& Q跑完之后的文件可能存在很多空行(不一定,看词典),这里附上一个去空行的脚本,使用方法:9 _% O) A$ J' A) e3 k
- N' \' z% f' T' b* L
0 E+ Y h0 V1 Z' ]4 X2 |- `- E8 r/ n5 B& Q' m0 T! l
8 f; O5 g* f& t+ ` s1 ~
( }' ~0 j7 l6 W1 O7 I$ x6 ^
8 i1 U6 [: K$ F+ N/ q6 v& e( ~& x$ Z0 P9 a" O, H
执行完成后会在处理的文件目录下生成一个名字带_stripped的文件,这就是去除了空行的文件。! [ z7 R7 p1 V8 u0 \& d
5 F0 ?- e* u+ I; M) F
. Z1 D% M/ b7 p4 v6 n: q @7 w
; v" u. q. I4 t& ^ _0 I N' A+ x P# z0 A! P/ k
# l! x" A' [" t6 i这时候可以打开文件看一看,应该是满屏紧凑,没有空行,没有@LINK跳转的,就像这样:1 e' T+ B3 m/ K% W7 Y T
$ R v/ c2 Z. `, R1 f" [! j2 M
4 E( F' w7 ]6 w- x& u$ a, Y" I" U. m1 O( Q# `
. b; _) }% X- R( k$ j% b8 Q1 u
/ z8 [! c9 E3 h' s0 o- R+ R5 H! w
到了这里,就可以开始正式进行第三步了。这里用到的是tab2opf.py这个工具,该工具基于py2,所以要用py2来执行。从书伴直接下载的tab2opf虽然没问题,但是根据我的经验,把253行的print df给注释掉,速度会提升许多,而且出错的机率也会减少。除此之外,由于词典的不规范及其他特殊原因,我们上述生成的xxx_stripped.txt难免会有几个或十几个错误行(MDX词典本身的问题),因此,最好加一个异常处理的块,遇到错误行直接提示一下就跳过,免得程序中止运行,你们可以参照下图修改,注意红色箭头的地方。/ X2 N6 G! A' [" g$ n
8 r9 j8 ] f7 V; M: f$ G5 e, ^
j: O. C" C/ a/ V o7 s6 E% L& \$ F) H8 g# q. g/ e) E
2 O8 t* B p; s2 c4 M8 {; s
# p7 G* Y1 t4 p& I9 A7 ^6 L然后执行命令:python2 tab2opf.py -utf xxx_stripped.txt
1 }7 |. M+ e" Y7 T: C+ N9 {' h c/ I2 ~5 C8 v
执行完毕后会生成一个opf文件和一堆html文件,如下图所示:
' [) _" K4 n3 Q
! n1 \& i6 ?! }! ?; b6 l' B4 {& z; y& R- ]
- R! K( `/ v2 {/ W; E3 i' L% f3 P
+ F7 d( k3 Q4 B5 x4 I/ m- @+ U( F4 K
在进行下一步之前,我们还得写好CSS,我的电脑配置不行,打开太大的HTML文件很卡很卡,因此我提取一些意项较多的词条来单独修改建议"go", "take", "in", "the"等,这里我提取“go”词条,复制"go"词条所在的一整块<idx:entry> </idx:entry>,然后加上头和尾(头尾可在任意一个html文件中复制即可),保存为html即可。如图所示:8 |$ Q: E$ d+ y! v- z+ u7 H
' X0 a1 D4 s/ L; u7 L- B# N0 I- b4 @) ^& x j
" M b* P3 ], d3 p. {: L7 L' s# T+ o7 [
" J. [3 E$ Q! j7 \4 m3 I; y! M
因为我们要测试css,所以再添加一个head标签并在其中用link标签引用一个css文件,然后就可以写css了。
6 H1 B3 Z% o5 L8 C L% e- o- U E% j; z0 P4 @
/ H6 g% g' _3 G# |2 b s
. ^! ~1 D- m) m# O6 y U
: t, ?; D% L* D
5 U) m: Y9 u: ]MOBI的字典只能生成v7版本,该版本对CSS的支持极其有限,margin只支持left其他方向都不支持,即使是看起来有效的margin-left,也不过是在转化过程中替换为blockquote而已。所以只考虑粗体、斜体、下划线和颜色即可,当然不管这里用什么颜色,Kindle上都是浅灰色。; ]/ G ^! Q& m
" M8 w; A M' ]0 t这是我修改完毕后的效果。
; B4 i6 Z6 }" P4 ]7 \( \& ~9 [+ P) B; p
. C/ k6 H: q( l V
% t( y9 R* Y4 I+ A0 |
2 C1 T- x3 ^: r* ~% ^) x8 K
0 O+ _% ?$ T/ ~0 M2 _css满意后,那就可以给所有的html文件批量添加link引用了,这里notepad++可以单独完成,就不写脚本了。方法如下:. X4 s9 K! O9 f- w4 C5 F8 |
) w1 c: w' A# O/ a/ P# L2 G打开任意一个html,Ctrl + F,然后切换到文件查找选项卡,下面注意选择正则表达式,如图所示:
% G, t* g" o% T3 E" w9 A5 P/ a5 v" n! |" e
4 R V( Z) `, g# p: n" t
$ _0 _- o ^8 \# {& ^9 k& a' {& @+ u5 X9 b% c. s
/ T& c- s0 W7 t5 f
' i. B4 d! w# W
查找目标: (<html.*?>)' ?% ^% M7 h" _# @
) s6 ]' ^- j" ?) k- j替换为:\1<head><link rel="stylesheet" type="text/css" href="test.css" /></head>
& n8 f, S5 c1 t* E! s9 z
" v% a7 f% C+ {% J C. X- Q: R% @文件类型:*.html% h" P6 p' `9 I5 q
( K4 z; h+ R: s
目录:即html文件所在的目录
& H9 i7 t1 o9 B% [8 x3 S" {% N. A& p- H
8 a$ s2 j8 |) M: j' [7 {+ R7 R9 ^2 N9 j
然后点击文件中替换即可,这样,所有HTML都添加了CSS引用了。
1 h9 t/ _& V4 d+ U# O G, e# P
) w+ Y0 t' @2 C0 q现在到了另一个重要时刻了:为即将生成的Kindle词典添加变形词,原理就是检测forms-en.txt里面的单词然后提取出变形词添加进去,上面说过了,此处不再赘言。: @, G a( W9 p. u9 O: s. \2 t
( s$ m, q: [- v/ ^ }- M+ f1 m9 h
代码很长,不贴了。用法很简单:Add_Infl.py html文件所在的目录& \6 I! i/ _# z$ X4 P/ s
7 n+ s. x# h0 L- W% f2 K
# `) R4 T( B- g! a5 N
+ {& {6 x% Y+ N/ G' E P
8 A; b5 f. d1 ?7 V/ f; ?+ G4 {7 g- Z% j# @/ ^& u: y/ u; B
文件在此,解压后其他文件和文件夹勿动,以免程序不能正常运行。2 v9 ]1 w5 v$ O" Y# A R Z
+ d1 K0 J _; k8 x
) T1 E2 }( D O8 j0 [7 w# C
4 n4 u! A2 {2 P& I然后会在目录下生成一个名为OK的新目录,新的HTML文件即在此。/ J+ X2 k; c' Q7 L$ F7 `
. u" a. ]0 K5 B0 x$ x. N. t- V2 Y `
最后就是把之前的opf和css复制进去,然后用mobigen.exe生成即可,mobigen.exe -unicode xxxx.opf
o2 ~. h) j, z# F# {! O, z9 l! @- {3 n0 z& p8 z0 y
如果你想修改生成后的词典名称,打开opf,修改这一行即可0 M. i! y$ e2 Q+ T
2 j) y6 }5 V) d' r/ [5 x
4 v: r& ^& E; u9 b/ Q* v7 @
+ K( }5 ?/ @& J# p4 M7 N {% V- o: q2 w8 u0 M( t
$ w, v6 q) C8 E% `
完。) d) Y' P6 j: r9 n' w' k# Z
5 v" {: a% o9 f1 k
三、结束
0 O+ F6 u0 n4 B" I/ I8 Y9 K! h' e1 `% B3 e* Y
第一次写这种教程帖,步骤、截图等等都很繁琐,几次我都差点晕了。简单看了几遍,算不上流畅但也不至于晦涩。若诸位有什么问题或发现什么错误也可以在下面回复,希望能有更多优秀的Kindle词典出现。; I$ }( U2 f+ c1 {9 u+ ]' W5 ?
+ K6 d; v6 n% k0 w8 U另外:关于Kindle上的汉语词典,我发现kindle支持将繁体作为简体的变形词,意味着若处理得当,那就直接为简体词头添加繁体的变形就够了,不必再另添词条,词典体积将大大减少。各位有兴趣可以试试。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?免费注册
x
评分
-
10
查看全部评分
-
本帖被以下淘专辑推荐:
- · 词典制作|主题: 217, 订阅: 40
- · 语言态度|主题: 150, 订阅: 19
- · MDX制作|主题: 46, 订阅: 17
- · 玩转词典|主题: 46, 订阅: 11
- · tech|主题: 2, 订阅: 0
|