掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 7024|回复: 8

[教程] 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 编辑
    " 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

    查看全部评分

    本帖被以下淘专辑推荐:

    该用户从未签到

    发表于 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的每日心情
    开心
    2026-5-27 19:42
  • 签到天数: 1051 天

    [LV.10]以坛为家III

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

    本版积分规则

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

    GMT+8, 2026-10-24 00:53 , Processed in 0.032123 second(s), 25 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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