掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 5292|回复: 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 m6 F% W, @% v; a4 Q) y3 J1 `  j3 s: v/ y- S/ T6 `" ^6 d$ n
    一、前言
    2 w. P: U2 ]' |" E9 D2 X1 L! F) L$ m. f+ u+ c0 Z0 q
    本篇文章的所有部分均来源于书伴的《如何把 MDX 格式词典转换成 Kindle 字典》 ,只是仅通过该教程的方法所转出来的词典基本没法用,原因是Kindle不支持@LINK跳转、不需要音频、以及需要添加Kindle支持的变形词搜索功能。经过几天的摸索,逐渐有了点头绪,并制作了AHD5th,试用两天后觉得尚可。便于昨天发布。帖子见此:[Kindle词典]美国传统词典American Heritage Dictionary 5th(精制版)
    5 ?% n+ D8 z2 d
    & H  c2 h; t- i& {9 b7 Z+ V3 _本文章展示如何通过Python来最大限度的优化以生成体验较好的Kindle MOBI词典,为各位提供一种思路,以期众人群策群力,制作出更多好用的Kindle词典。
    . A  h- g! f, O  M
    , M2 W5 w% `( |6 D: Z; u为了文章的连续性和完整性,对于完全相同的部分将全文引用这篇文章《如何把 MDX 格式词典转换成 Kindle 字典》 的内容。! o9 g- n! a+ b4 _# m
    ) V+ m/ Q; W  W! H6 D0 }

    1 A6 G0 z7 V/ W* y4 [: p$ z二、正文        " c# A( M9 i) }

    ' O5 x, W+ [4 i  |! K6 ?( J0 U% D9 g书伴的这篇教程共有四步,还用到了一些工具。工具请自行下载,因下面所用的代码是Python 3的,所以除了Python 2 ,Python 3 也需要安装。第一步和第二步是一样的,不赘言,仅截一张图于此。
    - c3 C8 F8 ^' d6 Y5 ~1 d2 T$ |9 d* |( e9 k2 F/ g
    ' a( H( ]6 B% M4 }: k/ W
    # Y) X; f  `7 {, b

    8 U" i: G* O- E9 a3 {5 I9 m
    1 ^' k/ b# k& r7 \工具准备好后,选择你想转制的MDX词典(本文只针对英文词典,即英英/英汉),下面以论坛里的American Heritage Dictionary 5th [IPA]为例。
    ; w) k/ R7 O  |/ z0 G' L+ h
    - a: D* V0 e- d5 R4 m/ D# |! g" [
    ' _% m* ]& X- I& i经过第一步和第二步的处理,我们会得到一个体积较大(视MDX而定)的TXT文件。其内容格式应该是这样的:- i" t+ n4 ]! b1 l

    ( h. S$ U6 m8 f6 ?! H! T" _) ?- p' K& o% |
    8 X% G! v7 w1 n. H0 [% l+ R

    ( w" S6 {% v2 V% F- ?; d, E: g5 Y4 }* }1 ]
    得到该TXT文件后,我们可以选择几行看一下或者搜索一下如".jpg", "<img", ".wav",="" ".mp3"之类的关键词,把图片和音频等等鸡肋全部删掉。同时,这类CSS引用也可以删掉,以减少文件体积,提高后续处理的速度。CSS引用可以在最后一步添加。比如随便看一下,扫一下就有这些:
    & s% i5 m* b# z( @, t& B* H3 q# A; [( h3 J) U( ^& d0 r- T( |

    : i9 P" L5 `7 R5 T3 v1 A" Z. ~' w. {7 z: k% n3 p& S$ R

    . j& s3 t0 k3 j' k5 H# V
    ( a! A' f0 x+ C! b0 B0 D4 ]我用的是Notepad++,以下是我用来替换的正则表达式:
    2 O- l9 }+ p$ `! T9 y1 [; }
    % Z- S+ Z9 \2 H* Q! w        图片:<img.*?>
    # l, {& [$ w+ H- \% W        9 j/ h; n( h4 \$ e( D
            音频:<a href="sound://.*?"></a>
    ; r" V+ f- K& X+ B3 h0 g( T0 T9 v+ K! f! @; Z3 [
            注释行:<!--.*?-->
    ) v3 g( X; ]& a0 y( h! L6 V+ {        
    1 p; Y5 ]# L# p* L! \可能还有一些冗余的标签,视词典而定,比如我这里就有<span> </span>,直接全词匹配删掉即可。
    9 {/ [7 Q, v! h4 q$ S
    $ Q- F, r) o+ t8 \& |9 n2 v我这里这样处理了一下之后,文件的体积直接下降了25%(约100MB --> 约75MB)。
    : C" S& T1 n3 m9 Z' N- ^
    / L1 ~" ?, S7 ?* i0 Y1 ^简单处理完之后,便是正式处理@LINK跳转了。TXT文件的格式只有这两种:单词 + Tab + 意项  或者 单词 + Tab + @@@LINK=另一个单词8 O& m1 {* D$ k7 i1 h

    7 J- S# ?! M- @8 T1 |这里我们主要要将跳转词后@@@LINK的跳转链接替换成目标词的意项,因为Kindle不支持@LINK跳转。为方便后续称呼的方便,我在此做个定义。以开头两个词条为例:+ g" X  p6 t8 S/ U
    . b4 F0 U, k( u# i8 f$ K
    4 h# N! p: I# b# ~9 ~
    9 S. d$ k6 ]" d! @

    1 T( J7 _& I& n9 x; t8 R- ?% ^! t1 m( G
    但是这里也要分情况,因为如果一股脑全部将@LINK跳转都替换为目标词意项的话,看起来简单。但实际上会导致文件的体积无比巨大,因为里面存在着大量的像这样的跳转:
    ! Y) L9 c0 L; k8 v* _
    3 C  L  s- y: i# P
    8 m6 p% W9 Z( R. e3 v( Q8 l: O/ \/ C7 X
    - N& L  }9 g! }' d! `4 J/ v5 {

    - G8 L/ |* ^; Z  S# ^0 X仅仅是advocate这样一个词,就有七个变形词,它们的目标词都是一样的,如果只是粗暴的替换,那么最后生成的词典肯定无比庞大,甚至如果你内存低点最后都不够用来生成词典。(猜想而已,我没这么干过,有兴趣有空闲的朋友可以试试)4 `/ H/ R0 U; K% i* ^* m
    4 U$ a- d, t. P3 {( @# h% m
    因为Kindle词典支持为某个单词添加不同的变形词,利用这一特点,我们可以在此处判断,如果跳转词是目标词的一个简单变形,那就跳过该词条。判断的依据来源于dsl2mobi这个工具里面附带的英语单词变形词列表。文件名称:forms-EN.txt,内容如下:
    0 `) `% a& p. f1 Z, E. k) W
    1 `( X! h" Z7 p, L4 w8 V! L
    0 g6 |5 j; ^! _& c7 m1 u' U
    ! B9 \, I$ T! _7 R          d7 q, ]3 _  n
      c; a6 V2 n3 F
    简单总结一下,做了个程序流程图:* o7 a( a0 d' d3 \4 p  k# Q5 {2 \

    0 M2 y, P: M4 r9 c
    7 F( r& u4 x8 P/ B0 T
    ( f4 P8 d  m& S: Z- \& x7 }" L- m: g
    3 t* w# V# }' I( U: B! m3 V$ ?; D  C0 A( C' a' q+ l
    这是代码,你需要修改第3、4、5行的文件路径和第50、51行endswith方法和replace方法中的值改为你操作的字典的实际值。详细的内容请看注释。3 I. L# Z/ k6 l. d

    ) }9 ~- L; e3 H4 X2 h( V4 G  O' {3 T- N6 M- x

    * N. `4 ~) l( v+ i- E! k
    * S$ C0 ^' |4 \1 R, N. \9 ~' C' I' R# x3 _/ ^1 v; D

    6 g  s& b( [- _+ z* T! {* z+ |% |# ~
    & t& P. M7 H* j3 J* i
    注意:Fix_Redirections.py有一个同级文件夹wordforms,文件夹内有forms-EN.txt,请勿修改。
    9 F  K9 n+ R4 L

    , o/ u5 s! ]3 t3 `8 Z0 \. r
    : ]; r: Q1 \" S$ H$ ^( e- u修改完了然后执行代码,你看到的图应该是这样的:
    ( N3 W( l0 [/ B. Y0 T1 X# q: k1 v* }
    + _. G: y6 }  y$ g9 d
    5 K7 A1 T* ^9 v8 Y% m4 T  ^
    * w, v! B3 l' Y% D$ j% [& o+ \& U

    % g) f" x2 A, v% }, b这一过程的速度取决于你的电脑配置和词典的词头数,我跑这部AHD大概花了大半天的功夫。2 p- M: d$ H. _: _/ l
    9 y$ Z5 j. M$ W$ T' i
    跑完之后的文件可能存在很多空行(不一定,看词典),这里附上一个去空行的脚本,使用方法:# y3 T. S5 v$ O1 u! l
    & e+ v1 T" r% Z3 d; }0 D

    ; u5 `7 q6 @! p( Y8 I6 P/ r0 `* @& g8 ^+ [# C$ v: m
    1 F' b; W6 `& N

    * _- c* d( V" D- g( a9 A  k6 f
    " j0 c4 Y" |8 i5 d6 p: I
    ( v7 @; y& l4 C9 P执行完成后会在处理的文件目录下生成一个名字带_stripped的文件,这就是去除了空行的文件。7 `" U" y' R: Z8 g" ?% z7 E
    ( J5 k8 Y0 [3 X# g0 ]

    $ \, `0 a; ~- ^: e
    9 I, i( b' p8 l9 F. n, J
    8 D' p+ x, H$ x2 J+ z& d4 d4 X) g6 D% S6 Y
    这时候可以打开文件看一看,应该是满屏紧凑,没有空行,没有@LINK跳转的,就像这样:
    ( q" T0 Z6 B4 e' j: D! ]$ A. G3 h" d+ P1 G5 ]* P# E
    ; B3 Y( w4 ?3 `1 C+ a( m- W3 s
    : }* b( G; F" R6 Z1 D3 I2 H

    : P- v- q  Y( A+ w5 f
    , V4 A4 m; ?, w! X+ ]6 U( s到了这里,就可以开始正式进行第三步了。这里用到的是tab2opf.py这个工具,该工具基于py2,所以要用py2来执行。从书伴直接下载的tab2opf虽然没问题,但是根据我的经验,把253行的print df给注释掉,速度会提升许多,而且出错的机率也会减少。除此之外,由于词典的不规范及其他特殊原因,我们上述生成的xxx_stripped.txt难免会有几个或十几个错误行(MDX词典本身的问题),因此,最好加一个异常处理的块,遇到错误行直接提示一下就跳过,免得程序中止运行,你们可以参照下图修改,注意红色箭头的地方。
    ; W* M1 W( V: ]: u. i: M8 [% n$ k, o' ?* m1 D
    8 ?6 ]6 p& Y# `2 i

    / j+ H% o6 W! F& V* ~1 @6 p8 ^' i7 K+ H% r6 X7 p  E. a2 Z0 l4 Z
    4 |, h4 J+ _( @& c; L2 R2 G( D
    然后执行命令:python2 tab2opf.py -utf xxx_stripped.txt8 U7 n; p# Y% x, c  g- S1 N

    3 s8 O) N* w' g2 h; e7 C% C; q执行完毕后会生成一个opf文件和一堆html文件,如下图所示:
    ( H$ _5 b3 N+ P
    # g% r" j: K6 a
    1 ~8 Q  _! C4 d: z6 U, D( Y* T) s7 a$ q& [, b( J

    1 K  ^% G3 Q7 l  U: A* C5 \4 a. ^! u1 }8 \( _9 s
    在进行下一步之前,我们还得写好CSS,我的电脑配置不行,打开太大的HTML文件很卡很卡,因此我提取一些意项较多的词条来单独修改建议"go", "take", "in", "the"等,这里我提取“go”词条,复制"go"词条所在的一整块<idx:entry> </idx:entry>,然后加上头和尾(头尾可在任意一个html文件中复制即可),保存为html即可。如图所示:" l/ J6 e6 s  W' [

    4 P4 A* o/ {- I2 l4 c' q7 @
    1 F  l4 |* G& U$ C. ^
    5 E& r$ q4 `* E% [! N& A# s1 c) [4 ~4 P6 S9 \! U. \
    / F: H0 J4 w# |* ?$ [
    因为我们要测试css,所以再添加一个head标签并在其中用link标签引用一个css文件,然后就可以写css了。4 p5 r$ ]" [3 W
    4 r& ~0 Z5 y) t3 S. w3 j7 N% b- V
    ) O1 }2 a3 R% d, P, ?

      `9 r! _- D% l3 Z8 G3 N7 p4 }0 C* Q, ]5 p( ^, o& |
    / k' P2 v. v. _3 h. I0 T9 V
    MOBI的字典只能生成v7版本,该版本对CSS的支持极其有限,margin只支持left其他方向都不支持,即使是看起来有效的margin-left,也不过是在转化过程中替换为blockquote而已。所以只考虑粗体、斜体、下划线和颜色即可,当然不管这里用什么颜色,Kindle上都是浅灰色。/ j; G( a- Y& Z- R% ?
    % J& d, C7 T" c* F
    这是我修改完毕后的效果。" n8 q2 D- g6 t/ G

      J5 S2 ?/ m- Y
    & k; o- o- e" H. Z1 h% F. g: {. b8 C2 b1 `

    - v" B& _6 G7 X
    9 w7 D3 U' c! Z6 ucss满意后,那就可以给所有的html文件批量添加link引用了,这里notepad++可以单独完成,就不写脚本了。方法如下:% U* r8 C3 n% S* Z0 u1 l
    + P: H2 }7 x3 q2 T/ F* P# o
    打开任意一个html,Ctrl + F,然后切换到文件查找选项卡,下面注意选择正则表达式,如图所示:
    4 M$ N( d/ J. u5 V% _
    5 Y* m8 i+ A' ^
    8 H9 H: _! p* Q8 t8 U* Z, P" i* [3 ]
    1 Y, r; ^5 v% R: M( Q5 m( u8 N- W$ y# x. R4 a

    ; Q3 z: H3 ~3 d* Y6 Y$ p0 o5 @) b) B: c% G, T1 S* f& z
    查找目标: (<html.*?>)
    0 a! m7 F0 x3 a( t6 D  L
    , O: U( S2 s, P0 ~% P  V! l3 ?  a+ d替换为:\1<head><link rel="stylesheet" type="text/css" href="test.css" /></head>
    + _8 t% k4 \: S! q
    ; |3 Y1 I& M' x0 L  ~文件类型:*.html$ k- t8 u% K4 R/ c  ^& |
    / V! |4 Z8 ]4 N* a
    目录:即html文件所在的目录
    , |5 ~; P& B5 ?8 l- C% Z( Q9 p" o
    5 O/ \0 f' d. n* q) r$ ~0 Q# g

    3 @1 g) l' ^3 r然后点击文件中替换即可,这样,所有HTML都添加了CSS引用了。+ c6 Z* U2 ^3 F
    4 O/ u7 r, c) m" }$ y
    现在到了另一个重要时刻了:为即将生成的Kindle词典添加变形词,原理就是检测forms-en.txt里面的单词然后提取出变形词添加进去,上面说过了,此处不再赘言。
    ( m* p' L0 }" g) P. u6 \2 P1 N; X. W6 m0 b; M
    代码很长,不贴了。用法很简单:Add_Infl.py html文件所在的目录, C* p1 w6 I* g% p. O  n: q! ~

    % t9 B" d$ W  N* h
    6 G& u: D# K. O' b. r  V3 |* R9 o( a; o6 f

    - e. |$ U% r7 B7 M
    " X- Q' l! F. k& }: G" V文件在此,解压后其他文件和文件夹勿动,以免程序不能正常运行。* `2 W; W! M8 I$ ?+ {

    0 i4 T. h$ l+ X7 m5 C8 }2 N5 k) ?7 J/ t8 B' X

    6 w6 q' \% [7 ^7 s, W3 l5 d然后会在目录下生成一个名为OK的新目录,新的HTML文件即在此。. ]  C4 `1 f( p9 H6 ~! X, c9 V  G4 T
    ! u/ ], t, o1 M  [/ F- S
    最后就是把之前的opf和css复制进去,然后用mobigen.exe生成即可,mobigen.exe -unicode xxxx.opf% ^) u% |: X" q( k

      F* a& L: ~! j. V如果你想修改生成后的词典名称,打开opf,修改这一行即可
    : j  @5 C5 n4 h/ H. B- {) p" r3 e# N. ?5 d( A6 {3 A
    0 T2 Q7 C& k' W! p) b

    0 S; i2 H4 ?1 u% D
    8 }' p$ T0 S6 j) J, g% W/ Z
    ) {; z( R5 C. G- c完。- \& H2 r: m5 d$ i3 I
    . I$ ]+ `# R3 l5 v7 M, S; H8 [9 L
    三、结束! A6 ?% D: m0 H5 H2 V

    8 N- V( D( X; I& ^! O+ v) s0 r第一次写这种教程帖,步骤、截图等等都很繁琐,几次我都差点晕了。简单看了几遍,算不上流畅但也不至于晦涩。若诸位有什么问题或发现什么错误也可以在下面回复,希望能有更多优秀的Kindle词典出现。
    / M$ R  v9 j2 M
    7 k, L) O5 ?" c2 n" L* A另外:关于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 18:00 , Processed in 0.024510 second(s), 25 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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