掌上百科 - PDAWIKI

 找回密码
 免费注册
查看: 1337|回复: 6

[教程] Python辅助MDX转MOBI(以AHD5th为例)

[复制链接]
  • TA的每日心情

    2021-3-31 09:15
  • 签到天数: 520 天

    [LV.9]以坛为家II

    发表于 2019-9-30 10:32:44 | 显示全部楼层 |阅读模式
    本帖最后由 nullname 于 2019-9-30 10:39 编辑
    " x( c% t2 A! G$ e. ~
    ' d) y- K, y% w  X. }( e$ ]一、前言. _, \% y/ S, @5 X" f
    . l+ I* O  l. b* b) `: f
    本篇文章的所有部分均来源于书伴的《如何把 MDX 格式词典转换成 Kindle 字典》 ,只是仅通过该教程的方法所转出来的词典基本没法用,原因是Kindle不支持@LINK跳转、不需要音频、以及需要添加Kindle支持的变形词搜索功能。经过几天的摸索,逐渐有了点头绪,并制作了AHD5th,试用两天后觉得尚可。便于昨天发布。帖子见此:[Kindle词典]美国传统词典American Heritage Dictionary 5th(精制版)! i$ S- u% [; l7 b- F
    ' F$ }7 M" s9 Y% ?  q
    本文章展示如何通过Python来最大限度的优化以生成体验较好的Kindle MOBI词典,为各位提供一种思路,以期众人群策群力,制作出更多好用的Kindle词典。, I) d1 e" ^4 [8 J' q4 O5 y/ B
    % R5 X* N: d" o6 T9 P
    为了文章的连续性和完整性,对于完全相同的部分将全文引用这篇文章《如何把 MDX 格式词典转换成 Kindle 字典》 的内容。
    % b. g2 @9 q% j$ A2 X
    : ^. I+ n: I5 A. N6 O+ q7 I* F  W" {: S# M1 G7 [9 a
    二、正文        
    . i, l5 P+ v) A9 ~8 E$ \: E3 r$ y4 F- W
    书伴的这篇教程共有四步,还用到了一些工具。工具请自行下载,因下面所用的代码是Python 3的,所以除了Python 2 ,Python 3 也需要安装。第一步和第二步是一样的,不赘言,仅截一张图于此。
    8 C& {! n1 a# L8 V% v6 l
    4 \4 p' q) b9 x) v7 n3 I2 k- H
    ; x. C7 Y1 h5 ~! B% e$ P3 ~- y! n& c& L9 ~5 \$ J# \1 W" Q

    ' c5 m* l4 E; ]3 C
    ' i- j7 |3 s" i# H工具准备好后,选择你想转制的MDX词典(本文只针对英文词典,即英英/英汉),下面以论坛里的American Heritage Dictionary 5th [IPA]为例。
    $ Z. E, e# g3 p! J. S3 s+ ]" L5 j; a' ]1 Z- n
    0 f( `" g2 @$ R) k* c$ s: Q' H
    经过第一步和第二步的处理,我们会得到一个体积较大(视MDX而定)的TXT文件。其内容格式应该是这样的:
    : u6 w9 }- m$ A; [2 ^1 A  q4 x/ @" B; X; E
    : G6 b# w- P' O

    0 z9 d2 _# @& ^  h' I3 e, v/ z$ X  p7 R4 Y

    " ^6 b# ~7 J) o1 M8 }, A( l得到该TXT文件后,我们可以选择几行看一下或者搜索一下如".jpg", "<img", ".wav",="" ".mp3"之类的关键词,把图片和音频等等鸡肋全部删掉。同时,这类CSS引用也可以删掉,以减少文件体积,提高后续处理的速度。CSS引用可以在最后一步添加。比如随便看一下,扫一下就有这些:
    + l# H' i- e, L9 C7 J  Y% r4 d" w: \+ N0 n, V: o4 ?5 m7 q
    ( j6 n# J7 Y9 w7 k( |
    1 U' G, f5 X2 G, V- L! ~8 r1 U

    # u& W, r, p, d0 c
    7 v% k1 j& W4 R# d. F' X' g2 ~我用的是Notepad++,以下是我用来替换的正则表达式:
    ) o1 k' e) W( E* U5 U! f  ?; K9 p5 m  ^  ?, r8 p8 y
            图片:<img.*?>( K2 l1 q4 y7 r+ @
            $ j2 ?7 Z6 L6 e9 t
            音频:<a href="sound://.*?"></a>: r/ o4 s% z' K7 A) b! N4 C
    ! W, N% _1 C$ k, e
            注释行:<!--.*?-->
    ) i1 z& c: x; b3 g% j" C5 m* N8 a+ l9 K        
    , h- [! E/ ?; b9 I可能还有一些冗余的标签,视词典而定,比如我这里就有<span> </span>,直接全词匹配删掉即可。
    / P: K- l8 c6 e" e9 m8 j. O2 U3 M
    我这里这样处理了一下之后,文件的体积直接下降了25%(约100MB --> 约75MB)。7 O3 Z' Q% R8 N( k6 ^& @, I

    3 r: M1 u3 q& g/ x; f简单处理完之后,便是正式处理@LINK跳转了。TXT文件的格式只有这两种:单词 + Tab + 意项  或者 单词 + Tab + @@@LINK=另一个单词
    & p: S9 Q1 x/ t" ]1 N$ d) e' O% L4 I4 I; f
    这里我们主要要将跳转词后@@@LINK的跳转链接替换成目标词的意项,因为Kindle不支持@LINK跳转。为方便后续称呼的方便,我在此做个定义。以开头两个词条为例:' x: J8 ^3 J3 H: U( u6 n

    1 p7 T* m3 N; I* r9 U
    # h7 e2 g* y1 c( f  F2 _  G/ [7 v, f8 J/ w: N  y
    : ~' \& @! g9 c7 x8 J
    # `' G* j  U" [7 F0 S2 X: q1 I
    但是这里也要分情况,因为如果一股脑全部将@LINK跳转都替换为目标词意项的话,看起来简单。但实际上会导致文件的体积无比巨大,因为里面存在着大量的像这样的跳转:: v. U/ R6 d2 c$ v1 S& i( _3 x7 g
    , }% C, m8 v; G: @2 h8 f6 p
    # u- ]. C$ n! H3 n$ \. s# b
    $ U3 o: b. |+ W& p8 H
    , c- i0 y6 a3 _, l2 o( }! }

    " q0 j" n: u: i, o3 P2 \/ B+ U: y/ p仅仅是advocate这样一个词,就有七个变形词,它们的目标词都是一样的,如果只是粗暴的替换,那么最后生成的词典肯定无比庞大,甚至如果你内存低点最后都不够用来生成词典。(猜想而已,我没这么干过,有兴趣有空闲的朋友可以试试)
    # J' q- ^- h& d
    1 P" a3 E8 Z- G* F9 J. `* A' h因为Kindle词典支持为某个单词添加不同的变形词,利用这一特点,我们可以在此处判断,如果跳转词是目标词的一个简单变形,那就跳过该词条。判断的依据来源于dsl2mobi这个工具里面附带的英语单词变形词列表。文件名称:forms-EN.txt,内容如下:' x, d# i" H  Q  Y6 Q3 N( a
      U6 W7 k+ ]  L  Q
    2 o& i$ ?/ ]; T4 a, C
    . e; `8 \$ @' Y2 V( i
            9 w7 w; V/ |; K0 H
    4 Y& `# r" P; i( N% W6 L( n
    简单总结一下,做了个程序流程图:4 |7 y; F4 g( P; q; O: h9 A
    1 n  g) k, r" T$ b0 q# S& [
    ' ]5 h6 ?' f3 y' \/ r% P
    3 @0 @# T, {. v9 M7 K7 D/ o
    6 d, d" b& ?, w! S) D
    9 I  c" [# y+ g. y& D. o  Q
    这是代码,你需要修改第3、4、5行的文件路径和第50、51行endswith方法和replace方法中的值改为你操作的字典的实际值。详细的内容请看注释。
    5 M& o! C1 {7 V# \3 t# C1 ~. U7 ?8 ]# X( o; A
    5 p) V0 o+ |5 S: u: ^- I& |
    1 ]% G# J3 T$ g6 g$ v3 V( o8 Q

    ' n) I$ Q" m, ~0 [0 x  F: B( x/ g: E5 a+ i5 @- Y! M, N; K

    ( q5 H' B* M  C' d4 P; A# V1 S7 J
    . U! q" c3 r. C. g* t  Q% C: f
    6 I% C$ B( m5 F* R9 S: h注意:Fix_Redirections.py有一个同级文件夹wordforms,文件夹内有forms-EN.txt,请勿修改。
    ! r* ~3 A7 r" O! y
    % @& f* q0 t" [  |" F1 Q
    ! N6 u: z' v7 C4 m# _( W3 T' R
    修改完了然后执行代码,你看到的图应该是这样的:
    $ C1 C8 u8 @; @) v4 q/ p" I
    ' e* Z1 O1 \% Q" G' {' O: }6 e  T4 b
    9 y7 v% {0 a; X

    & l2 m+ ~" x9 Q- E8 i3 j/ O% n4 R* m2 D: c% J1 b5 g! o) a
    这一过程的速度取决于你的电脑配置和词典的词头数,我跑这部AHD大概花了大半天的功夫。
    6 d8 ^5 S7 V' |. l: O; D4 y
    3 A# Y2 {# X5 L. t  a1 n跑完之后的文件可能存在很多空行(不一定,看词典),这里附上一个去空行的脚本,使用方法:. O' U4 m. e) M/ M( W9 ?: t

    ( Q, B1 v5 }. c% y2 y2 G% m/ o
      z& k! U, k8 x2 p, N, s- X# v
    & S; v. O8 }3 f; W' I- B5 l- p
    ; Y% Z% [4 S2 g" g) l
    / H$ f2 \6 R. E; P; w/ z# z! S0 t2 D: n, ^7 f+ t1 r. {* O4 J

    5 G5 H9 K  u: T7 K: h' o1 d执行完成后会在处理的文件目录下生成一个名字带_stripped的文件,这就是去除了空行的文件。6 ]" T2 V* X& J$ f3 A
      E2 u. a& P( g& @

    4 s* z' {+ h# I- q' S* \% i
    ) E3 i* F) C' C3 O6 U
    - h5 k# ]! Q, B* z4 f+ z! g9 R' y: O/ D  c2 m
    这时候可以打开文件看一看,应该是满屏紧凑,没有空行,没有@LINK跳转的,就像这样:# o& I! M" p/ m/ n2 U4 j* ~9 o
    # I9 @0 ^6 T  K% _- j# s# A- S

    1 Z# b$ g; ]+ j" g9 p& x3 ?1 l
    # s; f- ]" W+ o' R  [$ S
    / X" W  ?5 G  O% @' c5 j) w: _: G, c3 A6 |9 u. s5 b* V3 |* Q" K
    到了这里,就可以开始正式进行第三步了。这里用到的是tab2opf.py这个工具,该工具基于py2,所以要用py2来执行。从书伴直接下载的tab2opf虽然没问题,但是根据我的经验,把253行的print df给注释掉,速度会提升许多,而且出错的机率也会减少。除此之外,由于词典的不规范及其他特殊原因,我们上述生成的xxx_stripped.txt难免会有几个或十几个错误行(MDX词典本身的问题),因此,最好加一个异常处理的块,遇到错误行直接提示一下就跳过,免得程序中止运行,你们可以参照下图修改,注意红色箭头的地方。
    * }8 }4 c: c+ s" v6 u* j, F
    4 C: q. q! A* p
    " }, ?6 P7 F7 Q3 ~5 `- Y5 j& B& Z6 ?1 h' Q) e7 u
    6 W# S. s( O% `+ w& f4 Q: ~

    & t7 d* j6 i$ @2 Z5 X; w然后执行命令:python2 tab2opf.py -utf xxx_stripped.txt' i/ d" I, H9 [! Z$ V3 J$ G- f
    # \0 U  C/ p+ X! }$ {
    执行完毕后会生成一个opf文件和一堆html文件,如下图所示:
    ! J2 d8 D6 e* W/ ^$ @- U' X" J7 [* S' I( `3 P0 ~$ ~  A  v5 W
    4 v- R! t+ ^2 `0 T. L3 G8 _

    + q% j; q2 x$ y# o7 p! g- A' f, U% w3 q+ r6 d

    8 h: `+ }7 d* y- |: e6 n在进行下一步之前,我们还得写好CSS,我的电脑配置不行,打开太大的HTML文件很卡很卡,因此我提取一些意项较多的词条来单独修改建议"go", "take", "in", "the"等,这里我提取“go”词条,复制"go"词条所在的一整块<idx:entry> </idx:entry>,然后加上头和尾(头尾可在任意一个html文件中复制即可),保存为html即可。如图所示:8 f/ g2 o" V, h3 {
    " e9 Z$ p& o% P; ~& N. I' R
    2 J9 O& `# n3 y9 T; K

    2 T3 b5 y# m5 r( q( J7 [. P% x; ]
    4 w# }" i  f# ?$ [4 S% c8 G6 L+ x: I& d  y3 o, }, d
    因为我们要测试css,所以再添加一个head标签并在其中用link标签引用一个css文件,然后就可以写css了。5 j" [" L; H# t8 T

    + q' N3 Z! ~9 l8 r: R. c; }
    ) {+ S$ F5 g+ d+ l6 Z% J- a- V
    ' U3 N. D2 |' ~2 t
    " W5 S6 F3 a$ G: T( k  [  E1 N) m8 x% q' M
    MOBI的字典只能生成v7版本,该版本对CSS的支持极其有限,margin只支持left其他方向都不支持,即使是看起来有效的margin-left,也不过是在转化过程中替换为blockquote而已。所以只考虑粗体、斜体、下划线和颜色即可,当然不管这里用什么颜色,Kindle上都是浅灰色。1 ^0 l( q  K: l2 N8 `

    9 }0 P. U, ~, k这是我修改完毕后的效果。
    1 _) ]' w+ `6 B7 h9 F' Z. {8 I0 {1 L8 c% B% D
    & K2 k  u: ~# B- p- t
    ) D4 p  n2 m! `. M+ i3 b

    . p; n  F3 S5 M% B0 f2 h3 c% E6 S/ x9 m1 z
    css满意后,那就可以给所有的html文件批量添加link引用了,这里notepad++可以单独完成,就不写脚本了。方法如下:
    7 i( G- M: g0 P/ c
      O8 v: O1 B! t+ a+ R" R打开任意一个html,Ctrl + F,然后切换到文件查找选项卡,下面注意选择正则表达式,如图所示:9 m! w8 }8 N7 R1 d( T  E  M! G

    9 y9 e- q) }& f
    2 o2 C- q; v6 q) _* H
    " c- T/ j* _- W( Q* {
    ' b7 W" x. m3 d% P( y, Z4 j
    6 G2 f& t0 s# K$ ]; @: D" _' Q( y2 L# f: E+ H
    查找目标: (<html.*?>)3 U. W3 Z4 [8 z5 |' I) ~& n( R

    0 t& L( }& v4 z( B( Y) p: A替换为:\1<head><link rel="stylesheet" type="text/css" href="test.css" /></head>8 `/ }/ |6 s9 U# @# m; i

    0 g; ^0 O- H# ]+ ~; L文件类型:*.html2 }* S7 Y, k5 F: i" \- c% r
    : E! W: f" O3 E# o
    目录:即html文件所在的目录1 z* C' h/ H) i- P  N0 i

    6 e$ y/ z. M: j0 u& Q) V
    ' O, M+ }; X# m# e4 e+ _3 `3 }
    8 b$ X2 Q' J6 ^+ A
    然后点击文件中替换即可,这样,所有HTML都添加了CSS引用了。# p. @4 \) Q% |$ J/ w
    5 f% R0 g( m" W
    现在到了另一个重要时刻了:为即将生成的Kindle词典添加变形词,原理就是检测forms-en.txt里面的单词然后提取出变形词添加进去,上面说过了,此处不再赘言。0 V4 v8 Y  k/ ~# a$ E

    * a3 i2 S8 H0 m; p' o# ?代码很长,不贴了。用法很简单:Add_Infl.py html文件所在的目录# K! Y6 B& \3 M( E# Z
    + Y4 E! ]0 o: h
    1 @0 K* i/ E) q
    . W: V. B0 Q7 o; k+ a
    & _; M% ~3 A, Q; l! m6 i
    ! ?6 ^- O6 c  m+ p( y+ m% ~$ w
    文件在此,解压后其他文件和文件夹勿动,以免程序不能正常运行。+ U8 w' e: a! }
    * H6 X& l# U. r4 F+ T+ E3 E7 |
    & c8 r. X( Q' f( Z

    # E+ l/ q" x; i+ j# E  @5 {然后会在目录下生成一个名为OK的新目录,新的HTML文件即在此。* ~- T4 H$ a" r0 Y" X/ _3 a7 v

    & j$ k3 h5 G6 g, M最后就是把之前的opf和css复制进去,然后用mobigen.exe生成即可,mobigen.exe -unicode xxxx.opf
    7 w3 U! R' r1 v2 Z% {' I- u: l# O
    如果你想修改生成后的词典名称,打开opf,修改这一行即可
      `# Q* T" F8 J; h5 J  v5 \
    : y0 j5 [7 P& s% u8 ^8 [. `$ m% O; _# S* e$ V2 V% k

    + c  k2 \8 \1 O
    3 X. X  L  l: p5 i" z8 n8 j) M: M; z1 T$ @# {+ d# g, R" K
    完。
    ' Q# ]( v, b' s! X, k+ ^  r: e3 G* J5 t+ V3 {" V
    三、结束
    , u) y' B- d; o; h7 C
    : L9 U( d8 ?/ w. v第一次写这种教程帖,步骤、截图等等都很繁琐,几次我都差点晕了。简单看了几遍,算不上流畅但也不至于晦涩。若诸位有什么问题或发现什么错误也可以在下面回复,希望能有更多优秀的Kindle词典出现。
    3 v0 d  ]  N$ \* _) L% m$ x) a+ K/ ?9 k6 ?. X7 m/ H
    另外:关于Kindle上的汉语词典,我发现kindle支持将繁体作为简体的变形词,意味着若处理得当,那就直接为简体词头添加繁体的变形就够了,不必再另添词条,词典体积将大大减少。各位有兴趣可以试试。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?免费注册

    x

    评分

    9

    查看全部评分

    本帖被以下淘专辑推荐:

    该用户从未签到

    发表于 2019-9-30 11:03:05 | 显示全部楼层
    这种技术贴,要好好给楼主点赞
  • TA的每日心情
    奋斗
    2021-3-15 08:06
  • 签到天数: 585 天

    [LV.9]以坛为家II

    发表于 2019-9-30 11:09:32 | 显示全部楼层
    技术文章,不错。
  • TA的每日心情
    擦汗
    3 小时前
  • 签到天数: 640 天

    [LV.9]以坛为家II

    发表于 2019-9-30 12:56:27 | 显示全部楼层
    给技术型楼主,点赞。
  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 595 天

    [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的每日心情
    奋斗
    6 小时前
  • 签到天数: 410 天

    [LV.9]以坛为家II

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

    本版积分规则

    顶部qrcode底部
    关注掌上百科官方微信公众号送积分
    关注掌上百科官方微信公众号
    关注微信公众号 pdawiki,获取邀请码,看文抢积分,抽奖得浮云! Follow our Wechat official account "pdawiki", get invitation codes, and play the lottery to earn points (积分)!

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

    GMT+8, 2021-5-11 12:57 , Processed in 0.394046 second(s), 14 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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