掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 4029|回复: 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 编辑 1 L/ n' ?3 G2 h- J' K
    , I) s! j1 e: _* y6 Z& s' \
    一、前言
    9 a7 v- u! o7 t  u) I% }0 O+ I! }! n& d
    本篇文章的所有部分均来源于书伴的《如何把 MDX 格式词典转换成 Kindle 字典》 ,只是仅通过该教程的方法所转出来的词典基本没法用,原因是Kindle不支持@LINK跳转、不需要音频、以及需要添加Kindle支持的变形词搜索功能。经过几天的摸索,逐渐有了点头绪,并制作了AHD5th,试用两天后觉得尚可。便于昨天发布。帖子见此:[Kindle词典]美国传统词典American Heritage Dictionary 5th(精制版)
      E6 j" f4 D$ E& n+ @
    , Y/ w, p5 U& }; c本文章展示如何通过Python来最大限度的优化以生成体验较好的Kindle MOBI词典,为各位提供一种思路,以期众人群策群力,制作出更多好用的Kindle词典。4 Z5 y! T7 L0 X" }9 Q
    7 l. E& c- F0 `' K
    为了文章的连续性和完整性,对于完全相同的部分将全文引用这篇文章《如何把 MDX 格式词典转换成 Kindle 字典》 的内容。: B6 x. Z6 l$ B: `) ?- n5 l

    . R: n4 U/ m: A5 i7 x- v, j- l$ Y2 k; F, Y
    二、正文        + p+ S7 o  ~7 {+ P

    ) G. d+ x! o! `0 a8 J: ?, @+ c书伴的这篇教程共有四步,还用到了一些工具。工具请自行下载,因下面所用的代码是Python 3的,所以除了Python 2 ,Python 3 也需要安装。第一步和第二步是一样的,不赘言,仅截一张图于此。
    ' F" u# k7 A$ ]% O6 O
    ! s) a7 w: G3 X* h# B# m8 D4 ~) c8 X% Q8 f& F
    0 {0 j- {# `5 x+ n
    : f8 x/ ]) {3 l  R$ i1 o

    , a; ~/ C& S& h3 o工具准备好后,选择你想转制的MDX词典(本文只针对英文词典,即英英/英汉),下面以论坛里的American Heritage Dictionary 5th [IPA]为例。0 {2 U: h- k% ]% [

    # B5 J% l/ X/ ~& l6 p8 ~1 G' \+ t* f( j+ k  h
    经过第一步和第二步的处理,我们会得到一个体积较大(视MDX而定)的TXT文件。其内容格式应该是这样的:
    , q8 X- h: h/ V5 y8 T* {6 Y$ X: l. Y1 G, [7 Q
    : T, ~# m' C) V. X4 z9 D( Q

    * R% W; d. t9 p: x* V. S- q" l; p+ X6 u$ w

    8 y* J$ v" G/ n! V7 M. i  H- X  n得到该TXT文件后,我们可以选择几行看一下或者搜索一下如".jpg", "<img", ".wav",="" ".mp3"之类的关键词,把图片和音频等等鸡肋全部删掉。同时,这类CSS引用也可以删掉,以减少文件体积,提高后续处理的速度。CSS引用可以在最后一步添加。比如随便看一下,扫一下就有这些:0 D9 ?/ Q: F2 b' q9 e9 ?. K
    % w5 w% R" Q. M. L

    / ?# b8 U( D' _6 L* ^: ^0 h+ D8 T1 u! [5 z4 S7 K
    ) P. H: }1 B/ |: B/ y9 M  P1 g+ \. C

    9 U6 g. K- M6 d3 W6 ]& y* W我用的是Notepad++,以下是我用来替换的正则表达式:% S: J$ _7 `. }0 d  E7 |' M" h

    0 x( {- T0 p8 u! s6 f' p: Z; Q  o( `        图片:<img.*?>
      l. P5 U# T, f5 ]' [' s. [1 G        
    ( T9 H4 X7 @. e, d9 ~' j1 x        音频:<a href="sound://.*?"></a>
    5 h; O+ v; d: n  J, J' b/ M, K9 K6 x
            注释行:<!--.*?-->( J3 L' g8 G' V  M% ^: _
            
    ! T6 q# O- p6 Q$ n/ I1 K7 C可能还有一些冗余的标签,视词典而定,比如我这里就有<span> </span>,直接全词匹配删掉即可。- g! _* z; [% a/ r3 m

    & Y4 R7 m! k  }2 e  R0 E( O我这里这样处理了一下之后,文件的体积直接下降了25%(约100MB --> 约75MB)。
    3 R' T7 M; S5 |) x2 v+ h
    3 Y3 W, x7 I2 ?简单处理完之后,便是正式处理@LINK跳转了。TXT文件的格式只有这两种:单词 + Tab + 意项  或者 单词 + Tab + @@@LINK=另一个单词5 b, w1 k3 a+ a2 L

    - G, J& h  L6 Z3 V这里我们主要要将跳转词后@@@LINK的跳转链接替换成目标词的意项,因为Kindle不支持@LINK跳转。为方便后续称呼的方便,我在此做个定义。以开头两个词条为例:0 y% D* M( r" n4 M, Q
    % Y$ \4 j) m1 _2 {

    ' @) ]2 n! V7 r9 X$ _% @: }" l: R- ?: U7 G: E

    4 ?6 k) q$ k+ ?+ i2 s
    $ w( V, x8 x/ q- c8 s+ V% E$ ]5 H但是这里也要分情况,因为如果一股脑全部将@LINK跳转都替换为目标词意项的话,看起来简单。但实际上会导致文件的体积无比巨大,因为里面存在着大量的像这样的跳转:, n# g5 ]; `# j

    , f8 \- K3 I0 i/ U* [* m5 v% C7 N  s- L+ l

    $ M4 y0 b6 d1 s5 G3 l" |8 a' t/ y  `: K  V/ s" _5 g% q( z

    2 v9 k/ n) |3 O+ U: i' D9 F" A+ n仅仅是advocate这样一个词,就有七个变形词,它们的目标词都是一样的,如果只是粗暴的替换,那么最后生成的词典肯定无比庞大,甚至如果你内存低点最后都不够用来生成词典。(猜想而已,我没这么干过,有兴趣有空闲的朋友可以试试)
    ! r- C5 {$ _6 \4 U. o2 o) m* G& L( L, z7 _- s5 d
    因为Kindle词典支持为某个单词添加不同的变形词,利用这一特点,我们可以在此处判断,如果跳转词是目标词的一个简单变形,那就跳过该词条。判断的依据来源于dsl2mobi这个工具里面附带的英语单词变形词列表。文件名称:forms-EN.txt,内容如下:
    - U5 a* L2 F2 J' y2 X- ?6 P2 O
    $ \! E9 y! T+ L/ I7 B, Z( s% {" j4 e, G+ j# I# D4 m1 w# ~
    2 m* ~, I9 I! R/ J- q7 X" z  S
            
    9 G& T0 q: ^% d( K  h$ u
    / M  Z) b$ S7 y2 i, s4 b简单总结一下,做了个程序流程图:
    3 w8 q+ _, c& G" `5 j; w" W+ W9 Y5 o) T3 H+ F6 J+ {

      }4 _9 j( p0 P. D+ l5 v; J
    / b. C, Y3 F6 ]+ c3 f5 w  u
    % ~6 C4 b0 G3 m
    $ C+ A7 D; j9 o9 J' u  m这是代码,你需要修改第3、4、5行的文件路径和第50、51行endswith方法和replace方法中的值改为你操作的字典的实际值。详细的内容请看注释。
    1 ?9 t9 m1 a; |
    5 e) _/ I4 v: R1 ?7 c7 @
    4 I' A& O: e, t
    8 h; C1 T& Q0 r% G
      z' Z- x- @* V2 D+ `2 b
    7 ^7 W0 a2 i2 n& ?, L, M, W% y/ P5 f9 q# N# S5 c$ w
    6 \8 f& J8 [! ~

    : i& \. w$ ^+ Y8 n+ ]注意:Fix_Redirections.py有一个同级文件夹wordforms,文件夹内有forms-EN.txt,请勿修改。: e' o- M- J) O( ]* t5 f

    " S9 B) C2 v0 `
    ( \# L$ g6 L0 K9 ^# C* n; z# @修改完了然后执行代码,你看到的图应该是这样的:
    7 B8 W5 d$ [1 y. q0 c: }5 c& m3 ]) H
    - G3 k7 `- X, c  T- N
    ( j2 t, Z3 k, m# N7 L* i: b! b
    , V# D# l% n1 {% T. O4 [4 a; T( [' o
    7 A4 h$ h. t- N) o/ c$ P
    这一过程的速度取决于你的电脑配置和词典的词头数,我跑这部AHD大概花了大半天的功夫。
    6 V, f/ T* c6 E  h( u( `
    & K6 x4 I9 k& ]" g, y5 e9 U跑完之后的文件可能存在很多空行(不一定,看词典),这里附上一个去空行的脚本,使用方法:
    $ J& V( V7 B  |9 V5 L& E: l+ w4 |8 @8 w. E( J' [
    0 e" j! R) Y9 x3 ^3 ]
    " p0 J; B! F, I8 g% R% f) `+ c* `

    8 i. {) [/ l$ f5 G- d
    ' Q/ Y0 {+ ?  b9 z& v& ~5 z8 Q
    7 ^3 Y* ~. q) R* [
    6 x/ y; M9 D' B. K6 M5 L; }% T执行完成后会在处理的文件目录下生成一个名字带_stripped的文件,这就是去除了空行的文件。: X7 y1 w; y, A2 x! ^

    ( B/ s, M- q" Z+ W* T9 O$ ?
    % W, R. Q/ {  u1 [& d# }3 y
    5 \; P* ^- Z5 c$ V9 ~  J) R% Q$ q

    & R! I" `+ x6 m: y1 w: |: |这时候可以打开文件看一看,应该是满屏紧凑,没有空行,没有@LINK跳转的,就像这样:
    2 @! ^5 o( n3 Q8 k% I+ d3 W
    ) B0 @: C! m' N) I, V4 B, w' Z2 B

    & W0 ^9 b) Y. E. B/ R0 b5 H
    ) X- ~4 B# A9 @& b4 F" ]
    5 ^" m+ G. n% Y1 x9 r到了这里,就可以开始正式进行第三步了。这里用到的是tab2opf.py这个工具,该工具基于py2,所以要用py2来执行。从书伴直接下载的tab2opf虽然没问题,但是根据我的经验,把253行的print df给注释掉,速度会提升许多,而且出错的机率也会减少。除此之外,由于词典的不规范及其他特殊原因,我们上述生成的xxx_stripped.txt难免会有几个或十几个错误行(MDX词典本身的问题),因此,最好加一个异常处理的块,遇到错误行直接提示一下就跳过,免得程序中止运行,你们可以参照下图修改,注意红色箭头的地方。
    - j  t! D$ K+ w' z5 Y# d) h0 `+ ?
    . I/ c! z: K" P" ~" n6 s4 ^- P
    0 N8 K$ ^+ V' }2 w
    7 K% n7 Y5 ~6 [3 z9 d* c0 r
    8 y& D. J: G0 t1 M$ c; Z5 F5 u2 a1 v! ?- p5 U
    然后执行命令:python2 tab2opf.py -utf xxx_stripped.txt" g6 d4 r+ D1 o
    . N& v$ D! J9 X+ Q2 j
    执行完毕后会生成一个opf文件和一堆html文件,如下图所示:
    ) w5 i5 k5 J. p4 J5 `
    1 i  l1 x8 I' e+ V6 n2 z" E! |' O" H
    9 D' J% j+ j# r4 |% A( z% a

    5 m# \7 I* c" `9 {" e  m
    % l- K  z. _7 l& s. b在进行下一步之前,我们还得写好CSS,我的电脑配置不行,打开太大的HTML文件很卡很卡,因此我提取一些意项较多的词条来单独修改建议"go", "take", "in", "the"等,这里我提取“go”词条,复制"go"词条所在的一整块<idx:entry> </idx:entry>,然后加上头和尾(头尾可在任意一个html文件中复制即可),保存为html即可。如图所示:
    " Q3 Z% y9 s9 A% G( }2 g5 i! p: ?0 U$ t! G6 z1 p, Y3 G8 y
    / \0 X) D; w1 z1 q6 T
    8 ^' G3 d. y9 _. w' |

    7 N2 w0 H; k( e' e, L; N7 w% b8 K; y' E. ]
    因为我们要测试css,所以再添加一个head标签并在其中用link标签引用一个css文件,然后就可以写css了。
    3 P1 p. O7 ^: ?' H( I; }8 i4 e% @% m& ]* g* U; [; T

    3 q/ L" b; U1 ]5 g) T6 g# _$ \( G* E& E! g0 b0 E
    1 Q% Z, f  x3 P9 {7 P

    - |! H2 Y! l% J, _9 T2 VMOBI的字典只能生成v7版本,该版本对CSS的支持极其有限,margin只支持left其他方向都不支持,即使是看起来有效的margin-left,也不过是在转化过程中替换为blockquote而已。所以只考虑粗体、斜体、下划线和颜色即可,当然不管这里用什么颜色,Kindle上都是浅灰色。
    $ `* M/ L2 V" R& |- |  a0 U% v% `0 i; x5 G  ?0 ~
    这是我修改完毕后的效果。
    ' S  n  o  c3 @) C, z% d, k/ ^) p# f( n! [' [0 g4 S9 i
    5 Z0 U7 H) Q, D
    5 K. s  {5 k" y# c8 z
    ) Y- {8 I+ {- y- a+ r# ~
    ; R2 G( K, `# g; E; x9 X2 i
    css满意后,那就可以给所有的html文件批量添加link引用了,这里notepad++可以单独完成,就不写脚本了。方法如下:
    " x; ]/ |) K" s* `0 U& S+ ^- K, r) W" y% e' ^5 E
    打开任意一个html,Ctrl + F,然后切换到文件查找选项卡,下面注意选择正则表达式,如图所示:
    % Z8 i/ |) R8 @6 }) ?- P/ ?+ U
    # S' g. w/ h" R) S; @, P
    $ y8 i1 l( d0 o' |4 b: [/ X
    1 C# J( i3 m" U8 v" e, e4 f* R% S$ l; e- ~" |4 E8 W
    + `8 `! e4 B- s: ^
    7 V# z$ X6 t- z: S) t7 d2 J
    查找目标: (<html.*?>)( E0 q0 s  `, w( e. J- F, Z
      S  J: p" _+ x0 X3 D
    替换为:\1<head><link rel="stylesheet" type="text/css" href="test.css" /></head>8 L6 y/ S4 _$ I4 L; z2 D1 z, r6 S

    % ?  s3 w; l9 O! U0 p0 K" c文件类型:*.html
    & ^3 J5 E4 N+ w
    7 b) E# M1 v; K0 @目录:即html文件所在的目录
    2 r+ Z$ Z  K. U. j2 @+ G
    9 L' l3 b6 }. W" L5 a1 H
    2 o; N( c9 K3 }: B4 ~( N6 B6 H
    $ J9 Y; K# x" b9 c7 s6 B  O
    然后点击文件中替换即可,这样,所有HTML都添加了CSS引用了。
    6 p9 Q- ?1 ?# c
    1 W$ F- X5 o. X! Q7 F* Q4 ^, {现在到了另一个重要时刻了:为即将生成的Kindle词典添加变形词,原理就是检测forms-en.txt里面的单词然后提取出变形词添加进去,上面说过了,此处不再赘言。' T3 c; ^/ X# i2 F$ B# p  o- \: B5 k& q
    ! {! h  T1 B- X7 A% \9 L/ u
    代码很长,不贴了。用法很简单:Add_Infl.py html文件所在的目录. Z, k& U" v) M: }- l6 I3 y
    " U* M8 y: ]- @. U' H

    5 O9 n0 _% u+ P$ V$ J- B" \1 d' y; L1 [. o- j9 P* j6 x
    ; w) x! A% q" `2 p* l+ A: b

    $ W9 J0 `/ ?  N5 @: M- I( q$ x文件在此,解压后其他文件和文件夹勿动,以免程序不能正常运行。
    / V; U9 N  y/ m7 o# j

    " Y! j9 u. C$ l6 q8 h+ c. U
    ( c3 s! ?4 X& p8 w0 [; `& n
    7 r7 {0 n0 e( f然后会在目录下生成一个名为OK的新目录,新的HTML文件即在此。
    4 Z: H" ]) B' F+ n1 K. W- `, B
    ; T1 F0 _: l. K' ]最后就是把之前的opf和css复制进去,然后用mobigen.exe生成即可,mobigen.exe -unicode xxxx.opf! ~; b) W# G, |; s9 a

    6 r! h/ T6 w0 T" o) |如果你想修改生成后的词典名称,打开opf,修改这一行即可
    * ~# z( ?- G  J6 D6 Q& _( f" D, g* p' `

    0 D' _/ E9 x; v8 K5 Q: {! ?3 q! B* W$ c, F7 ^

    $ h8 S, y% h: D( T3 {, k: f$ S% X( f
    完。( u+ W  ^3 s9 ^" N5 S; s1 b( p
    6 ^7 K+ G7 Y: q; J" ^
    三、结束
    ' G$ N- ]1 G# |% i  Q  H  E( r# m; z3 z$ j
    第一次写这种教程帖,步骤、截图等等都很繁琐,几次我都差点晕了。简单看了几遍,算不上流畅但也不至于晦涩。若诸位有什么问题或发现什么错误也可以在下面回复,希望能有更多优秀的Kindle词典出现。& m  h8 Q4 A6 n  Y2 T& e; a
    , Q% v6 I0 {9 z1 [. R: E+ g
    另外:关于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-5-14 09:36 , Processed in 0.081344 second(s), 10 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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