掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 3916|回复: 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 编辑 9 W( i, }8 P+ |( z" ?
    : a9 L" ~# x! b. y- e+ W
    一、前言& a- v: a5 b* v. P+ o  H/ _

    & p2 I4 e( Y& g本篇文章的所有部分均来源于书伴的《如何把 MDX 格式词典转换成 Kindle 字典》 ,只是仅通过该教程的方法所转出来的词典基本没法用,原因是Kindle不支持@LINK跳转、不需要音频、以及需要添加Kindle支持的变形词搜索功能。经过几天的摸索,逐渐有了点头绪,并制作了AHD5th,试用两天后觉得尚可。便于昨天发布。帖子见此:[Kindle词典]美国传统词典American Heritage Dictionary 5th(精制版)5 I. [& F6 ^6 B
    % ~. j5 d% q0 R0 P+ N! J
    本文章展示如何通过Python来最大限度的优化以生成体验较好的Kindle MOBI词典,为各位提供一种思路,以期众人群策群力,制作出更多好用的Kindle词典。. X# x" k( v) e  T

    2 ?0 F3 _2 U) A' j! K$ C4 o为了文章的连续性和完整性,对于完全相同的部分将全文引用这篇文章《如何把 MDX 格式词典转换成 Kindle 字典》 的内容。
    9 C( \# `& A: |2 s
    " ~# u9 `* B3 ^# \0 @) }; f$ _4 y! K8 R: a6 o- J
    二、正文        2 M6 k) J. O5 {5 K- h

    & p. b! z( @/ C, I7 d/ X书伴的这篇教程共有四步,还用到了一些工具。工具请自行下载,因下面所用的代码是Python 3的,所以除了Python 2 ,Python 3 也需要安装。第一步和第二步是一样的,不赘言,仅截一张图于此。' E; i  {# ]- A9 m, `3 r% t( p8 K
    0 o& f* ]+ _& p6 f6 p
    7 {/ u9 B; k$ i$ ^
      P! h. x# T7 B4 ]. a8 X

    # a" R' {3 O# _2 a8 B5 z7 ^, `) r6 f
    工具准备好后,选择你想转制的MDX词典(本文只针对英文词典,即英英/英汉),下面以论坛里的American Heritage Dictionary 5th [IPA]为例。
    ) p+ Z/ p2 U! m  \( x! D) z; E6 y9 H1 f/ q

      s8 V; E' u4 S5 [) Y* [- V经过第一步和第二步的处理,我们会得到一个体积较大(视MDX而定)的TXT文件。其内容格式应该是这样的:
    - I& T; T4 K: D" H# i. o$ z( o# K! ~$ f& `! d3 i

    ' R/ V! G9 l5 R) N4 f6 I; b. x8 {7 d0 P6 p7 R( ^! e: Q8 X

    ( f/ H  d- F) Y; ^+ [- n' X  _7 h$ `4 q
    得到该TXT文件后,我们可以选择几行看一下或者搜索一下如".jpg", "<img", ".wav",="" ".mp3"之类的关键词,把图片和音频等等鸡肋全部删掉。同时,这类CSS引用也可以删掉,以减少文件体积,提高后续处理的速度。CSS引用可以在最后一步添加。比如随便看一下,扫一下就有这些:
    9 S) z8 D, T$ C2 I) ^  h7 o/ `' b) C) N) G. v3 W7 u. q; @
    0 o1 g9 j4 s5 ?

    7 M' c, K# A8 R. J6 J+ W
    5 Q0 A! [: Y0 I* J9 Q3 l9 `+ c5 W
    我用的是Notepad++,以下是我用来替换的正则表达式:% n" m8 I# W- G8 f) K; h" G! ^  f' X

    7 n1 F1 O0 k5 m  N! b4 x        图片:<img.*?>$ m( J9 B. t/ H# f- b
            8 ]/ K: I) K' x$ O5 B
            音频:<a href="sound://.*?"></a>$ T" |4 W( W' D; k: c
    # Z/ H  l7 s8 B8 ~1 N6 y6 }
            注释行:<!--.*?-->! G( w, ^3 a" c4 c) D, \
            
    ( r* _  N: j) b+ z  Y; c可能还有一些冗余的标签,视词典而定,比如我这里就有<span> </span>,直接全词匹配删掉即可。
      w, C" F/ P- q0 |! r! v( D& u7 k4 Y$ B/ C
    我这里这样处理了一下之后,文件的体积直接下降了25%(约100MB --> 约75MB)。* v1 u9 G$ b, Y/ H/ U
    6 V4 V4 z# u6 g
    简单处理完之后,便是正式处理@LINK跳转了。TXT文件的格式只有这两种:单词 + Tab + 意项  或者 单词 + Tab + @@@LINK=另一个单词9 U& C7 _! h' [$ F
    1 K' H8 k0 K& p1 M5 p
    这里我们主要要将跳转词后@@@LINK的跳转链接替换成目标词的意项,因为Kindle不支持@LINK跳转。为方便后续称呼的方便,我在此做个定义。以开头两个词条为例:8 }) I2 [9 P' i( G  x$ R" j1 t

    1 E% t( w) x$ ^3 Z/ H8 X) V6 m% Z$ @7 D* c3 e) K
    7 J! Y$ Q6 s( v' M4 ?( P

    . d- d# t; ]9 \4 Z* r- J& K! L
    9 u5 \+ K' q( Z9 v: K" u但是这里也要分情况,因为如果一股脑全部将@LINK跳转都替换为目标词意项的话,看起来简单。但实际上会导致文件的体积无比巨大,因为里面存在着大量的像这样的跳转:" ^# R% P. q' g

    - M# O% p- E/ w; j
    ' G, Y/ j# ^4 s! B. }6 P7 ]+ K! d2 I) C7 Y3 L; K
    & I) ^& K# W4 U
    , L  j; ~: o: ~
    仅仅是advocate这样一个词,就有七个变形词,它们的目标词都是一样的,如果只是粗暴的替换,那么最后生成的词典肯定无比庞大,甚至如果你内存低点最后都不够用来生成词典。(猜想而已,我没这么干过,有兴趣有空闲的朋友可以试试)
    # I1 G7 {% v7 [6 Q8 @9 J$ p4 q1 p2 ~$ J/ h8 b3 r. c1 n; y/ @1 [
    因为Kindle词典支持为某个单词添加不同的变形词,利用这一特点,我们可以在此处判断,如果跳转词是目标词的一个简单变形,那就跳过该词条。判断的依据来源于dsl2mobi这个工具里面附带的英语单词变形词列表。文件名称:forms-EN.txt,内容如下:
    4 q% n2 D+ s! z) D. `. j
    ( @$ l: _) [1 q' g9 {% m
    % m( |, U1 ?; |0 Q. x% {/ h; n$ m3 b" b& M4 u+ T
            ' P3 I# i1 }* V$ [: B4 c8 i

    ) p% u! j' ~! a% }/ M# @& e: {4 {简单总结一下,做了个程序流程图:
    ; M* u! {' A' B* l1 g4 h9 [3 A* \% ^, U) c$ U% h; d* ]
    - k4 f! g7 u. j; j. z' y+ A6 l
    ( p, Y3 ^6 U9 {* L3 X

    . u9 n# w8 ^3 m7 R0 V% r* `/ \, a' D0 D, O$ o0 N% M) [
    这是代码,你需要修改第3、4、5行的文件路径和第50、51行endswith方法和replace方法中的值改为你操作的字典的实际值。详细的内容请看注释。( H% r) N# W  p0 I# u* i

    # E; @  X( p+ D0 N
    3 `( _4 j1 t6 O5 ]( Z
    : S* v7 ~6 w2 [' U: h
    6 R' B. P: M% }6 k7 u5 b$ C9 L/ q
    ) u$ C5 E; r% b( r
    + R: g6 q) N% J( t6 l6 q1 s% Z0 G; O( D$ c% m3 h
    8 [4 i! B1 Q0 O$ |
    注意:Fix_Redirections.py有一个同级文件夹wordforms,文件夹内有forms-EN.txt,请勿修改。* U7 l6 f! Y. |
    8 s9 C2 q# w8 ]" W" L

      ?5 G1 N7 }, u  S. {2 d修改完了然后执行代码,你看到的图应该是这样的:
    * w6 S3 A+ g1 T0 ?3 Z; e/ Y. I8 y
    " z$ g0 @5 _& Y9 G9 b! C: c4 q5 }) S
    9 @3 k0 |+ _" m3 d0 g' k9 P6 Y2 m' t  @

    : i- D1 T0 v5 Q: R- r6 l
    ; P' e0 j3 o9 w, Q3 h7 [/ z这一过程的速度取决于你的电脑配置和词典的词头数,我跑这部AHD大概花了大半天的功夫。
    8 z, |/ m6 T) F/ [1 ^6 o, Q' W3 H& J9 j
    跑完之后的文件可能存在很多空行(不一定,看词典),这里附上一个去空行的脚本,使用方法:
    , G* k! r9 ~! c1 u2 u8 y. g/ L9 }. d# S1 B  J

    , [5 U- B2 C# c) ?  o: w0 z0 m+ F3 A2 {( B5 o- U
    ' d8 R$ j' W0 S- N) m3 c

    8 t8 ~4 v! m- }9 }7 r# W; A/ ]6 B6 Q6 h  t0 ]$ E4 ?
    - |# I) _2 p% U6 p$ p+ o  e
    执行完成后会在处理的文件目录下生成一个名字带_stripped的文件,这就是去除了空行的文件。+ [2 `" c9 j7 D* {) N

    8 ]3 X; m# o3 R" X
    ( j7 r0 T4 E9 N# x0 p  X2 Q' @9 i

    # {) h; @# m5 q
    9 W$ @; l$ u9 I) ?1 m5 q这时候可以打开文件看一看,应该是满屏紧凑,没有空行,没有@LINK跳转的,就像这样:: z2 d4 m! {4 v0 O9 Y

    : H  O7 c4 h3 l' R* T. N8 s
    # i2 O+ x0 L9 K3 o, f' S( s; s0 N- M/ \
    ( J) r6 \* w$ x5 W; g8 |
    7 l4 y( t2 I0 N8 Q7 |# m3 ]
    到了这里,就可以开始正式进行第三步了。这里用到的是tab2opf.py这个工具,该工具基于py2,所以要用py2来执行。从书伴直接下载的tab2opf虽然没问题,但是根据我的经验,把253行的print df给注释掉,速度会提升许多,而且出错的机率也会减少。除此之外,由于词典的不规范及其他特殊原因,我们上述生成的xxx_stripped.txt难免会有几个或十几个错误行(MDX词典本身的问题),因此,最好加一个异常处理的块,遇到错误行直接提示一下就跳过,免得程序中止运行,你们可以参照下图修改,注意红色箭头的地方。: U3 x3 L: F: J  B

    " C# D' t0 ]: k! n3 I
      D  u1 K$ a. M1 |
    8 W2 I1 v( S& y3 i% K; |9 w  T
    ( U" R0 i$ ^  j# Q9 c
    8 X- G  ?5 b2 Y( \  Y然后执行命令:python2 tab2opf.py -utf xxx_stripped.txt
    : B; X3 ^* n* P+ a5 o; e# w
    4 [3 b6 w. H; _+ q: ~执行完毕后会生成一个opf文件和一堆html文件,如下图所示:
    5 l; E) ]! Z0 V: s  ~9 f- l
    . e/ I2 I8 j$ a/ q7 L4 V
    4 W! S' ^* v: E; D+ m5 O
    7 @$ s' ^6 L4 ?1 O! Z$ \0 o2 @( B2 r' g
    9 h5 J/ s) m5 i* @5 A
    在进行下一步之前,我们还得写好CSS,我的电脑配置不行,打开太大的HTML文件很卡很卡,因此我提取一些意项较多的词条来单独修改建议"go", "take", "in", "the"等,这里我提取“go”词条,复制"go"词条所在的一整块<idx:entry> </idx:entry>,然后加上头和尾(头尾可在任意一个html文件中复制即可),保存为html即可。如图所示:6 Q+ }* j% K& b" e9 }; v! w5 O3 |5 u

    4 y& R: S9 Z7 r" M, p( q+ V0 P$ T' Z/ e( W. s5 Q6 h8 `3 A
    - Q$ n* f3 ?( l: Z( f9 g& ]- Y) [

    - a  _- K5 z" s0 x7 m; j
    4 k" J3 z( p  Z' ]) M4 T因为我们要测试css,所以再添加一个head标签并在其中用link标签引用一个css文件,然后就可以写css了。1 A% F: D& K& k+ Y5 u5 m! _2 K
    3 }( b) H. R8 ~4 l5 B; d

    ' V, }0 B5 l3 I* n3 d: ~: U, Z) G
    ; p( O" ?# g2 Z0 Q+ @
    5 f: q$ G( `2 E0 o% P3 T* k, I6 ?  K
    MOBI的字典只能生成v7版本,该版本对CSS的支持极其有限,margin只支持left其他方向都不支持,即使是看起来有效的margin-left,也不过是在转化过程中替换为blockquote而已。所以只考虑粗体、斜体、下划线和颜色即可,当然不管这里用什么颜色,Kindle上都是浅灰色。" m4 J6 b  Z; a' a! M% r: Q

    & o: n3 u7 N0 L, P5 w2 w$ Z这是我修改完毕后的效果。
    $ r5 n5 }/ Q6 {3 r% {: C; k
    - `* a% b% D  v+ Q
    2 N$ G! _$ Z: R1 T1 k$ a) b% ?9 L: {& [1 s5 |1 {
    7 o4 x# D; G, s5 m
    9 K+ B6 F) Z3 L( g
    css满意后,那就可以给所有的html文件批量添加link引用了,这里notepad++可以单独完成,就不写脚本了。方法如下:
    ( r6 m2 ^( q0 G7 i. {2 c- h, Y* l' Q( Q
    打开任意一个html,Ctrl + F,然后切换到文件查找选项卡,下面注意选择正则表达式,如图所示:/ k. B' t  Q# H8 v/ G, E' B
    % M9 r  j. Z$ ?

    6 k' Z1 {4 R! V8 J2 g9 o2 E0 V2 M, d/ K) e7 M& l8 T
    ; `4 G% T- ~% B0 h
    8 `; Q9 S! b' P( l( q2 i. v
    ! |/ u% P5 L' J) G
    查找目标: (<html.*?>)  O. O4 m# L' E4 A4 E' i" ~7 @
    & S/ \+ \  a3 r4 V6 B3 P
    替换为:\1<head><link rel="stylesheet" type="text/css" href="test.css" /></head>
    . O, e- ?; b/ O+ A3 x* O! |$ l, ]6 r! o) h% ~! n
    文件类型:*.html
    ( o4 C$ }% u2 Z7 L/ L; v8 ]! J) \  s+ z! V! Y, k2 E* X3 O
    目录:即html文件所在的目录
    + x9 g" O: D- Y. z) e# k! G) N( l. e8 Y

    . a6 j7 y, X( T4 ?( l! ^: G9 `, {6 y5 H: O7 w! l
    然后点击文件中替换即可,这样,所有HTML都添加了CSS引用了。
    . h1 e" X5 m2 ]2 C( d
    ( R0 j3 `5 P4 A/ _. Z  j5 x& t1 [现在到了另一个重要时刻了:为即将生成的Kindle词典添加变形词,原理就是检测forms-en.txt里面的单词然后提取出变形词添加进去,上面说过了,此处不再赘言。+ W7 ?0 O& D' J& L- _
      e9 _9 x( o$ v; ]7 k
    代码很长,不贴了。用法很简单:Add_Infl.py html文件所在的目录, o: n, p9 d6 C, D
    $ c9 C9 \$ G  E& I' X2 |
    9 K2 ~2 h% I) D# t. @/ ?, Q

    % C9 ]( o' e. a4 E, R
    6 D  U& p0 Q0 _
    ' M1 X+ R# v. [7 O" G文件在此,解压后其他文件和文件夹勿动,以免程序不能正常运行。/ l) E9 w. \+ o7 |
    " M5 w5 X- V( F+ w! N% V; X) i
    $ j$ r8 h/ Z! S; T
    ( u* x9 g8 J$ t$ P
    然后会在目录下生成一个名为OK的新目录,新的HTML文件即在此。
    % I% U( K3 Y5 I( ^5 v' f$ F
    : Z1 O* M. @% r7 R- T3 ^( w9 K最后就是把之前的opf和css复制进去,然后用mobigen.exe生成即可,mobigen.exe -unicode xxxx.opf% K) c4 o5 @$ M7 F. Q# m+ ]) V

    $ [5 v' K/ x9 l* Y: Y9 k如果你想修改生成后的词典名称,打开opf,修改这一行即可- l( w. }3 ?: E
    / L! @5 j4 w- U$ W1 R8 i

    + J" P9 n; T7 _- M1 `$ h$ ?
    : j7 y! @' w2 U: ]% z8 H9 N$ j6 H
    6 `$ R; k- L# @+ {  I4 E0 K; m5 Q3 h) @7 _+ I# n! `
    完。
    8 D6 V0 `! c# H4 f+ ~
    : u/ f3 P+ g# O( J8 `# `5 e三、结束
    # L  M7 B; A3 g, r% {' r
    & l+ H9 `' V( u2 u! d第一次写这种教程帖,步骤、截图等等都很繁琐,几次我都差点晕了。简单看了几遍,算不上流畅但也不至于晦涩。若诸位有什么问题或发现什么错误也可以在下面回复,希望能有更多优秀的Kindle词典出现。
      N: O4 D2 H& X% d
    - ?; B+ ?, b, g9 ]另外:关于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-25 16:23 , Processed in 0.045092 second(s), 10 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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