掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 5293|回复: 7

[教程] Python辅助MDX转MOBI(以AHD5th为例)

[复制链接]
  • TA的每日心情
    开心
    2023-9-27 20:45
  • 签到天数: 847 天

    [LV.10]以坛为家III

    发表于 2019-9-30 10:32:44 | 显示全部楼层 |阅读模式
    本帖最后由 nullname 于 2019-9-30 10:39 编辑
    # A7 Q, w3 ~' Z/ a9 Z7 B0 O, a
    7 s* s* c% K  `3 A9 h& Y一、前言7 }7 r  Z1 T* N; F3 \; |0 Q
    + b8 @0 }) Q, ^
    本篇文章的所有部分均来源于书伴的《如何把 MDX 格式词典转换成 Kindle 字典》 ,只是仅通过该教程的方法所转出来的词典基本没法用,原因是Kindle不支持@LINK跳转、不需要音频、以及需要添加Kindle支持的变形词搜索功能。经过几天的摸索,逐渐有了点头绪,并制作了AHD5th,试用两天后觉得尚可。便于昨天发布。帖子见此:[Kindle词典]美国传统词典American Heritage Dictionary 5th(精制版)
    2 r" ~/ o  W" h/ l8 z
    ' ]7 ]. p5 g2 _本文章展示如何通过Python来最大限度的优化以生成体验较好的Kindle MOBI词典,为各位提供一种思路,以期众人群策群力,制作出更多好用的Kindle词典。
    ! i' C/ w% ^, p3 Z0 A6 {) w+ i0 m
    为了文章的连续性和完整性,对于完全相同的部分将全文引用这篇文章《如何把 MDX 格式词典转换成 Kindle 字典》 的内容。
    % u: r4 d% S, \9 j; S4 \4 x2 R
    : ]+ W: I( r' _
    二、正文        5 a$ E6 t3 {4 A

    0 y) K9 l0 @5 K5 {+ Y- ^+ l; }% @  Q书伴的这篇教程共有四步,还用到了一些工具。工具请自行下载,因下面所用的代码是Python 3的,所以除了Python 2 ,Python 3 也需要安装。第一步和第二步是一样的,不赘言,仅截一张图于此。8 [* Q. L. b$ G+ I2 ^0 n
      y9 J9 _# q- |9 x4 a9 d, t

    , U! }0 r# L+ a5 Y4 n! X: K+ Z  H, B; \0 I" U, x  K
    0 ]$ |/ ~; |* u$ [
    5 @7 i7 T; z5 m. h& j
    工具准备好后,选择你想转制的MDX词典(本文只针对英文词典,即英英/英汉),下面以论坛里的American Heritage Dictionary 5th [IPA]为例。) `: A- h7 _7 V

    - J3 g4 q" n5 a) h; z
    $ j  X. w- y1 J; a) }经过第一步和第二步的处理,我们会得到一个体积较大(视MDX而定)的TXT文件。其内容格式应该是这样的:
    + ^, R/ ?( T# t; T4 i! h  m8 s6 A' f2 X9 L

    ! R; r: r, V2 q$ k4 F$ W
    ( ]. w& C9 l5 b8 q4 ^) n1 C3 {! D' j! h- Z
    ; K2 I; {9 e2 r2 J, B4 O: U4 n. I
    得到该TXT文件后,我们可以选择几行看一下或者搜索一下如".jpg", "<img", ".wav",="" ".mp3"之类的关键词,把图片和音频等等鸡肋全部删掉。同时,这类CSS引用也可以删掉,以减少文件体积,提高后续处理的速度。CSS引用可以在最后一步添加。比如随便看一下,扫一下就有这些:
    # E! W# j4 E6 j. w  W
    6 c. j  W6 ~$ ?, t
    5 f  [3 z& i4 t  D- I/ [$ A( P3 t) O% x: h! B% i+ L" _
    ! u+ F( c( I2 T# c( f

    " u& F1 G3 W9 V) y, f/ D2 I7 u我用的是Notepad++,以下是我用来替换的正则表达式:
    * t( ~% \4 F0 }% N) _. Y" X0 [4 h, P. `, [6 T" s$ M
            图片:<img.*?>/ Z4 \! ?, K$ o6 W
            + |" [0 S) b9 Y% g
            音频:<a href="sound://.*?"></a>
    ( x5 d- |7 {- F$ i! B
    ! Z. m- q$ _% J$ e  u4 E( M        注释行:<!--.*?-->. {% m5 t- p2 O
            ' ]; ^5 I9 N; e; k# g$ d3 B* h& `
    可能还有一些冗余的标签,视词典而定,比如我这里就有<span> </span>,直接全词匹配删掉即可。  b* ]' `8 Y/ T7 k
      F8 h( K% L2 G# m( }4 _
    我这里这样处理了一下之后,文件的体积直接下降了25%(约100MB --> 约75MB)。' K: l. \. p2 }8 T- g

      q; d- m! c! ?- j$ N& A- n- d9 W* M简单处理完之后,便是正式处理@LINK跳转了。TXT文件的格式只有这两种:单词 + Tab + 意项  或者 单词 + Tab + @@@LINK=另一个单词
    ' q+ _2 X, O9 u# M) ]# ~$ m% j+ f
    ' ]5 X; x0 b$ K' f这里我们主要要将跳转词后@@@LINK的跳转链接替换成目标词的意项,因为Kindle不支持@LINK跳转。为方便后续称呼的方便,我在此做个定义。以开头两个词条为例:
    ) b2 R3 H! ]. i% H0 f4 G4 z' @. S
    , H, _+ I! }' n
    / B0 x- m" _! A: ]  f
    # c" h1 y8 H& P: W! r2 `

    ; {: Z3 B* ^1 n& f2 h+ S- r' U但是这里也要分情况,因为如果一股脑全部将@LINK跳转都替换为目标词意项的话,看起来简单。但实际上会导致文件的体积无比巨大,因为里面存在着大量的像这样的跳转:
    ' j: ?) H0 ]6 s: H1 s+ F* T- f6 O4 U4 z) }, \3 j
    - ?6 ^" W# Q. P3 V

    * b" z3 V8 }4 n4 w& h8 D4 L% [( I4 F& W5 g% U& e& z* r+ j- H
    * x% y$ V! `0 j- Y; t" f
    仅仅是advocate这样一个词,就有七个变形词,它们的目标词都是一样的,如果只是粗暴的替换,那么最后生成的词典肯定无比庞大,甚至如果你内存低点最后都不够用来生成词典。(猜想而已,我没这么干过,有兴趣有空闲的朋友可以试试)2 Y) g% ?- T5 d/ d
    ) e& t$ r* M- W+ f# ^% E
    因为Kindle词典支持为某个单词添加不同的变形词,利用这一特点,我们可以在此处判断,如果跳转词是目标词的一个简单变形,那就跳过该词条。判断的依据来源于dsl2mobi这个工具里面附带的英语单词变形词列表。文件名称:forms-EN.txt,内容如下:
    . r. j9 a! n- Z( J- ~6 ?# Z6 U" E) X, H

    " ]% H+ f& B9 U4 s$ Z1 F% j5 V0 \; `2 L" C8 z& @
            9 d2 `$ }% t! m+ f4 W! I

    ) n3 g9 [% o. D) P) s8 j简单总结一下,做了个程序流程图:
    ) w3 Y* V( R; `* w7 q% G0 x
    ! e/ S! V9 v* _. X9 d, s' ]7 Y4 @6 h1 A% v& E+ E7 o

    & v" e% @/ C# ]: Y+ E. Q  H
    / y& G8 T3 U1 @, {+ y- u
    4 r2 u/ f! y# o! v9 c7 b这是代码,你需要修改第3、4、5行的文件路径和第50、51行endswith方法和replace方法中的值改为你操作的字典的实际值。详细的内容请看注释。$ K0 Q, f9 j% Z
    7 y& |. D& O, W0 {& k  R

    6 B$ G0 o1 C8 d& M
    / ^( `" e+ I% h1 p# \9 W3 {& `  ]+ R5 e9 D! l

    * {7 D' F4 Y  O; z2 F* f5 ~! G( c+ J7 O  N* J0 _5 M6 N! g% \
    $ {2 H7 Z! e1 m- n% G, W* f3 {9 r
    & F  y% E! q! l
    注意:Fix_Redirections.py有一个同级文件夹wordforms,文件夹内有forms-EN.txt,请勿修改。
    . c( @  {% g* ?9 Q- Z) h, z
    . t0 |5 I& ~# H5 U9 S7 n
    1 h% r3 l' I+ b
    修改完了然后执行代码,你看到的图应该是这样的:
    ; L7 M: l$ u9 t9 G! c, W9 N* D  E3 M9 q6 {
    * `0 ]9 g: h% A1 Z" H
      P" S' l' A/ O3 N* A8 K. T& H
    $ g2 j  ~0 ]' A/ d6 p

    ( b9 h5 v, f* q+ R, S8 c$ r, Y这一过程的速度取决于你的电脑配置和词典的词头数,我跑这部AHD大概花了大半天的功夫。
      B2 @2 [3 R' v- B0 k) }3 J2 g6 W4 F! H2 K& c+ ?
    跑完之后的文件可能存在很多空行(不一定,看词典),这里附上一个去空行的脚本,使用方法:
    ; M2 |# U* t+ ~( A' p( V
    1 u& j+ I4 m  v
    1 l, \) T/ \0 c- O. e
    . z+ g5 _% S! p0 {3 v8 B8 g, n3 W2 I: H

    ( v: V0 m& N+ L: K& \4 Q- _' z9 X5 o! @+ S9 d0 |# j9 H+ O

    7 ?2 x5 ]' h  C- e执行完成后会在处理的文件目录下生成一个名字带_stripped的文件,这就是去除了空行的文件。
    ! q( L$ i! K  S: l  n$ h9 K! B1 t, f) v5 J/ y
    0 B" W5 Y# e8 k+ B; B

    0 @+ `( G4 p) U$ o7 r! M% l8 K
    & d8 q2 [5 U! d2 X9 E& y. o9 ~
    ( U* G& [% g, c这时候可以打开文件看一看,应该是满屏紧凑,没有空行,没有@LINK跳转的,就像这样:4 [& u  h$ H$ b; p4 [" \8 M$ f
    " I. `$ {, E- _' P( m

    : {' Q" ~/ K3 W% _6 z! g9 c
    : F; H7 M) n# ]( I: Z0 R# `
      b+ Z- j4 ]# _, w: N
    ; w$ Q! c% M' I到了这里,就可以开始正式进行第三步了。这里用到的是tab2opf.py这个工具,该工具基于py2,所以要用py2来执行。从书伴直接下载的tab2opf虽然没问题,但是根据我的经验,把253行的print df给注释掉,速度会提升许多,而且出错的机率也会减少。除此之外,由于词典的不规范及其他特殊原因,我们上述生成的xxx_stripped.txt难免会有几个或十几个错误行(MDX词典本身的问题),因此,最好加一个异常处理的块,遇到错误行直接提示一下就跳过,免得程序中止运行,你们可以参照下图修改,注意红色箭头的地方。
    & G3 D" L4 s1 [- C
    / L$ W. Q% N/ C" P$ a3 A" V! H8 U+ n5 j8 m, q

    3 C% \0 B; A  c* _* l
    4 c& T1 D" f) b6 h/ ~6 Y! R' j9 {0 Q5 s( J2 m
    然后执行命令:python2 tab2opf.py -utf xxx_stripped.txt6 U# D- _( D1 ]" x

    5 B  N+ T; {5 W- p8 d, C执行完毕后会生成一个opf文件和一堆html文件,如下图所示:
    ; w% C& z5 Y3 r" [$ B" H1 r% M2 G9 z! ]9 J5 {
    # a/ W8 @& t/ S1 K

    1 y- ^3 a6 B: M' n2 q) S( a0 |! z, v) l- K& x, d
    9 Z. Y) n. t8 l  F0 L$ P$ T- \
    在进行下一步之前,我们还得写好CSS,我的电脑配置不行,打开太大的HTML文件很卡很卡,因此我提取一些意项较多的词条来单独修改建议"go", "take", "in", "the"等,这里我提取“go”词条,复制"go"词条所在的一整块<idx:entry> </idx:entry>,然后加上头和尾(头尾可在任意一个html文件中复制即可),保存为html即可。如图所示:
    3 e7 t4 Q; {& e! e) ]
    3 O" g8 O: |6 {: C
    0 w( b1 E% B" k* }2 o1 e' b; d( y* T0 R
    2 T" |1 b3 t! q- e% @! p+ y- z

    " X6 l5 S# J6 F7 X% Z因为我们要测试css,所以再添加一个head标签并在其中用link标签引用一个css文件,然后就可以写css了。
    ) Q% s, [$ n# s* B7 }7 n* U# X% c9 \- s: }

    7 A0 H& h4 O5 Y# B4 c( D! k! r. C9 i# G- A8 [  _' W! L

    . h- G7 o3 |) \/ I8 l, o, q
    ( W2 G/ p0 I1 n6 ?MOBI的字典只能生成v7版本,该版本对CSS的支持极其有限,margin只支持left其他方向都不支持,即使是看起来有效的margin-left,也不过是在转化过程中替换为blockquote而已。所以只考虑粗体、斜体、下划线和颜色即可,当然不管这里用什么颜色,Kindle上都是浅灰色。) Z. o4 S/ u% l+ p

    / p1 t4 x, L+ V9 B这是我修改完毕后的效果。3 o8 c$ b! u1 k3 Y8 }% i1 Y- B
      D3 M( q: [8 l  {3 Z: E5 F; E. b$ N

    5 C3 Q/ I; d, O. g
    6 q# ?. j& j/ h4 m: i3 E
    ; ^( z9 v! E+ c/ p+ J
    2 ]. p6 t# X5 l2 |  K2 Tcss满意后,那就可以给所有的html文件批量添加link引用了,这里notepad++可以单独完成,就不写脚本了。方法如下:5 x5 |& D1 r: D7 m
    # E' e& ?/ u2 u" l' Q) K
    打开任意一个html,Ctrl + F,然后切换到文件查找选项卡,下面注意选择正则表达式,如图所示:
    7 S/ z1 v$ c. B  P+ Q$ H
    5 d+ f7 N9 i) R4 U% r; J) I0 ^6 ]8 W5 q6 J6 Z! x. u" ]

    $ p& N7 i+ L/ b8 d1 Z$ m7 w4 v
    7 y% d8 j/ S' l! B2 T3 v1 l+ J
    5 c  `; z4 l. X( b* G7 n4 q! s, w  F7 a9 q" }* Y* C7 n
    查找目标: (<html.*?>)9 B9 _( k) Y" N6 ^/ h  N
    2 y' l' n" V" m3 |) e
    替换为:\1<head><link rel="stylesheet" type="text/css" href="test.css" /></head>
    . i  ?& l' i4 F$ m" v+ ?4 v  {
    5 H3 x9 F1 U" v! @) e文件类型:*.html
    : }7 y& k$ X1 [, d
    0 f# m. M, E$ Q  I$ j; ^目录:即html文件所在的目录
    % Q: j6 T7 |. U0 q3 P; U4 G+ o/ f! n( _* c0 a
    8 i; E! D  h9 z0 z8 b& |7 B0 l
    1 H1 C* G( B1 Q3 r/ V7 y  ?9 P
    然后点击文件中替换即可,这样,所有HTML都添加了CSS引用了。
    2 E" G+ M1 |* Y0 H$ j( S' C
    5 ?* Q# m! {/ ?) R; {" S6 \现在到了另一个重要时刻了:为即将生成的Kindle词典添加变形词,原理就是检测forms-en.txt里面的单词然后提取出变形词添加进去,上面说过了,此处不再赘言。
    8 h: r2 A  Z6 P5 q( O" w7 V
    3 u+ v/ }* x% ?代码很长,不贴了。用法很简单:Add_Infl.py html文件所在的目录& L1 [* d9 }" B: p4 Y

    / }0 |+ M9 @* J5 a6 Q; o* ^. F* L* l6 R8 Z' L

    # G, N" `, c) t) z& R- v0 S0 E& `7 Q  D: K- ~# R+ |
    - D% D  u! v( B% r; F+ H% A1 {
    文件在此,解压后其他文件和文件夹勿动,以免程序不能正常运行。  W* _+ K2 c" K0 W$ h

    3 o$ H1 |' B4 u. Y. ]. h4 T5 j; [5 ^4 G: A  o# Z& U

    3 w  u8 p; c3 R然后会在目录下生成一个名为OK的新目录,新的HTML文件即在此。0 W& _/ z5 ~) u* r  O, k
    : a( S" G3 v& J$ v
    最后就是把之前的opf和css复制进去,然后用mobigen.exe生成即可,mobigen.exe -unicode xxxx.opf4 V! `8 |2 O  |+ }6 Q# \. H) A

    5 ?  c; C; L9 [  x如果你想修改生成后的词典名称,打开opf,修改这一行即可- u! ]4 P$ ?! ^) g. f9 A

    . c; ]! @& ]. i+ |7 D7 H" P- e" e5 ]- W9 |4 Z' l0 D8 f/ N

      j, ?( U4 \. T  c" K; h/ |
    " X7 |& k9 O# ^
    & l! Z# L  b1 P: R完。
    4 J7 n+ v- A  @/ ~7 ^9 M. N8 I( W% G4 G: K( c% I) \; k
    三、结束- J" ?+ u  _( t1 y8 j& ?* l% R
    ' ~: \8 o7 f5 l" D7 J/ T4 `/ U
    第一次写这种教程帖,步骤、截图等等都很繁琐,几次我都差点晕了。简单看了几遍,算不上流畅但也不至于晦涩。若诸位有什么问题或发现什么错误也可以在下面回复,希望能有更多优秀的Kindle词典出现。
    5 s8 Q! Z& ]/ D5 J; ~) B, q# |% ?' R! Q& O) ~2 M* ]% Q6 X% z
    另外:关于Kindle上的汉语词典,我发现kindle支持将繁体作为简体的变形词,意味着若处理得当,那就直接为简体词头添加繁体的变形就够了,不必再另添词条,词典体积将大大减少。各位有兴趣可以试试。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

    x

    评分

    10

    查看全部评分

    本帖被以下淘专辑推荐:

    该用户从未签到

    发表于 2019-9-30 11:03:05 | 显示全部楼层
    这种技术贴,要好好给楼主点赞
  • TA的每日心情
    奋斗
    2021-3-15 08:06
  • 签到天数: 585 天

    [LV.9]以坛为家II

    发表于 2019-9-30 11:09:32 | 显示全部楼层
    技术文章,不错。
  • TA的每日心情
    擦汗
    2024-2-8 08:54
  • 签到天数: 902 天

    [LV.10]以坛为家III

    发表于 2019-9-30 12:56:27 | 显示全部楼层
    给技术型楼主,点赞。
  • TA的每日心情
    开心
    2022-1-21 00:52
  • 签到天数: 699 天

    [LV.9]以坛为家II

    发表于 2019-9-30 13:16:44 | 显示全部楼层
    过程详细,及时总结惠己惠人
  • TA的每日心情
    开心
    2020-1-5 08:04
  • 签到天数: 50 天

    [LV.5]常住居民I

    发表于 2019-11-22 11:42:11 | 显示全部楼层
    这种技术贴,要好好给楼主点赞,惠人以漁!
  • TA的每日心情
    奋斗
    2023-4-1 06:34
  • 签到天数: 1049 天

    [LV.10]以坛为家III

    发表于 2020-3-10 18:28:21 | 显示全部楼层
    喜欢技术贴, 感谢楼主。
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2025-4-29 23:09 , Processed in 0.023531 second(s), 25 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表