掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 3937|回复: 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 编辑
    0 R6 s. d" u5 }: m% o
    / d# z/ j/ A. Q5 i3 q一、前言
    9 B  }+ N& t* ^2 d4 X( D% o- w$ \  U$ J8 c( D5 u. G/ q/ {
    本篇文章的所有部分均来源于书伴的《如何把 MDX 格式词典转换成 Kindle 字典》 ,只是仅通过该教程的方法所转出来的词典基本没法用,原因是Kindle不支持@LINK跳转、不需要音频、以及需要添加Kindle支持的变形词搜索功能。经过几天的摸索,逐渐有了点头绪,并制作了AHD5th,试用两天后觉得尚可。便于昨天发布。帖子见此:[Kindle词典]美国传统词典American Heritage Dictionary 5th(精制版)
    9 t5 n  ~; l: Z) }, j/ ^7 G
    ) ?! m+ D# l9 l9 e本文章展示如何通过Python来最大限度的优化以生成体验较好的Kindle MOBI词典,为各位提供一种思路,以期众人群策群力,制作出更多好用的Kindle词典。
    9 \# {' x6 D& [4 C. u
    ( c, B4 X, W  T  {1 o5 `# ?" Y, F为了文章的连续性和完整性,对于完全相同的部分将全文引用这篇文章《如何把 MDX 格式词典转换成 Kindle 字典》 的内容。
    5 n: o9 I$ D1 Z  Z# t6 b4 G' d1 {, Y# x" _* @

    4 E, E$ F' E1 f+ C& j+ H9 I, K二、正文        
    : z$ g- |2 p2 O4 P3 U
    1 _: E# C0 `! Y书伴的这篇教程共有四步,还用到了一些工具。工具请自行下载,因下面所用的代码是Python 3的,所以除了Python 2 ,Python 3 也需要安装。第一步和第二步是一样的,不赘言,仅截一张图于此。& P% S% T4 y( N- ]2 Q8 X

    4 Z  W" I% c; t2 b3 T6 u* k$ U' F0 V+ r) J
    . y7 J* m$ [1 @7 ]! S: P+ C

    " e" U, v# d; B# m
    / q/ m/ l0 I' ]. I工具准备好后,选择你想转制的MDX词典(本文只针对英文词典,即英英/英汉),下面以论坛里的American Heritage Dictionary 5th [IPA]为例。" u- i" y( B) C% {# k

    , X0 a- G# W$ F" {7 K
    - h! k3 Q5 u  e9 a$ i1 b# m4 E经过第一步和第二步的处理,我们会得到一个体积较大(视MDX而定)的TXT文件。其内容格式应该是这样的:
    / ^  G4 ~1 \( K3 p' h  @) i* [' J  \/ x( _( ~7 |
    & f* k& U. P! H

    ) b8 N/ u; B' G3 o1 O' A( X) Q( W3 g" n6 Q. d6 A
    8 @# C) z; E7 g( K" Z' m* u# J) S
    得到该TXT文件后,我们可以选择几行看一下或者搜索一下如".jpg", "<img", ".wav",="" ".mp3"之类的关键词,把图片和音频等等鸡肋全部删掉。同时,这类CSS引用也可以删掉,以减少文件体积,提高后续处理的速度。CSS引用可以在最后一步添加。比如随便看一下,扫一下就有这些:3 z/ T) k7 z7 |& K# d0 v
    9 H9 m* |- e& J
      V* ~7 f, Z) L3 g) M
    5 m( S2 ^2 R7 b* c# B1 L
    + Z, U& r# F/ q, c0 K% @( s
    * ~; G8 h, o5 t$ v) m
    我用的是Notepad++,以下是我用来替换的正则表达式:3 k7 S) C1 u2 `( o" F% o
    5 j0 S/ G9 }3 J- l% v
            图片:<img.*?>
    ( j2 \" E# O3 v  R        , W( n2 a" i) W' L" T5 [
            音频:<a href="sound://.*?"></a>  D; Y8 J/ P2 E; }! ?
    ( ?! B0 C0 {8 W( i5 T
            注释行:<!--.*?-->
    2 G/ N7 K2 P3 L; E9 G        / s4 I  c# s5 j2 z* }1 B/ b7 @
    可能还有一些冗余的标签,视词典而定,比如我这里就有<span> </span>,直接全词匹配删掉即可。
    / e/ Z+ P* ]& i6 W  a' F0 A
    / G& X( b7 q5 i! B. }6 n我这里这样处理了一下之后,文件的体积直接下降了25%(约100MB --> 约75MB)。
    9 v- s3 w& ?# Q9 A$ a4 }
    $ v$ [4 _" K8 t9 ^8 W+ _1 Y0 c简单处理完之后,便是正式处理@LINK跳转了。TXT文件的格式只有这两种:单词 + Tab + 意项  或者 单词 + Tab + @@@LINK=另一个单词! E9 @3 R% Q2 g
    & s/ `) K+ a0 S  E
    这里我们主要要将跳转词后@@@LINK的跳转链接替换成目标词的意项,因为Kindle不支持@LINK跳转。为方便后续称呼的方便,我在此做个定义。以开头两个词条为例:
    , {5 Q4 m) g4 r! i
    % j* B0 a5 a' U+ e- D0 }
    # Y: D5 ], S8 H) a, P2 x$ A$ e, f- \: n

    , M5 B+ ?* ~( ~4 K/ C) v( {
    % C" _/ }* c1 o. ~但是这里也要分情况,因为如果一股脑全部将@LINK跳转都替换为目标词意项的话,看起来简单。但实际上会导致文件的体积无比巨大,因为里面存在着大量的像这样的跳转:( Z3 s7 d6 L; x6 r: z8 T% z: }8 P4 ?

    6 S' ~0 k, J3 n
    ( g6 B, y2 [" R7 H/ y) E
    % U: |! O8 S+ P+ c9 g6 E/ y8 r8 U0 x; ~; i" S7 k: w
    4 d2 H9 r* w% f) H- {; W% ?% v4 j
    仅仅是advocate这样一个词,就有七个变形词,它们的目标词都是一样的,如果只是粗暴的替换,那么最后生成的词典肯定无比庞大,甚至如果你内存低点最后都不够用来生成词典。(猜想而已,我没这么干过,有兴趣有空闲的朋友可以试试)
    % _  P8 ?7 v6 {; m; r1 a& s: S8 O' n' @6 ?; t& s9 E4 ?
    因为Kindle词典支持为某个单词添加不同的变形词,利用这一特点,我们可以在此处判断,如果跳转词是目标词的一个简单变形,那就跳过该词条。判断的依据来源于dsl2mobi这个工具里面附带的英语单词变形词列表。文件名称:forms-EN.txt,内容如下:0 e! j/ E8 t) H6 N/ d

    3 h! Z: p' N, k  S. c" i* y. U( E& I& s* H0 q! d

    8 T% @6 T* X  a% H        
    / h& Z. @% C3 j2 B2 r* y! p
    5 s5 M  q+ h; _5 ~+ ^( F简单总结一下,做了个程序流程图:
    / B9 s8 v5 I+ ]  f, f0 |3 }) ?) s7 {5 B0 S
    ! k2 }- \) X5 s: c

    1 E, z2 z8 H8 S# r  V7 }
    / V: |8 q( S5 l9 E3 k! H$ y8 Z: r" `- x2 X
    这是代码,你需要修改第3、4、5行的文件路径和第50、51行endswith方法和replace方法中的值改为你操作的字典的实际值。详细的内容请看注释。
    ) |7 X4 A2 k  Z* t5 D3 Y% T4 h9 ^& q7 R  A

    % x- U8 w9 i9 g, Y; b/ [8 ?. ]
    ) ^4 ]* e6 h/ j1 L4 ]  Y2 Q9 q9 Y4 V! @! y5 l! S. m. X
    # E3 T) J4 }( }; z# O1 d
    ( I; {' Y3 o" R" A) X
    6 W& I" ~# c$ h  @; M$ U

    % v6 L4 u) c( g, n3 i注意:Fix_Redirections.py有一个同级文件夹wordforms,文件夹内有forms-EN.txt,请勿修改。7 x$ x- N+ P0 T& f2 T
    $ v) N+ w, y$ s/ o* ~: @, C
    ' k) ^8 t5 e4 _, a0 T4 T( }2 v
    修改完了然后执行代码,你看到的图应该是这样的:! y+ j' {+ X& \2 x& v! P& |3 I( |

    # K1 d; N. l/ @+ O( U
    2 X% }- s: C- F/ k' m
    5 @: q" b2 r* k( |! O
    9 \/ z0 H/ e1 B" S" l$ [+ b
    # W5 s1 r9 y9 X这一过程的速度取决于你的电脑配置和词典的词头数,我跑这部AHD大概花了大半天的功夫。+ z! o  G' E! ?0 W& U
    ) P) I  E0 j* \5 {: c4 J- C
    跑完之后的文件可能存在很多空行(不一定,看词典),这里附上一个去空行的脚本,使用方法:
    5 z1 g' ?9 x/ K, {
    ( [; D2 S& m* X! t1 N$ c& t7 O+ }: m9 ]9 O) D$ c7 w" q
    2 U! N( O2 G* l  F7 |% X
    ( C2 C& L- g- i7 [
    / j3 g& C5 D4 b, c' }1 M
    3 H& x% {8 S8 ]' J* v8 X& v4 Z$ ?
    " v8 U/ j; r2 ]& o7 J2 t2 ^& Z( L
    执行完成后会在处理的文件目录下生成一个名字带_stripped的文件,这就是去除了空行的文件。
    & i! |3 u0 d% B% Q4 P- `
    * N! C) {. T7 A
    / E# q4 A$ p8 S3 R  w, [0 p% y$ L1 e( e/ t
    $ l8 M: U/ E# ^% ?2 U
    ' w0 f8 D; ?6 h# S7 e
    这时候可以打开文件看一看,应该是满屏紧凑,没有空行,没有@LINK跳转的,就像这样:6 O' Z$ s7 N3 \% J2 g

    + P. w5 `5 v" g9 I- g/ @0 V  o% H$ d/ B; b' ~2 V) V
    + I3 v  I3 T/ r, l) g! o0 z

    " C# P$ [$ l$ `4 f7 p& M, U
    / L6 J4 ~  {9 U$ Z7 @! K到了这里,就可以开始正式进行第三步了。这里用到的是tab2opf.py这个工具,该工具基于py2,所以要用py2来执行。从书伴直接下载的tab2opf虽然没问题,但是根据我的经验,把253行的print df给注释掉,速度会提升许多,而且出错的机率也会减少。除此之外,由于词典的不规范及其他特殊原因,我们上述生成的xxx_stripped.txt难免会有几个或十几个错误行(MDX词典本身的问题),因此,最好加一个异常处理的块,遇到错误行直接提示一下就跳过,免得程序中止运行,你们可以参照下图修改,注意红色箭头的地方。4 H# o* \4 A+ h( l- U0 j8 W' a+ y8 E
    5 M/ l) S1 C+ u
    4 w  |' d6 E4 X/ K6 D; y

    ! J5 T4 S" h; s& T* N5 ~0 f3 C# M( F5 T$ W2 x( E% t
      s5 L' s9 S* u" M
    然后执行命令:python2 tab2opf.py -utf xxx_stripped.txt
    2 K* U& n( i( |* w! }0 N
    & J& J" w+ n5 K9 [) e2 l执行完毕后会生成一个opf文件和一堆html文件,如下图所示:# r9 Z8 i' |3 g0 k8 Q4 v3 m

    6 L" F5 |1 B: N' A& j) E* t
    0 L7 F4 D' r- C3 D, S4 K5 b, X/ x( b* K2 V% R

      s( y9 z( Q2 ~+ U7 e+ }$ H5 y* P+ w& W
    在进行下一步之前,我们还得写好CSS,我的电脑配置不行,打开太大的HTML文件很卡很卡,因此我提取一些意项较多的词条来单独修改建议"go", "take", "in", "the"等,这里我提取“go”词条,复制"go"词条所在的一整块<idx:entry> </idx:entry>,然后加上头和尾(头尾可在任意一个html文件中复制即可),保存为html即可。如图所示:
    % c% F& R9 E7 O  D5 ~( v7 {4 _) k5 h) O+ t( }

    " d% l+ Z5 D. [* }+ U5 \$ I8 R8 {7 G: s2 `2 l
    1 {6 G( G! k. j

    - Z" u; D5 Z7 W; n4 M因为我们要测试css,所以再添加一个head标签并在其中用link标签引用一个css文件,然后就可以写css了。3 ]2 ^: T) @3 |: I( B+ f8 l

    ( ?2 g" m) w% m" V5 S
    1 k) D$ ?% f* n; ^) S) j9 s; t5 O* m& C+ n' Z  G- j0 v: Q# z: _; U

    4 t/ y8 S( ^6 E; J, z
    ! y) r3 V7 s. N+ P8 O" _+ `( ZMOBI的字典只能生成v7版本,该版本对CSS的支持极其有限,margin只支持left其他方向都不支持,即使是看起来有效的margin-left,也不过是在转化过程中替换为blockquote而已。所以只考虑粗体、斜体、下划线和颜色即可,当然不管这里用什么颜色,Kindle上都是浅灰色。6 ]/ O6 t: m& [1 a2 J/ f

      D2 f7 t: Z+ z5 `这是我修改完毕后的效果。5 ^) F* b: O7 o6 U2 t. V3 ]

      I& L: w8 `. h+ S/ K! b5 C4 T$ b& z0 A+ e; o
    7 T& W! J+ G9 [3 K5 z

    $ X. |# x5 G% r0 H' M" _9 e& b/ x: |, R8 p
    css满意后,那就可以给所有的html文件批量添加link引用了,这里notepad++可以单独完成,就不写脚本了。方法如下:
    ) x5 [  K9 B; u4 W9 K6 D- {! L' x+ E- a! h* N! p
    打开任意一个html,Ctrl + F,然后切换到文件查找选项卡,下面注意选择正则表达式,如图所示:
    - x6 s, X% z" ?7 E: I( N+ T9 X8 C( L! m  ?0 `# Y

    ! y% y. T. a  ^9 ~) S1 o: Q2 }9 n  B' g: M$ x6 F3 ~0 p3 n

    $ y8 ~, I+ @( m8 k: F! E% `" B% a

    ; I# t: ~# F; i9 Z2 h查找目标: (<html.*?>)3 F* z2 q( O9 _* R9 ?. v8 T
    8 ^/ S$ J1 X7 G
    替换为:\1<head><link rel="stylesheet" type="text/css" href="test.css" /></head>3 B4 n# E* x, C8 a, C$ B$ C% }' Y

    3 r& E0 g( D) I/ R6 ^文件类型:*.html8 a( j% u+ F& L+ \' q+ ^7 M) B

    ) I8 w- p, o0 A, w2 z! O( U目录:即html文件所在的目录
    0 w& X: c! S$ o. U( x: G& d9 L/ A$ A" @( L

    $ R- y% A' A! b9 p+ X/ E/ C
    8 C/ n% `1 _3 n+ [# G然后点击文件中替换即可,这样,所有HTML都添加了CSS引用了。4 y3 s7 q  J6 t8 m
    ; S0 y, Q1 _8 Y5 S7 C# ^4 P- Z
    现在到了另一个重要时刻了:为即将生成的Kindle词典添加变形词,原理就是检测forms-en.txt里面的单词然后提取出变形词添加进去,上面说过了,此处不再赘言。" \) X# K9 |7 w0 q
    / W5 ]) S; m( J; U
    代码很长,不贴了。用法很简单:Add_Infl.py html文件所在的目录5 M  ?: [! H& S$ [9 l& l1 z" e
    0 F9 v. f* M, n' b6 m2 G

    6 k7 U! _1 j( _3 y2 ^+ R8 S" S
    + ~& j; i* o7 y& `( p- w; o" R4 m3 ~/ [( a, N, u" d
      V/ a; ~' z- I
    文件在此,解压后其他文件和文件夹勿动,以免程序不能正常运行。
    ) e: H! U& `8 T3 z- J
    ; m8 @1 d  s$ K/ q9 M  w; d
    ! F) S  Y4 W+ {

    7 ?# E" u6 }6 a% E% L然后会在目录下生成一个名为OK的新目录,新的HTML文件即在此。* N2 U4 U0 }4 m1 Y- p3 {, b

    7 H# P# N3 D& f. s# u5 |最后就是把之前的opf和css复制进去,然后用mobigen.exe生成即可,mobigen.exe -unicode xxxx.opf
    ' c! C: }6 t& a3 U3 X
    5 j% ^% n6 Y; x# n# {9 U0 i9 g如果你想修改生成后的词典名称,打开opf,修改这一行即可+ [8 m1 o* A2 P% [2 z

    - D0 y4 K" U8 }5 }% Q0 b
    ( K' I, }1 z" B: u
    $ J9 w' N4 s: \( m. H3 C$ @* Q5 {( J$ G; n4 w) H1 }) s

    ' n" e/ }2 x' y+ j1 E! L/ m$ t& I完。
    1 P0 h/ ^6 K% l9 }* M3 T( w# F$ ]8 a& ^' D$ C, i7 f
    三、结束1 \% b5 Z+ f% U; r  ^1 ^
    + x* J. _" d! O' f/ z& W1 [6 D" O
    第一次写这种教程帖,步骤、截图等等都很繁琐,几次我都差点晕了。简单看了几遍,算不上流畅但也不至于晦涩。若诸位有什么问题或发现什么错误也可以在下面回复,希望能有更多优秀的Kindle词典出现。
    9 |$ i$ w8 t" w. K
    4 Z7 u' h! M2 e' X另外:关于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-29 23:05 , Processed in 0.049619 second(s), 10 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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