掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 3926|回复: 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 编辑
    ( i: ^) ^' E. }6 c
    8 j1 B% B% y, [' ]5 X1 s4 t8 x! ^一、前言
    2 e4 Z, b1 {( W7 Z6 S" _; I% C0 K: w& _2 s
    本篇文章的所有部分均来源于书伴的《如何把 MDX 格式词典转换成 Kindle 字典》 ,只是仅通过该教程的方法所转出来的词典基本没法用,原因是Kindle不支持@LINK跳转、不需要音频、以及需要添加Kindle支持的变形词搜索功能。经过几天的摸索,逐渐有了点头绪,并制作了AHD5th,试用两天后觉得尚可。便于昨天发布。帖子见此:[Kindle词典]美国传统词典American Heritage Dictionary 5th(精制版)' C5 s& W# ]  W$ J

    7 C' X8 d! H5 t6 s: W8 h+ E本文章展示如何通过Python来最大限度的优化以生成体验较好的Kindle MOBI词典,为各位提供一种思路,以期众人群策群力,制作出更多好用的Kindle词典。
    5 o6 d* ^5 R0 J( j0 |0 v5 D0 n+ l5 W, M# {
    为了文章的连续性和完整性,对于完全相同的部分将全文引用这篇文章《如何把 MDX 格式词典转换成 Kindle 字典》 的内容。
    1 z  a9 ~! q- B, S. h& s3 ]8 o5 p  x4 t" v
    8 j" Y/ L6 ~- r* `$ a) O$ t
    二、正文        
    , u7 x/ g  K2 o& |4 M! Y/ v/ o9 y
    6 H. U' A- s0 j2 P$ i书伴的这篇教程共有四步,还用到了一些工具。工具请自行下载,因下面所用的代码是Python 3的,所以除了Python 2 ,Python 3 也需要安装。第一步和第二步是一样的,不赘言,仅截一张图于此。
    ! X$ J: {  ]4 L7 |
    9 B% f3 A7 i" j& K! m) L
    ) b+ T2 u( H% ~* K7 N/ p2 T8 W4 Q3 p# @9 V
    3 N3 I4 [( d; C( W2 H8 V' a9 ^
    7 ~  V  u7 {$ J' s
    工具准备好后,选择你想转制的MDX词典(本文只针对英文词典,即英英/英汉),下面以论坛里的American Heritage Dictionary 5th [IPA]为例。) V. ?) ^( u+ U

    " K( J6 y3 W! v. x
    ! y& Q/ C0 r! ^经过第一步和第二步的处理,我们会得到一个体积较大(视MDX而定)的TXT文件。其内容格式应该是这样的:
    / y* ^$ G* ]; O7 F1 \2 e. q. W
    % E* y. e2 \5 S" J" x* R- }& a

    . G( m6 m' @/ ^' y; G( s3 d" p+ N1 {* x* q$ `7 F8 f& W* I
    ! A* ^- O  ~0 ^$ Q/ D3 @
    得到该TXT文件后,我们可以选择几行看一下或者搜索一下如".jpg", "<img", ".wav",="" ".mp3"之类的关键词,把图片和音频等等鸡肋全部删掉。同时,这类CSS引用也可以删掉,以减少文件体积,提高后续处理的速度。CSS引用可以在最后一步添加。比如随便看一下,扫一下就有这些:1 v( X# }6 t  i( k& Q$ n/ X

    3 o6 N8 h: j% w1 `
    . b- A; V* U: v0 _* I, A6 m; `3 t+ O* p  u. J" L# A
    & o" p, v+ A4 X: D. r' M/ s# `  ~
    9 S8 U! o- d+ }! g7 Q2 m* w" ?+ K) w
    我用的是Notepad++,以下是我用来替换的正则表达式:
    2 _" a! w) ?- q' Q% a% s5 M1 Q* J2 Q& j
            图片:<img.*?>$ ]1 o  i1 A& E$ M/ X" J+ `
            0 p3 k7 L/ I; R/ V- l
            音频:<a href="sound://.*?"></a>3 z6 A9 I  Y6 g" h
    + Z4 @; W' |7 k' B" D, {
            注释行:<!--.*?-->% W' ?0 f* }* G
            
    ; i$ f  K( K% d) f( ~可能还有一些冗余的标签,视词典而定,比如我这里就有<span> </span>,直接全词匹配删掉即可。* N! R0 N0 i6 `1 B% ~, c
    4 z2 d+ p: |# m2 `
    我这里这样处理了一下之后,文件的体积直接下降了25%(约100MB --> 约75MB)。
      Y- B5 |# Y. X# T& G& V  w( f9 q8 N7 m. P. [4 c
    简单处理完之后,便是正式处理@LINK跳转了。TXT文件的格式只有这两种:单词 + Tab + 意项  或者 单词 + Tab + @@@LINK=另一个单词% v+ z7 ~3 r$ D5 u5 r% v
    ) l; V3 P4 |7 M! z# T
    这里我们主要要将跳转词后@@@LINK的跳转链接替换成目标词的意项,因为Kindle不支持@LINK跳转。为方便后续称呼的方便,我在此做个定义。以开头两个词条为例:8 V( \, q% b8 k  f4 i. G
    5 X) ^# N1 Q$ H5 }

    7 P3 v9 b* C. c
    3 ~/ ]1 P$ s/ F' Z: _. g; {0 ^% B
    : S6 l) {# t* f  \0 p
    但是这里也要分情况,因为如果一股脑全部将@LINK跳转都替换为目标词意项的话,看起来简单。但实际上会导致文件的体积无比巨大,因为里面存在着大量的像这样的跳转:! [4 W9 O* x6 {

    5 Y  z- Z6 P. _) @4 F; N4 v1 m) Z- Q6 e
    . j. B$ C& d4 Y

    ) y# [; V0 E6 O' n/ ?4 B$ z% a4 I& c4 t! ~
    仅仅是advocate这样一个词,就有七个变形词,它们的目标词都是一样的,如果只是粗暴的替换,那么最后生成的词典肯定无比庞大,甚至如果你内存低点最后都不够用来生成词典。(猜想而已,我没这么干过,有兴趣有空闲的朋友可以试试)
    + f! y: P. z/ ]6 i" z, Y/ d1 W4 N/ v. z
    因为Kindle词典支持为某个单词添加不同的变形词,利用这一特点,我们可以在此处判断,如果跳转词是目标词的一个简单变形,那就跳过该词条。判断的依据来源于dsl2mobi这个工具里面附带的英语单词变形词列表。文件名称:forms-EN.txt,内容如下:
    . ]0 h) O( g2 c+ v" j0 w
    8 Q4 T6 k8 g$ f( D. w  y
    & [7 y7 ]" b6 ?: m8 Z9 o4 n  i: [. |5 H
            / G5 o% n2 U5 J3 {# h; K
    ! [8 B$ O9 v- K* s
    简单总结一下,做了个程序流程图:
    ; ~0 c$ _( D3 ]" n
    3 G& r8 B2 z5 E* K" x# o' r# w# X& t7 x, L. F

    ' i! u4 {7 D: m0 w# l, i' z- _4 T+ h

    : o! g- A1 ~( J2 ~) k  x这是代码,你需要修改第3、4、5行的文件路径和第50、51行endswith方法和replace方法中的值改为你操作的字典的实际值。详细的内容请看注释。
    9 N5 c" j, a  ^1 Z9 A; _1 m0 D# G) A2 g* o( S) U
    9 L- n& k/ ~4 q

    % f8 v% b; U+ G  X
    + n9 c5 X9 C/ i0 p. P7 f1 m+ A0 {

    ( m" Q: ~- l& B
    ! S* V) @5 P; H& a% N* @0 y9 h4 e! t7 b% l
    注意:Fix_Redirections.py有一个同级文件夹wordforms,文件夹内有forms-EN.txt,请勿修改。
    1 M0 o, ^1 n' q9 T

    1 X; G6 ]" u( f, X) I3 N, [( u. @* j: k0 k
    修改完了然后执行代码,你看到的图应该是这样的:
    . x8 D* \+ ]/ h& v; {
    7 z, Q" ]& ~/ _1 n8 v5 G5 e- C, k. _9 Z$ i

    6 z9 }6 D. B+ _5 t5 i1 F( J5 ]7 ^
    ( H) C! d2 k, K/ T" V7 n9 s
    % `( c0 }6 i! }" I2 m: a% o- z这一过程的速度取决于你的电脑配置和词典的词头数,我跑这部AHD大概花了大半天的功夫。
    7 N; M( A- F3 L$ o$ o
    * t! j$ A$ t$ r跑完之后的文件可能存在很多空行(不一定,看词典),这里附上一个去空行的脚本,使用方法:
    : @7 F! O% z/ r9 T; m+ U/ @. @" C( u8 v: i4 }+ J$ Y
    : z% ^& l4 Z6 V% c9 P

    2 j  N  b8 @4 k, {# Q' [
    , }8 h. S, k* h6 R4 i, V# y+ S0 H1 l' ^  `# G4 o
    6 Z! Q; ^4 X' B/ ^

    . h) w2 A1 F) A执行完成后会在处理的文件目录下生成一个名字带_stripped的文件,这就是去除了空行的文件。. x& Z8 Q; f9 ~8 X. ^6 Y

    - v5 M/ Q$ B5 Y, C4 v
    ( s& f7 U% B9 w/ a, r: m7 S. ^+ K3 _3 h- ^; T' ?
    ( g, H: s2 w( |* j* l3 K' j8 c
    - ?. P2 {' d# k$ D4 X9 M+ A
    这时候可以打开文件看一看,应该是满屏紧凑,没有空行,没有@LINK跳转的,就像这样:
    : k* S7 K# w, y: U6 C- u0 a5 V; q$ A1 S, G5 _  Q# ^& \8 ^: p

    # X" M) M  C9 }+ \2 s0 L: b& B
    2 u5 ?. C( `5 k& x7 v" g" o2 u& t! `

    . R% {5 `. d% i8 @) v到了这里,就可以开始正式进行第三步了。这里用到的是tab2opf.py这个工具,该工具基于py2,所以要用py2来执行。从书伴直接下载的tab2opf虽然没问题,但是根据我的经验,把253行的print df给注释掉,速度会提升许多,而且出错的机率也会减少。除此之外,由于词典的不规范及其他特殊原因,我们上述生成的xxx_stripped.txt难免会有几个或十几个错误行(MDX词典本身的问题),因此,最好加一个异常处理的块,遇到错误行直接提示一下就跳过,免得程序中止运行,你们可以参照下图修改,注意红色箭头的地方。& f; S0 g! w, E6 \9 b: r- Y7 c

    7 l, {9 |$ Q% @2 c3 Y$ |' P( m3 z" f  z: d  L! D% Z. x2 G) E* n

    + G2 k* u3 p9 O  ^9 g7 ]
    " ^0 L3 W7 Z0 P' v' d5 E
    - t0 ?+ O6 {8 X$ V% G然后执行命令:python2 tab2opf.py -utf xxx_stripped.txt% X* j2 Z9 A5 V3 p- H& P

    0 M) b3 X7 K1 r# o执行完毕后会生成一个opf文件和一堆html文件,如下图所示:+ [7 J, X& i7 w
    + J: x; j! z; v5 J( T. r

    % m+ ?% o# q4 |! U0 k) Z
    9 g. q, f4 @9 H- v7 J* g  F- E6 O# i1 F. W, s& d  p4 k+ Y0 [8 r( \* F* J/ H

    ( R2 c! U! y& V! Z1 J5 C在进行下一步之前,我们还得写好CSS,我的电脑配置不行,打开太大的HTML文件很卡很卡,因此我提取一些意项较多的词条来单独修改建议"go", "take", "in", "the"等,这里我提取“go”词条,复制"go"词条所在的一整块<idx:entry> </idx:entry>,然后加上头和尾(头尾可在任意一个html文件中复制即可),保存为html即可。如图所示:
    9 I3 O" P4 R/ p0 T) m7 H: V
    2 a2 N- {/ e; z
    * N# e$ J* R9 g: D* r
    / S8 f9 f% H% i$ x( y9 a+ ~, M! v3 ]. N  ~* I% c/ ]3 N

    5 \: R; t, A: ~/ p& v% I因为我们要测试css,所以再添加一个head标签并在其中用link标签引用一个css文件,然后就可以写css了。
    & d/ \2 Y. O. X9 z
    # R7 v, R( U/ N* B5 I9 Q( H0 w: ?: Q3 {$ c2 b
    7 [! {0 T0 _$ R! q+ d  g1 o4 x% @

    0 B1 ]2 c2 P! l& E: Y
    7 ~- ~1 J* q2 s: \MOBI的字典只能生成v7版本,该版本对CSS的支持极其有限,margin只支持left其他方向都不支持,即使是看起来有效的margin-left,也不过是在转化过程中替换为blockquote而已。所以只考虑粗体、斜体、下划线和颜色即可,当然不管这里用什么颜色,Kindle上都是浅灰色。
    . k! B$ U) d! V$ X  c" u' T6 y! }! v& J& N8 u; \3 ?1 l
    这是我修改完毕后的效果。% E+ ~& J1 x) `6 m+ Q, y

    ( b; K8 c  \# h
    0 M0 V+ \3 w. n9 q2 X6 w) E( D* a) {

    6 r7 b; E0 d* ^$ ~5 R. Y' ^0 f! ^, a2 k9 A* c
    css满意后,那就可以给所有的html文件批量添加link引用了,这里notepad++可以单独完成,就不写脚本了。方法如下:
    * O( F( [7 T9 q9 p# [. `; U
    8 z$ H: y6 G- _+ }  l, l打开任意一个html,Ctrl + F,然后切换到文件查找选项卡,下面注意选择正则表达式,如图所示:
    / u; M- {6 K' D/ {9 _! E9 Z+ B  C
    6 V; `# u" h0 C. c. q2 \; `/ X& ^# l1 j, a) B) C8 E
    : V8 p" F1 z' N. ~: N
    4 d( f. Z8 y  n: ?
    5 B% P( @3 s  B9 f4 v( }

    - B( v  f/ I2 G  k. m( h, d查找目标: (<html.*?>)9 u% ^7 Q# |3 a  z% N; A7 Y
    & @9 ?# J' i$ j+ H, g) _8 t
    替换为:\1<head><link rel="stylesheet" type="text/css" href="test.css" /></head>* a: w, ]* {* o0 a" E  N2 _
      G, }0 l) J1 y( p6 X4 _( }7 s: j
    文件类型:*.html2 Q1 S0 n) j, d% D1 f

    ! f( ~: O: ~% L& z1 ~目录:即html文件所在的目录/ Q, J. a( J: R  j

    6 }. Z+ ~5 b. B" @! x
    ( v4 c4 q: V# K+ c+ N0 X5 U5 J7 C
    , U0 |7 `- W& m8 o9 W
    然后点击文件中替换即可,这样,所有HTML都添加了CSS引用了。
    8 `; E' {6 T' ]0 I' q3 e. {& N. |$ _7 L% C- r
    现在到了另一个重要时刻了:为即将生成的Kindle词典添加变形词,原理就是检测forms-en.txt里面的单词然后提取出变形词添加进去,上面说过了,此处不再赘言。1 l* r+ r& l2 u* o% j4 P

    , n$ q. ?0 L, S+ s& H代码很长,不贴了。用法很简单:Add_Infl.py html文件所在的目录
    $ [5 ?- s. s( ~( z. n7 g3 U$ j( O$ s2 l
    # V0 ~: R  j5 W: p

    ! i' z% x; o) @4 e- T' [2 x$ Z: t1 ~! r! V& |6 ~

    & N% K# t" X3 f文件在此,解压后其他文件和文件夹勿动,以免程序不能正常运行。/ W' ~  p. `8 R5 l2 Q! X2 S4 b
    # w! ]7 t' R" S+ q* D7 y" r& t

    8 I  Y# }6 Y/ X9 @
    . H5 |$ j! M  s5 I然后会在目录下生成一个名为OK的新目录,新的HTML文件即在此。
    . G' b* G5 P" K3 Q8 K: w: ]; I
    ; X9 k1 ]; j( u& p最后就是把之前的opf和css复制进去,然后用mobigen.exe生成即可,mobigen.exe -unicode xxxx.opf
    " W4 H0 r6 ]$ F8 p& V6 U
    ! ]% o" t- X" x! \0 ~' R如果你想修改生成后的词典名称,打开opf,修改这一行即可( G, q- a% S; ~: h

    4 a  G- b9 Y$ g" U2 k# G, L
    , I% z& j4 O1 y2 C/ }  U4 y* r; D$ Z5 t# i; c

    3 O4 U# G3 N# o; A# n  G6 Y, i
    $ K) r7 E' V. P- y完。
    3 Y1 w& R$ i9 B( N9 c) O; J) z4 b) ]& n+ k0 Y. j2 m
    三、结束
    + j+ z. B1 y+ a$ G: ~- _, h! E7 u  p1 N- E/ T
    第一次写这种教程帖,步骤、截图等等都很繁琐,几次我都差点晕了。简单看了几遍,算不上流畅但也不至于晦涩。若诸位有什么问题或发现什么错误也可以在下面回复,希望能有更多优秀的Kindle词典出现。& B. |/ p/ I5 T$ G+ ?; l

      G. p- S+ t2 ?3 d2 y5 w+ [9 c另外:关于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-26 23:07 , Processed in 0.069395 second(s), 10 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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