掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 3925|回复: 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 编辑 3 t- P; M+ i( \

    2 G: P* k5 |# Q9 J" N一、前言
    + w1 u) N; ], @: f7 i4 v5 x
    ) b5 A  j( f* z: J+ D6 U. s6 U1 J本篇文章的所有部分均来源于书伴的《如何把 MDX 格式词典转换成 Kindle 字典》 ,只是仅通过该教程的方法所转出来的词典基本没法用,原因是Kindle不支持@LINK跳转、不需要音频、以及需要添加Kindle支持的变形词搜索功能。经过几天的摸索,逐渐有了点头绪,并制作了AHD5th,试用两天后觉得尚可。便于昨天发布。帖子见此:[Kindle词典]美国传统词典American Heritage Dictionary 5th(精制版)7 }+ J. x  V" U& i8 {( J( x* a* O

    ) \2 \, l/ U$ W7 m2 H0 F5 E本文章展示如何通过Python来最大限度的优化以生成体验较好的Kindle MOBI词典,为各位提供一种思路,以期众人群策群力,制作出更多好用的Kindle词典。' S, e4 G- }. M1 _
    . j" s5 E- ]. o9 U6 F( ^, K
    为了文章的连续性和完整性,对于完全相同的部分将全文引用这篇文章《如何把 MDX 格式词典转换成 Kindle 字典》 的内容。
    8 H8 ]; N! D+ X9 o3 Y1 D' P; z7 T: O
    4 @5 r" S* y6 ]& @' c& d( s# M7 H2 |; s! K: {
    二、正文        
    4 `3 T# A, k) c* }2 u% e$ ^6 b8 x2 R; U( B3 A
    书伴的这篇教程共有四步,还用到了一些工具。工具请自行下载,因下面所用的代码是Python 3的,所以除了Python 2 ,Python 3 也需要安装。第一步和第二步是一样的,不赘言,仅截一张图于此。# I5 s( h% m& H  X. v. {3 d

    8 u' a( l, k0 K
    : F& g: j9 `7 f  M% _( q; l
    ; f' |" T0 w: x5 @: ^# p  N
    9 {$ M. q4 `7 T+ L# c, c3 g6 i( ?+ H. Z( Z0 S4 z+ d  d
    工具准备好后,选择你想转制的MDX词典(本文只针对英文词典,即英英/英汉),下面以论坛里的American Heritage Dictionary 5th [IPA]为例。& O9 s( P1 f) p+ L8 h" k
    / ~4 v9 ^5 \# W9 W1 c& q0 O
    % g& N+ B3 \1 I
    经过第一步和第二步的处理,我们会得到一个体积较大(视MDX而定)的TXT文件。其内容格式应该是这样的:
    8 T1 B8 _9 e: P, p5 v9 a! Y6 z( k6 H% ~$ c! c' E" m  p
    * }: Q3 k( I! E7 A+ w; |- L

    ; i. N% N) z2 C, S1 A
    1 i2 d4 G' M1 M' b: o
    ! W6 L5 o" y* S, ]% b/ Y得到该TXT文件后,我们可以选择几行看一下或者搜索一下如".jpg", "<img", ".wav",="" ".mp3"之类的关键词,把图片和音频等等鸡肋全部删掉。同时,这类CSS引用也可以删掉,以减少文件体积,提高后续处理的速度。CSS引用可以在最后一步添加。比如随便看一下,扫一下就有这些:& w7 Q$ s* ]- Y) a7 C

    - p- X/ r' V) Z- o5 A9 b; B& i  d, i
    # ^+ g4 d1 T* K  T/ N2 p- i

    " \; L: D: }8 V2 O" z0 K- m  j* D( s- y5 @
    我用的是Notepad++,以下是我用来替换的正则表达式:! E+ I2 t( g5 _" E  c8 Q- t# s- ^
      M. n1 w1 p1 d$ A% {
            图片:<img.*?>3 \$ Q& b- o) `: G
            ) R+ @$ v9 p& d' j; p0 n
            音频:<a href="sound://.*?"></a>
    & I8 ~, K4 O: X2 V, ?( P$ z7 `: H. ~
    & v2 |: x' K7 q' B/ O$ [2 c        注释行:<!--.*?-->9 T# w1 ^: I+ X' Q$ h! Y- _6 |2 K% c- g
            " O3 V6 B$ k- ?6 d/ U, s5 u: I
    可能还有一些冗余的标签,视词典而定,比如我这里就有<span> </span>,直接全词匹配删掉即可。
    3 p" \1 z6 O$ }0 {5 d0 k+ l: k- H
    3 O. X  @/ u) [1 A3 B0 Q# k/ {我这里这样处理了一下之后,文件的体积直接下降了25%(约100MB --> 约75MB)。- r4 x5 S8 \: V! K: I: E) G, n4 [

    2 l  B( p0 u- n& T. ~简单处理完之后,便是正式处理@LINK跳转了。TXT文件的格式只有这两种:单词 + Tab + 意项  或者 单词 + Tab + @@@LINK=另一个单词
    ' l, a- J. D2 f: E* \
      @! f) O9 l- F, r这里我们主要要将跳转词后@@@LINK的跳转链接替换成目标词的意项,因为Kindle不支持@LINK跳转。为方便后续称呼的方便,我在此做个定义。以开头两个词条为例:
    6 f; D$ s. v: x( C: |4 q2 Q3 |  A5 D

    & J/ H1 j- Y) u
    3 }' A/ c* M/ j1 Q2 m% f. G9 N$ w/ Y$ i+ q( ~& X% J# F0 X, |& h
    ; m! N, k. b6 w. Y. n4 i% l' z
    但是这里也要分情况,因为如果一股脑全部将@LINK跳转都替换为目标词意项的话,看起来简单。但实际上会导致文件的体积无比巨大,因为里面存在着大量的像这样的跳转:
    $ v) ]: _) S$ J% m" J. T( D, A" ]1 ~

    4 D; O  I1 X3 I" u& r. a9 a) I  e% J
    ) `* c5 |. [' q! R) r
    7 U" r& N6 @- E# E: a: j; C, n8 i
    仅仅是advocate这样一个词,就有七个变形词,它们的目标词都是一样的,如果只是粗暴的替换,那么最后生成的词典肯定无比庞大,甚至如果你内存低点最后都不够用来生成词典。(猜想而已,我没这么干过,有兴趣有空闲的朋友可以试试)4 R) U1 S8 l: s* ~: ~' U

    4 K7 G' o. a! B$ O因为Kindle词典支持为某个单词添加不同的变形词,利用这一特点,我们可以在此处判断,如果跳转词是目标词的一个简单变形,那就跳过该词条。判断的依据来源于dsl2mobi这个工具里面附带的英语单词变形词列表。文件名称:forms-EN.txt,内容如下:% D: P) |! U4 s& Q

    / c9 v5 N1 g! i) X7 z, O9 B- \4 @6 k  w- E/ s8 H

    0 b3 K( G- {8 }+ v        7 B6 j, n' |/ ^/ E

    3 m8 O/ M9 z9 \" s2 M5 D/ S4 N$ y简单总结一下,做了个程序流程图:
    , `% J" {: r* X9 j+ B$ _5 X- \: @
    * V6 y1 k2 \" i& `7 Y6 N" X* [9 K
    + _& V3 b. [% ~+ s" d! t# W8 D- E- S
    ) S. r: r# ^: q/ B8 ~1 k
    ) f7 [, Z7 @0 h% M# q
    这是代码,你需要修改第3、4、5行的文件路径和第50、51行endswith方法和replace方法中的值改为你操作的字典的实际值。详细的内容请看注释。
    ( m( f2 c# H, C4 p: r* @3 h+ I$ q% s: x% w6 Y/ |
    % t' c& K: |+ E' i8 V9 x/ _

    . U* e) x1 r: {/ i+ N' p% ]( X1 K' Y* R0 X

    ! w; h7 S7 L( Z0 i
    $ ?, j, `% O) @% K0 B! y( \+ L5 C7 |- }
    ! r  m* p' K8 ?. R7 |  X/ u" U" F9 D5 `8 K! W, R, W& v& F
    注意:Fix_Redirections.py有一个同级文件夹wordforms,文件夹内有forms-EN.txt,请勿修改。$ ]4 O' P+ ]4 s9 W

    # l( p  ^, [3 h, c$ d) v! K9 N3 p3 _9 k+ y
    修改完了然后执行代码,你看到的图应该是这样的:
    0 b9 Y* j, c4 y4 e, V
    + E3 q, r0 t$ ?" |2 K/ T- o) |2 Z; K/ y8 G4 e" l& U1 Y

    # A) a( w1 N" @/ G' E- h! k
    : q9 A, [0 N  Z; s. n
    5 T: h8 R4 C. Z" A, M' X6 C这一过程的速度取决于你的电脑配置和词典的词头数,我跑这部AHD大概花了大半天的功夫。+ ^. t0 O3 x. p5 a1 p0 s. K
    2 N1 d$ r* g1 k5 T, {/ y' E. A; a
    跑完之后的文件可能存在很多空行(不一定,看词典),这里附上一个去空行的脚本,使用方法:$ [- G. H5 y$ t
    3 I4 |. l. t+ e- T
    1 M1 b3 J6 m) _' }0 g3 H
    3 y8 Z1 i9 \$ O7 v8 {
    5 b/ U; E  ~6 h2 T' x( I

    1 \; L! O- d% i8 o  R
    9 f2 ]$ Q8 L+ s! ~  r; h7 D9 a/ U! G% u% f. G
    执行完成后会在处理的文件目录下生成一个名字带_stripped的文件,这就是去除了空行的文件。1 t  H5 ~! K$ V+ q% s8 ]& L3 r

    ( s  j% R6 }& ^; \+ T# U
    * X/ I5 {) x# |. v# W5 l; x0 q" N" ~" J1 g0 K& |5 e4 M; q4 W
    - J  t9 |( O9 c0 O: x3 X5 N

    # J, V1 M( k/ ?5 o/ B) |% t1 o! [) x; X这时候可以打开文件看一看,应该是满屏紧凑,没有空行,没有@LINK跳转的,就像这样:5 V+ y! Y; Z( \

    5 z  B0 E, I( M3 D# N5 Y
    - R3 P- r% P/ Y. p% b. E  p0 r( v4 _9 i, c1 t

    ( ^7 Z* ]8 k' z/ y; b% e
    - S- X/ S. }* ~" b; c6 j到了这里,就可以开始正式进行第三步了。这里用到的是tab2opf.py这个工具,该工具基于py2,所以要用py2来执行。从书伴直接下载的tab2opf虽然没问题,但是根据我的经验,把253行的print df给注释掉,速度会提升许多,而且出错的机率也会减少。除此之外,由于词典的不规范及其他特殊原因,我们上述生成的xxx_stripped.txt难免会有几个或十几个错误行(MDX词典本身的问题),因此,最好加一个异常处理的块,遇到错误行直接提示一下就跳过,免得程序中止运行,你们可以参照下图修改,注意红色箭头的地方。
    $ r& i- G! T2 _& n0 F
    6 C  a+ g9 K/ A3 j: W1 _- d1 l' x
    % p% C5 r+ {. n, W1 U# O0 @7 W% i5 l5 Y+ T( L8 m
      C+ e# p7 P( ~0 {

    # k# x. A9 y( Y* _% ^& r! {' i然后执行命令:python2 tab2opf.py -utf xxx_stripped.txt
    6 ^& }3 f4 V6 u7 t; L) {5 O0 [7 v) l) D" G# N, C+ l4 t
    执行完毕后会生成一个opf文件和一堆html文件,如下图所示:
    ) Q: _8 t. U0 m$ ?: G0 H- y) I! |7 T7 I7 E5 \% j6 A8 a

    & F# l% x) Z1 f+ K* X1 c- |
    & e  D3 F1 C' }2 I
    , w7 K2 K) ?& F+ F7 ^
    # I; F& z4 F/ K+ t1 Y- ?在进行下一步之前,我们还得写好CSS,我的电脑配置不行,打开太大的HTML文件很卡很卡,因此我提取一些意项较多的词条来单独修改建议"go", "take", "in", "the"等,这里我提取“go”词条,复制"go"词条所在的一整块<idx:entry> </idx:entry>,然后加上头和尾(头尾可在任意一个html文件中复制即可),保存为html即可。如图所示:
    # H0 B+ E" R& m& K
    : Z* m1 `7 T& f" N" O7 S; X
    ( ^& X% \, h1 q
    9 o  h& k( i( _- H
    9 a! @3 L3 ^: O3 P2 G7 H" a0 ]7 X
    8 K7 M( V3 V* |3 e. m因为我们要测试css,所以再添加一个head标签并在其中用link标签引用一个css文件,然后就可以写css了。
    ! z, e; x6 f, u& x: l$ J$ d$ N- S4 i! M. v  C1 {
    9 M: i5 j/ _7 n+ W8 J+ p
    9 ^* t7 Z' I* P
    % v) I9 ?! ?2 k, b
    , l5 O& j- Y. R7 B$ l
    MOBI的字典只能生成v7版本,该版本对CSS的支持极其有限,margin只支持left其他方向都不支持,即使是看起来有效的margin-left,也不过是在转化过程中替换为blockquote而已。所以只考虑粗体、斜体、下划线和颜色即可,当然不管这里用什么颜色,Kindle上都是浅灰色。- p( [+ X% E3 `  ~$ K
    $ B0 O9 U" I  Z$ Y. B1 V( ^% q3 k7 l
    这是我修改完毕后的效果。0 m' T' L4 v, f% g
    ' Q) j$ f6 _2 U  T* Q/ e7 [

    6 l0 K& \% `1 v0 k; P0 v
    $ J2 `+ r" R3 x9 N
    5 S4 q2 L8 @8 \+ |
    . R0 c7 E, v. V5 g& Z3 ]! H; g7 xcss满意后,那就可以给所有的html文件批量添加link引用了,这里notepad++可以单独完成,就不写脚本了。方法如下:- x1 [2 ~$ T/ l

    9 C; @7 G) o0 r1 |* [- R9 g8 e5 h打开任意一个html,Ctrl + F,然后切换到文件查找选项卡,下面注意选择正则表达式,如图所示:
    1 f1 f5 p+ z# _4 E2 X( i: U6 K. S, l2 t

    / ~2 o4 O  B+ ]! N+ Z, T3 Z' c+ `7 e' j
    " F/ v5 t6 j5 q* x* I7 `" w8 F8 z
    0 h- Q8 Z" a* @, S7 @+ v/ V6 a" _7 ]" W9 H5 a, k
    * s- V0 \3 W: q7 _9 i
    查找目标: (<html.*?>)
    8 c/ C' X4 b. G; O7 _+ k
    ) f5 c/ X7 Q% Z替换为:\1<head><link rel="stylesheet" type="text/css" href="test.css" /></head>+ V/ c3 s" q# l+ _' c6 G4 e4 T) s% }
    " f0 \4 n. F  s
    文件类型:*.html
    6 {8 E# y3 l' [9 {0 D/ P8 b- \% X5 ^
    目录:即html文件所在的目录
    : j6 @" H# N( f) P  y6 Q
    ; a& N9 l6 o0 U- Y6 y9 r

    3 j( ?" R2 A) j5 K4 G( r( z- z! t' r! K; n6 H2 o
    然后点击文件中替换即可,这样,所有HTML都添加了CSS引用了。
    3 B* Z, L: z! o4 G
    - g  _/ Y5 l+ m* Y, d现在到了另一个重要时刻了:为即将生成的Kindle词典添加变形词,原理就是检测forms-en.txt里面的单词然后提取出变形词添加进去,上面说过了,此处不再赘言。5 N# _5 S8 |* t' g2 m

    9 z8 P! c& t/ {4 t/ Z代码很长,不贴了。用法很简单:Add_Infl.py html文件所在的目录
    ! P0 P. g; a# j" D& k( g( U  p# l( a0 `$ t1 s

    7 t% F8 Q7 ^9 U' |4 g' d8 B) e! W5 i5 g$ z) Q
    2 {- V& v$ C7 ?& Q( F% w7 }) l( T

    8 a  E  W* p  ~" I8 P: i! u5 n文件在此,解压后其他文件和文件夹勿动,以免程序不能正常运行。! a. _' N6 o4 R, }+ q# n* p+ E
    % R2 o% D8 r; j' _, y' ?. D

    % ?" z5 ^% c% B2 b! B& g$ @; \& b- a* i
    然后会在目录下生成一个名为OK的新目录,新的HTML文件即在此。* T' a4 B% x2 K

    . {' w0 J4 t* G! s+ K4 h. O最后就是把之前的opf和css复制进去,然后用mobigen.exe生成即可,mobigen.exe -unicode xxxx.opf
    . y# j& |! x. t
    + E6 |5 Z0 x% H如果你想修改生成后的词典名称,打开opf,修改这一行即可
    2 f; y2 x& x, j$ ]  r+ j) g1 A( l5 G! N1 s% ~2 u) A

    - }9 y9 c, c9 r1 T1 P3 B9 Z: l' x* e% I8 J$ S, x* D& k- {

    , P: ^3 Q/ Y/ U! C  j8 b9 u. M# v* [  `* s9 w: @6 e: b
    完。
    3 n. R# o3 |; }9 _* N+ c& Y8 \1 U7 h1 d4 I
    三、结束0 Z$ J. h1 o2 X  G' m
    / d0 {) F& e# M/ ?  {& ]
    第一次写这种教程帖,步骤、截图等等都很繁琐,几次我都差点晕了。简单看了几遍,算不上流畅但也不至于晦涩。若诸位有什么问题或发现什么错误也可以在下面回复,希望能有更多优秀的Kindle词典出现。
    ! Y1 Y: _' F4 E) ^! ?; Y3 G* m, n% w- o; n) _6 p4 S( _
    另外:关于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, 2024-4-26 20:16 , Processed in 0.045820 second(s), 10 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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