掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 3936|回复: 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 编辑
    4 P" \; T1 c5 k6 e0 o* u9 |! j
    3 U2 S; ]3 t9 V/ l1 A9 R一、前言3 s7 I( e0 K3 r: l/ ~) G$ [

    $ R4 x; a2 \: j7 _6 B+ v本篇文章的所有部分均来源于书伴的《如何把 MDX 格式词典转换成 Kindle 字典》 ,只是仅通过该教程的方法所转出来的词典基本没法用,原因是Kindle不支持@LINK跳转、不需要音频、以及需要添加Kindle支持的变形词搜索功能。经过几天的摸索,逐渐有了点头绪,并制作了AHD5th,试用两天后觉得尚可。便于昨天发布。帖子见此:[Kindle词典]美国传统词典American Heritage Dictionary 5th(精制版)5 |* Q6 x( d$ y$ i9 J# w2 Q

    6 b( J5 K# H/ d2 s  a# N本文章展示如何通过Python来最大限度的优化以生成体验较好的Kindle MOBI词典,为各位提供一种思路,以期众人群策群力,制作出更多好用的Kindle词典。
    ' Y! i4 M& G. \# `' d) Q% }; v/ D  W
    8 k+ v5 }6 o, N为了文章的连续性和完整性,对于完全相同的部分将全文引用这篇文章《如何把 MDX 格式词典转换成 Kindle 字典》 的内容。
    4 y) P/ l8 C( J. r1 m/ G; B5 P8 e
    5 s2 e' i: Y" x0 o1 u1 Z  F9 `4 M
    ! d" U) Z' Y& Q7 v. \) _& a8 q8 t二、正文        
    " d  g5 ^3 Y9 q: o5 T/ `
    : R: x$ L+ l) [4 N$ j书伴的这篇教程共有四步,还用到了一些工具。工具请自行下载,因下面所用的代码是Python 3的,所以除了Python 2 ,Python 3 也需要安装。第一步和第二步是一样的,不赘言,仅截一张图于此。
    * h1 ]) A  j+ c/ R' {
    ; \& [% t- j8 X* J# ~4 O8 D
    ! F) U; k' Y! a+ V+ Q: e5 S" S3 H6 A8 y: |2 T! _, h$ \0 L4 a

    / z9 w# k+ x' g' L- G: j) G0 w% w/ I. Q) w; f4 m; u
    工具准备好后,选择你想转制的MDX词典(本文只针对英文词典,即英英/英汉),下面以论坛里的American Heritage Dictionary 5th [IPA]为例。
    1 f+ _% [2 h9 |4 w1 _) j
    * h# Y/ S# }  c) {# K% q
    8 K, D% r: U& K! s4 F# d1 J. M经过第一步和第二步的处理,我们会得到一个体积较大(视MDX而定)的TXT文件。其内容格式应该是这样的:+ g/ \7 Y, }* P' @0 `* e) a
    3 ]  J) y/ T, e- q- ^3 c. [

    / S3 N5 x+ `! B6 Q7 P$ V1 p- P+ n$ y- l. e6 V5 A2 Z8 |, R9 [8 D
    . J; N# N; `5 J) @& Z; p* o
    8 _! G" }( s8 j* S
    得到该TXT文件后,我们可以选择几行看一下或者搜索一下如".jpg", "<img", ".wav",="" ".mp3"之类的关键词,把图片和音频等等鸡肋全部删掉。同时,这类CSS引用也可以删掉,以减少文件体积,提高后续处理的速度。CSS引用可以在最后一步添加。比如随便看一下,扫一下就有这些:0 _6 a$ u' z: B
    0 P, Y+ l3 D) [+ _& ?* H( o( U8 J

    $ B/ o" F" c" L: j5 A
    9 i7 ^$ g2 x3 O0 M
    5 H1 K& r: ]% @3 Q) s" h! s, Q. u/ L# R. A* }
    我用的是Notepad++,以下是我用来替换的正则表达式:% J( G8 |4 ^8 }: Q& d7 M

    2 A- [9 @: k1 O* F- h3 h1 x+ B        图片:<img.*?>
    ' T5 G0 }( R8 {% }8 L2 z. E2 Y        & f: ?" ~2 c1 n& T0 B4 J. p: y6 }
            音频:<a href="sound://.*?"></a>
    1 i5 q! r  I5 Z: v  @" B1 R
    1 X3 T3 j. N9 Q2 `% \        注释行:<!--.*?-->
    3 A8 _' @8 T  n2 L, B( O) r6 A! H; p0 M# U$ c        
    - [7 [& H5 s4 o) G可能还有一些冗余的标签,视词典而定,比如我这里就有<span> </span>,直接全词匹配删掉即可。% N: [5 K9 g# \  f* }  z
    " ]7 Z' y4 }! |; c- h
    我这里这样处理了一下之后,文件的体积直接下降了25%(约100MB --> 约75MB)。
    ! G2 {: H( }% l2 i" W/ ^/ h# y# ^- I6 O- i. l$ @2 Y" K8 x
    简单处理完之后,便是正式处理@LINK跳转了。TXT文件的格式只有这两种:单词 + Tab + 意项  或者 单词 + Tab + @@@LINK=另一个单词0 u2 h: `- M3 g8 C

    6 I; Z: B& ?. g! N$ o这里我们主要要将跳转词后@@@LINK的跳转链接替换成目标词的意项,因为Kindle不支持@LINK跳转。为方便后续称呼的方便,我在此做个定义。以开头两个词条为例:
      V6 R. \, o: _) O4 {; y9 A2 P4 p; w  `4 y

    / z4 \+ P( F& A' ~# E' p# \6 D( k
    & q! ^! L: B" x" C3 v% l- C
    2 j2 @: \5 W$ y; P7 ]/ l8 \. B
    但是这里也要分情况,因为如果一股脑全部将@LINK跳转都替换为目标词意项的话,看起来简单。但实际上会导致文件的体积无比巨大,因为里面存在着大量的像这样的跳转:
    " d, p- g& X3 w. w6 E! T- {$ x; x
    ) z' t' R) M3 r( d  Y# u. M, o/ V
    ! B7 k3 h2 d; w0 v5 P# a! x
    ( y# e6 I, Q1 W4 w* H- ^

    : J8 u7 z  X. |* [" J" M( s仅仅是advocate这样一个词,就有七个变形词,它们的目标词都是一样的,如果只是粗暴的替换,那么最后生成的词典肯定无比庞大,甚至如果你内存低点最后都不够用来生成词典。(猜想而已,我没这么干过,有兴趣有空闲的朋友可以试试)
    4 G& B; E/ q. l! s2 F! u
    8 i2 d8 N6 q/ v3 O$ i! z' Z因为Kindle词典支持为某个单词添加不同的变形词,利用这一特点,我们可以在此处判断,如果跳转词是目标词的一个简单变形,那就跳过该词条。判断的依据来源于dsl2mobi这个工具里面附带的英语单词变形词列表。文件名称:forms-EN.txt,内容如下:
    , q3 i% t& o) W( q
    6 `- A' a5 {6 s* B( O' \
    2 y. Q- t/ {+ V3 K" {0 ~7 U
    5 G* b7 y' }8 H$ _6 @; n$ F        9 s2 X! W, T' f* Z3 C  N* z6 g
    " N& t' _- N4 \+ a4 `
    简单总结一下,做了个程序流程图:
    ! c5 s6 O3 n1 G5 F7 G* n7 ~3 N2 ~! z$ [* r, ~5 [
    # U8 f+ B; ^# V6 O) C2 {
    + J, _" ]5 b! x  `3 `' X

    * a+ ]8 b+ ]- t+ \1 a$ e, ?7 M/ q0 u0 v9 {2 Q/ W6 \$ _0 n( L
    这是代码,你需要修改第3、4、5行的文件路径和第50、51行endswith方法和replace方法中的值改为你操作的字典的实际值。详细的内容请看注释。. }' W5 F3 d3 W; x

    5 ^$ S' K( C* I5 a% V: D. Q
    " o$ l- ?  p8 Z$ F& k
    + V; \9 f- O& s  N/ F$ P
    / o( y5 D( H, y3 W+ r* l/ ~
    % ^0 K. u" ?( T6 ^) }6 Y
    + m, ?; e7 Y- f* u
    ( N" s' R0 j  H: C+ G
    8 c1 J- x6 _3 U6 S! i/ T) p注意:Fix_Redirections.py有一个同级文件夹wordforms,文件夹内有forms-EN.txt,请勿修改。
    1 d) T5 f3 I, H6 q. U

    + b( h% g  H, y1 v) j$ n/ F
    1 ~' ]7 t* u8 U$ J" ~) S修改完了然后执行代码,你看到的图应该是这样的:4 i/ u4 T/ m# [) n

    ' L' K- k/ F8 C  x# F7 ?
    / _- h: O) f* r; R% ?. @3 F' D  X) T- M2 h, B

      ~& X; T$ H- E: b2 ^8 @6 s& e4 A. ]6 Z2 v8 j( y. M3 d( `1 B
    这一过程的速度取决于你的电脑配置和词典的词头数,我跑这部AHD大概花了大半天的功夫。# v3 ~% d9 j7 ]5 `7 |

    6 h6 H. w7 o1 Q2 m& z跑完之后的文件可能存在很多空行(不一定,看词典),这里附上一个去空行的脚本,使用方法:3 K1 d6 ^7 V9 W* _9 r

    ( T: x$ D2 R' i( @* R8 L! E! r
    / \- C" h( q& Q9 G+ p- l# s/ @  P( v% z+ ]* Q8 m8 @$ X4 q# P+ I

    : m8 ^6 H/ |4 _- t& r
    6 {, S6 j% E* H9 |" h. `9 i4 n- O0 m# Q1 A
    ' m2 f# ~6 r; I$ Q' X, m
    执行完成后会在处理的文件目录下生成一个名字带_stripped的文件,这就是去除了空行的文件。
    - p* Q/ W+ P$ M  G2 o+ Z5 ]. y4 Y# y
    5 }$ h6 E9 Z2 {, l  i/ W8 n# [  n, a2 i* r! {" L6 m/ x  S+ T& H& t

    * ~- |3 _( ]" C
    ) C; U6 G! t$ J$ ~. d* g$ a
    6 `% c# w7 X/ V这时候可以打开文件看一看,应该是满屏紧凑,没有空行,没有@LINK跳转的,就像这样:
    # p: V# Y; B8 o( k( v4 x
    4 l, m" K! `- j
    5 s& L7 [" T, G1 B" G3 R4 p# t& s' e: s. U

    2 q" z4 ~* K  P# r# Z0 F% y, c  o/ r1 K& C" t4 H( W
    到了这里,就可以开始正式进行第三步了。这里用到的是tab2opf.py这个工具,该工具基于py2,所以要用py2来执行。从书伴直接下载的tab2opf虽然没问题,但是根据我的经验,把253行的print df给注释掉,速度会提升许多,而且出错的机率也会减少。除此之外,由于词典的不规范及其他特殊原因,我们上述生成的xxx_stripped.txt难免会有几个或十几个错误行(MDX词典本身的问题),因此,最好加一个异常处理的块,遇到错误行直接提示一下就跳过,免得程序中止运行,你们可以参照下图修改,注意红色箭头的地方。( O1 K; y9 z8 ^5 m7 Z

    $ @" b' E# }  i( _1 t# E6 b- t0 F; F. ?% m( _

    / W6 X. E6 j$ k$ T6 E& c. @
    " c4 ]8 [7 r1 l8 w( z' r: g
    2 d4 j  S2 b! I7 \9 {' w$ h然后执行命令:python2 tab2opf.py -utf xxx_stripped.txt# b" e6 W7 ^. F- |+ b
    8 ?1 [% W/ _; S9 d4 p! ^3 f) L
    执行完毕后会生成一个opf文件和一堆html文件,如下图所示:
    5 r! S! ^8 p$ _
    , X2 S  I0 L; e- E2 {: m
    6 p+ M0 U/ F* \! f3 n
    6 t0 k8 M0 x1 Y4 O1 c3 h) Z/ Z3 b5 C* [5 w3 f7 T5 a; y
    3 h; M& x5 D5 ]) C/ U
    在进行下一步之前,我们还得写好CSS,我的电脑配置不行,打开太大的HTML文件很卡很卡,因此我提取一些意项较多的词条来单独修改建议"go", "take", "in", "the"等,这里我提取“go”词条,复制"go"词条所在的一整块<idx:entry> </idx:entry>,然后加上头和尾(头尾可在任意一个html文件中复制即可),保存为html即可。如图所示:
    : N! ?! I" Q' s4 G: F' L8 U; s  Q3 O& P' P7 M8 J0 _5 b

    1 w0 I& r6 K/ N5 e, P, d# ?' t/ A4 p2 Z/ u+ _
    ( R- `! {2 H) w

    * c# j* i7 v' s  m$ x4 Z. F. w) H因为我们要测试css,所以再添加一个head标签并在其中用link标签引用一个css文件,然后就可以写css了。1 f  L( C! R* R/ u
      g% A% }3 l+ q4 H. T

    $ w( @; N7 Y- f6 |% p
    . x% N1 ~/ H# u6 s8 `1 a: @8 p; ?6 v$ k2 d* H% I9 j( Z% L

    , ?# w& t. B. x& [! |MOBI的字典只能生成v7版本,该版本对CSS的支持极其有限,margin只支持left其他方向都不支持,即使是看起来有效的margin-left,也不过是在转化过程中替换为blockquote而已。所以只考虑粗体、斜体、下划线和颜色即可,当然不管这里用什么颜色,Kindle上都是浅灰色。; D. H2 ^  e( q. ^6 O( J$ o, }

    ! @3 q& {. v2 P5 a- O: V" `2 B; \2 B这是我修改完毕后的效果。7 v: g! P  G" s! l& l. y

    " y) k8 k' N' S' F) M6 y
    2 |; R! }' G& r: ?5 |& ^
    2 J( A) ~+ q0 ?9 a3 _
    0 G% _- l9 R2 R7 L8 a- T
    * X% M) F  y" Rcss满意后,那就可以给所有的html文件批量添加link引用了,这里notepad++可以单独完成,就不写脚本了。方法如下:
    6 l# V9 \0 z: W% j' |3 K, M, \7 ]! l+ i! J
    打开任意一个html,Ctrl + F,然后切换到文件查找选项卡,下面注意选择正则表达式,如图所示:. M) h+ M; O: U& x
    - F( T8 k5 M, x5 p

    . w9 U! q  h9 {5 S7 ~- p. T" e* r0 i, t: f

    ! h) Q+ q" G* h" ]( q) t/ s9 ~4 l4 e; f  @

    6 M# s7 t, B+ c( x# W查找目标: (<html.*?>)
    : }, s1 M& ?$ i) D9 U2 [
    - |% e) I5 R6 V替换为:\1<head><link rel="stylesheet" type="text/css" href="test.css" /></head>
    # n( H( w1 x' ]* q+ A" j4 d
    ) x) A0 U  d* p2 V$ t# W文件类型:*.html
    ( c& ~* f! }! i% h5 b
    + ?9 M0 [2 ~9 x9 u1 M目录:即html文件所在的目录
    ; a- ~* d- [! H8 H2 F# V4 c0 |" g* ?7 s; B1 ]( x# l  g3 e/ w$ [
    . L  n2 Y  d* K; f( \" ^8 u+ _! P
    + X$ K. w) t( I5 n, c
    然后点击文件中替换即可,这样,所有HTML都添加了CSS引用了。* x  H( V2 P" j( Z/ c
    * \- m& j3 p; P7 u: g
    现在到了另一个重要时刻了:为即将生成的Kindle词典添加变形词,原理就是检测forms-en.txt里面的单词然后提取出变形词添加进去,上面说过了,此处不再赘言。
    - \9 K' }1 P4 g/ y$ K, F2 t( @, X; t8 Q  D6 T  _
    代码很长,不贴了。用法很简单:Add_Infl.py html文件所在的目录
    ' Y; ?5 O% S3 \3 X& n% i4 _
    ) d, b* M- V: }  d- m
    % R0 [+ X/ j* t
    2 a1 w& R, m0 c$ ?( l3 o  r+ g* A. \( J

    $ h4 t! [0 S7 s9 _文件在此,解压后其他文件和文件夹勿动,以免程序不能正常运行。
    * E1 d4 V! @; ^/ o' A$ d& d9 C

    * b- W, f7 T4 K" e6 X* C% e8 a. v4 x2 [) K0 u$ B
    / |8 E+ ~$ }9 {7 [
    然后会在目录下生成一个名为OK的新目录,新的HTML文件即在此。
    8 E! J5 E% R0 R) J3 o! U
    ! v/ r" P* z. `' ~; p+ I最后就是把之前的opf和css复制进去,然后用mobigen.exe生成即可,mobigen.exe -unicode xxxx.opf
    + \9 ]* w  Z1 K' G' ^
    ' a9 X' P, q9 I3 I如果你想修改生成后的词典名称,打开opf,修改这一行即可
    / Y* \2 h, h: C+ ?1 \
    8 ~  a' ^2 c3 k8 m
    ! _" U- A) A2 [0 X: ~2 n" X  b. R, D: ?6 q4 ^

    3 u( [- y  w% U; J1 e- _) n" k0 z) D& N" {) d
    完。$ a% P: k- k# l. v4 x( M; e  L

    3 x% m5 S; J& K' x+ \三、结束
    0 b1 I! \- n. ]$ f* ]  w/ Q
    5 C6 L1 u* g+ L, T2 ?6 L第一次写这种教程帖,步骤、截图等等都很繁琐,几次我都差点晕了。简单看了几遍,算不上流畅但也不至于晦涩。若诸位有什么问题或发现什么错误也可以在下面回复,希望能有更多优秀的Kindle词典出现。, Y6 }  j% }' I$ I# {* ~

    ; K: f' G* D1 ?. h5 m另外:关于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 18:43 , Processed in 0.060661 second(s), 10 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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