掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 6500|回复: 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 编辑 - W  B( B3 p( \1 [3 J  |! G8 f* A

    + a+ |) e" x) q% V; Z% }- ^一、前言
    , F& o0 r) X3 u. o% }; n
    ( |7 c2 u1 h6 Y本篇文章的所有部分均来源于书伴的《如何把 MDX 格式词典转换成 Kindle 字典》 ,只是仅通过该教程的方法所转出来的词典基本没法用,原因是Kindle不支持@LINK跳转、不需要音频、以及需要添加Kindle支持的变形词搜索功能。经过几天的摸索,逐渐有了点头绪,并制作了AHD5th,试用两天后觉得尚可。便于昨天发布。帖子见此:[Kindle词典]美国传统词典American Heritage Dictionary 5th(精制版)
    2 q$ V. P" c8 p7 W4 J
      q) S+ T# d( i1 k' C. d9 D4 Z. O1 U' X本文章展示如何通过Python来最大限度的优化以生成体验较好的Kindle MOBI词典,为各位提供一种思路,以期众人群策群力,制作出更多好用的Kindle词典。' Y* D% b+ x( I

    5 y7 u' Z8 ]; O" M/ z4 M- U: I7 S为了文章的连续性和完整性,对于完全相同的部分将全文引用这篇文章《如何把 MDX 格式词典转换成 Kindle 字典》 的内容。8 v0 L; M8 z& O$ a+ V" {( D

    ) H) Q7 z/ f. h8 W, ^7 e: Q3 D& `) i# z8 |% m' n( d  |5 z
    二、正文        
    & G' \  ^2 J* E1 T, X4 n
    4 F. [/ S  _4 t3 m) P书伴的这篇教程共有四步,还用到了一些工具。工具请自行下载,因下面所用的代码是Python 3的,所以除了Python 2 ,Python 3 也需要安装。第一步和第二步是一样的,不赘言,仅截一张图于此。& P3 Y& c2 l) x: y. G! i

    / r4 W" [5 d. x& n4 M% ]$ L1 Q. [- e! z7 v# J2 g) |- r/ w
    * i$ O3 _* d/ P) @2 H

    8 V8 N5 f: Z2 s# g7 V+ K7 @) `# G  k+ a$ S
    工具准备好后,选择你想转制的MDX词典(本文只针对英文词典,即英英/英汉),下面以论坛里的American Heritage Dictionary 5th [IPA]为例。! Y% M- |3 f' w+ \

    - `: q  D3 E! u! G% W4 @) l2 _
    7 r2 L+ L: S; C0 M: p+ Y/ Z经过第一步和第二步的处理,我们会得到一个体积较大(视MDX而定)的TXT文件。其内容格式应该是这样的:
    ( c5 l* k# K( B- g" I+ G& V! ]: F' T
    2 l$ |- Y0 X. E; ]0 Q) f

    ) z! H- K. P3 F; o& b# A3 A7 d) T$ u. K; u: N
    1 S/ w; f  m2 p0 w6 y# |+ ?
    得到该TXT文件后,我们可以选择几行看一下或者搜索一下如".jpg", "<img", ".wav",="" ".mp3"之类的关键词,把图片和音频等等鸡肋全部删掉。同时,这类CSS引用也可以删掉,以减少文件体积,提高后续处理的速度。CSS引用可以在最后一步添加。比如随便看一下,扫一下就有这些:
    2 e: G% r! i) f/ ]# ?6 ]' f) y7 _9 E# {

    % K9 x& R2 q6 B* m
    . g! ^4 r7 k5 f/ Y! A7 P) }; S2 T6 Q- f

    ( f/ q% R  {# f0 U' D2 I我用的是Notepad++,以下是我用来替换的正则表达式:
    . P# \, w% u+ ^( m  m+ T, V( o4 q# A
            图片:<img.*?>
    5 a, ~$ K* h1 ]. o; ~( I        $ p5 s3 u. s$ [; [* p
            音频:<a href="sound://.*?"></a>
    % I$ M& y& l: e9 K2 c, Q4 r- g
    ( @6 |; a$ {* s        注释行:<!--.*?-->) J0 r) ?2 p$ W; ~
            1 j  d7 i6 S" U) }& B. a- y2 Q& W
    可能还有一些冗余的标签,视词典而定,比如我这里就有<span> </span>,直接全词匹配删掉即可。
    / U$ S# b8 w0 E' w1 D. V" @! q  X+ C* T& w' E7 z. |+ i
    我这里这样处理了一下之后,文件的体积直接下降了25%(约100MB --> 约75MB)。1 g8 c  B) [* d: b3 V' B9 o
    ' h  z$ ]  h5 s3 z7 ~, w/ m1 B
    简单处理完之后,便是正式处理@LINK跳转了。TXT文件的格式只有这两种:单词 + Tab + 意项  或者 单词 + Tab + @@@LINK=另一个单词. s& Y4 [/ q: v/ p

    - ~- O5 c- V9 w1 r这里我们主要要将跳转词后@@@LINK的跳转链接替换成目标词的意项,因为Kindle不支持@LINK跳转。为方便后续称呼的方便,我在此做个定义。以开头两个词条为例:
    ( v. D  K" {* E; }) x0 k/ D, Q  K: T
    0 S% c# [4 a9 g; _4 n; i$ T7 z: i
    5 h4 H9 m* G+ m: v4 t8 `

    0 z4 @; S& C; g4 [- k  l6 F+ m) r1 y2 G0 q  f  i+ I
    但是这里也要分情况,因为如果一股脑全部将@LINK跳转都替换为目标词意项的话,看起来简单。但实际上会导致文件的体积无比巨大,因为里面存在着大量的像这样的跳转:. n8 z7 \: \$ P0 h8 m+ r8 G% L

    6 ~( p8 R- T( Z1 R2 I& r- J( V" U# R# K3 ^

    5 O7 g' w- |" c9 e( V8 h
    0 p( p) z+ F2 m- V, y  d; S
    0 r6 c9 n* j5 E2 P; V  d仅仅是advocate这样一个词,就有七个变形词,它们的目标词都是一样的,如果只是粗暴的替换,那么最后生成的词典肯定无比庞大,甚至如果你内存低点最后都不够用来生成词典。(猜想而已,我没这么干过,有兴趣有空闲的朋友可以试试)* L% _1 B6 g! |" K3 C1 A
    - V" m! x3 e& X! U' b
    因为Kindle词典支持为某个单词添加不同的变形词,利用这一特点,我们可以在此处判断,如果跳转词是目标词的一个简单变形,那就跳过该词条。判断的依据来源于dsl2mobi这个工具里面附带的英语单词变形词列表。文件名称:forms-EN.txt,内容如下:
    6 [: L0 l! b5 K
    6 e; u! s+ J3 m7 A/ S- K1 U
    + `, e/ ~9 k$ X. k( n' g
    ( v: F: t* s" Z! W2 J        
    $ g$ D2 u# V: l3 }8 C
    8 f4 ~9 K0 v( h7 Y简单总结一下,做了个程序流程图:
    ) R/ M( Y7 g+ b. a
    + c) f) f& g) l! w8 {( }
    7 R; S. O. V- R( [& g( Y1 s# W; \; t4 ?5 O: X

    2 Z5 |( o4 R$ l' W  I  F
    + H  D8 I( A* O+ t( A3 y这是代码,你需要修改第3、4、5行的文件路径和第50、51行endswith方法和replace方法中的值改为你操作的字典的实际值。详细的内容请看注释。7 O* a1 V* _# c% [- W5 N
    1 a6 Y/ b+ d! n# m

    * [* a( ~; m9 D4 n
    ( Q1 Z) U+ M5 s, J6 K
    , `& P! d( N1 R" C: W  o) t7 l" d. f; I1 Y2 d' n! X
    4 |! f1 A0 Z& R% T) k; }$ A& ~

    : z3 \& o6 |; f/ {& V
    ) I7 A: F/ Q* I: x! L9 g注意:Fix_Redirections.py有一个同级文件夹wordforms,文件夹内有forms-EN.txt,请勿修改。
    ' g9 m; X2 t! G' r$ c& ]9 X

    * n4 y/ |  T4 i/ Z" j  T' I! l% @* g8 u1 c$ Y
    修改完了然后执行代码,你看到的图应该是这样的:# p4 X3 Z9 @! b# O" f

    : C+ x( s  c: {& X# N; {* \! K7 I, @, G4 ]

    6 c1 z4 @& C; k  W  Y" s( g. l7 R& h5 q8 n$ i

    7 c  z! D/ C" M: |这一过程的速度取决于你的电脑配置和词典的词头数,我跑这部AHD大概花了大半天的功夫。
    6 G. i2 m4 t3 C- T% R  _4 c  a7 j) N
    6 e% `, r' V' u- F7 Z# j: _( H6 f跑完之后的文件可能存在很多空行(不一定,看词典),这里附上一个去空行的脚本,使用方法:
    + G* z0 Q# o3 v8 U0 R4 U( y" g, S
    0 Z) V- s( a: M0 H% v
    ( F  }8 a9 s$ B8 I% U3 o+ s, W. K- j/ I- a2 W
    ) M: M6 i2 m6 k9 O

    ! I) J1 Y' s2 M6 u6 @8 \$ N3 \. z
    & l; q, m5 _' D3 l) Y1 x/ b& R8 r
    ; H" I1 p5 p3 J+ `执行完成后会在处理的文件目录下生成一个名字带_stripped的文件,这就是去除了空行的文件。
    " o2 a* B# y6 ~' ?: q1 b  Y( y# M

    ( n! K8 U4 s: a5 x! p
    9 U# v0 S% {  i9 ?8 d3 j6 V5 d
    2 ]- P6 C, v9 O. u" x3 ?* K& I# @
    3 R1 Z) D$ W7 b4 \! |( T3 B9 a这时候可以打开文件看一看,应该是满屏紧凑,没有空行,没有@LINK跳转的,就像这样:
    5 [! n$ ]$ ?6 g3 C. P) k9 ]% `" A; J. X/ A# i3 h4 `" @+ R/ U7 U

    $ `% r* |" z8 ~& J. `8 [( C% i6 R4 I$ m

    " f" e/ U# o% a$ d3 h2 u
    # y) a  h/ c* k& `& j: U到了这里,就可以开始正式进行第三步了。这里用到的是tab2opf.py这个工具,该工具基于py2,所以要用py2来执行。从书伴直接下载的tab2opf虽然没问题,但是根据我的经验,把253行的print df给注释掉,速度会提升许多,而且出错的机率也会减少。除此之外,由于词典的不规范及其他特殊原因,我们上述生成的xxx_stripped.txt难免会有几个或十几个错误行(MDX词典本身的问题),因此,最好加一个异常处理的块,遇到错误行直接提示一下就跳过,免得程序中止运行,你们可以参照下图修改,注意红色箭头的地方。
    4 {4 s4 O2 n6 L. S
    2 Z( @: t6 Z" z" p; B( N- F& h2 t9 W; w% N9 i: G

    $ t3 ^$ x9 b9 R/ I7 l: B  Y
    " A8 ~$ i: W9 @5 f' O8 H4 E
    . F& B; z5 }9 k' Y: F然后执行命令:python2 tab2opf.py -utf xxx_stripped.txt
    8 f8 B1 e4 [+ P0 S' w
    8 p/ [) q! n# ?' |+ ^" P执行完毕后会生成一个opf文件和一堆html文件,如下图所示:
    2 B5 G& J9 ?: Q9 f0 z& J3 y9 o
    ( `" o) a/ L  P' g; H" I1 r3 s1 x/ e
      B3 y5 R! @; K1 b2 `
    1 m9 i2 m4 i" z/ ^5 m3 v( P
      i% `  H' H$ C+ l0 N
    在进行下一步之前,我们还得写好CSS,我的电脑配置不行,打开太大的HTML文件很卡很卡,因此我提取一些意项较多的词条来单独修改建议"go", "take", "in", "the"等,这里我提取“go”词条,复制"go"词条所在的一整块<idx:entry> </idx:entry>,然后加上头和尾(头尾可在任意一个html文件中复制即可),保存为html即可。如图所示:
    : o( X; ~0 t" D! h2 X1 R. ^6 d: Y* a* C. Y

      M0 S7 G, b1 q
    7 U7 I0 f4 C9 I
    ) y- U  G" |( s: K4 m/ U' B$ \
    因为我们要测试css,所以再添加一个head标签并在其中用link标签引用一个css文件,然后就可以写css了。/ J9 F0 C2 A% N/ ^8 g

    ) E0 O  S! T3 w
    3 }. v0 T5 N# G) t7 ]! F
    ; T- W$ ~4 G0 c" A
    ! t* b5 @* t* T& Y& [2 P. |: R$ i/ p2 _% [, v! o8 t% _3 x$ ^
    MOBI的字典只能生成v7版本,该版本对CSS的支持极其有限,margin只支持left其他方向都不支持,即使是看起来有效的margin-left,也不过是在转化过程中替换为blockquote而已。所以只考虑粗体、斜体、下划线和颜色即可,当然不管这里用什么颜色,Kindle上都是浅灰色。
      }% }8 J* B) D& ^1 x6 {8 ^* ]) j3 Z7 w( s& r
    这是我修改完毕后的效果。) V- m9 R( ]6 Q# E3 h
    - D1 _' M$ n# v

    * F& U7 x/ s' N. M& P0 L
    3 G9 m1 R& U  Q8 t( P3 W$ v2 K7 ^8 `5 M4 H  k" W7 V4 _" G
    ' p1 R2 L: U' a) V5 w6 S
    css满意后,那就可以给所有的html文件批量添加link引用了,这里notepad++可以单独完成,就不写脚本了。方法如下:' }. C% ~. ~) g  y9 U8 g

    ; L' u3 d5 X9 i% A- D打开任意一个html,Ctrl + F,然后切换到文件查找选项卡,下面注意选择正则表达式,如图所示:
    / c/ X+ c# u  O  y/ m0 Q2 q. Q: s+ z* _. s
    ) M- z% s: S) U& \+ w  z

    3 F2 R. ]* Z: l7 ^+ w2 E7 q! m
    ' V( Z; l, L: j# }  a' J  e2 g  |/ S% N1 M
    5 l! s, |2 L6 w7 W2 }+ y; C
    查找目标: (<html.*?>); B2 K  a( r: L
    ' n/ l" t. {" `3 v4 O9 g
    替换为:\1<head><link rel="stylesheet" type="text/css" href="test.css" /></head>, q# d  G2 _4 y/ _2 o9 Z* }! x
    # R! A1 V& o* C$ _; M( H2 A
    文件类型:*.html6 Y) @& Q2 V1 `% \1 d3 V

    : R7 A9 i7 [( I- r" [目录:即html文件所在的目录; K% ]* X( ^/ N
    - b, I" c' ?/ J1 N) u
    ' Z) ]0 z: J; _4 v4 a& R

    / I% t/ |2 m1 n2 W然后点击文件中替换即可,这样,所有HTML都添加了CSS引用了。  M' j, D' e9 y1 f+ c
    0 n1 ^% F4 z& r5 I: B
    现在到了另一个重要时刻了:为即将生成的Kindle词典添加变形词,原理就是检测forms-en.txt里面的单词然后提取出变形词添加进去,上面说过了,此处不再赘言。6 X6 r4 r, J' o1 p6 F, _- `' J

    ' ]6 y3 x% N. l# C) l代码很长,不贴了。用法很简单:Add_Infl.py html文件所在的目录
    * ^2 C6 v) B/ O" x$ ^& |$ |) [; ~6 K, }6 `0 U! P
    8 L- G6 i5 `% z; y: u9 {7 u

    ) ~. f* i; o" N0 M7 s2 L7 J* k5 O( T" `2 k
    4 G/ T. s4 @6 m: D- q# t/ s
    文件在此,解压后其他文件和文件夹勿动,以免程序不能正常运行。  C4 e6 z. [/ p$ I( V( |. M

    # s) e& ?' R3 ?5 d* U; w) }2 U& u! j
      T3 X1 C- s6 ~+ [" [1 ~7 ^
    然后会在目录下生成一个名为OK的新目录,新的HTML文件即在此。$ g: G# Z$ z0 V4 ~) I& g6 g
    # D( k' v' ]1 P/ o
    最后就是把之前的opf和css复制进去,然后用mobigen.exe生成即可,mobigen.exe -unicode xxxx.opf; b6 z  ?' m3 n
    8 z5 G7 C1 N' O0 S8 d$ s
    如果你想修改生成后的词典名称,打开opf,修改这一行即可; S" D' l. P* G% Z. g
    / I+ f! x' [; t6 K' k! u

    7 n& \) _; V/ `
      c: Y/ V8 j% n; n" s+ V0 a; t# H# W9 h7 ]7 I" v  s

    " o# J1 i. w: C3 d9 ?完。
    4 E0 c' {2 K9 _5 N% ^/ G4 I% A
    : V! H6 n: ~5 j; S! [$ n# R$ l' j0 A三、结束4 x) j/ ~! R% m

    + Q( N8 a: R; a- g第一次写这种教程帖,步骤、截图等等都很繁琐,几次我都差点晕了。简单看了几遍,算不上流畅但也不至于晦涩。若诸位有什么问题或发现什么错误也可以在下面回复,希望能有更多优秀的Kindle词典出现。
    ; }/ |, f4 j: Q- S/ j1 _7 K3 ^7 a. 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的每日心情
    开心
    2026-5-27 19:42
  • 签到天数: 1051 天

    [LV.10]以坛为家III

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

    本版积分规则

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

    GMT+8, 2026-7-18 16:47 , Processed in 0.021273 second(s), 25 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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