查看: 2672|回复: 7
打印 上一主题 下一主题

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

[复制链接]
  • TA的每日心情
    开心
    前天 18:05
  • 签到天数: 708 天

    [LV.9]以坛为家II

    28

    主题

    1178

    回帖

    2万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    27051
    跳转到指定楼层
    1
    发表于 2019-9-30 10:32:44 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 nullname 于 2019-9-30 10:39 编辑

    一、前言

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

    本文章展示如何通过Python来最大限度的优化以生成体验较好的Kindle MOBI词典,为各位提供一种思路,以期众人群策群力,制作出更多好用的Kindle词典。

    为了文章的连续性和完整性,对于完全相同的部分将全文引用这篇文章《如何把 MDX 格式词典转换成 Kindle 字典》 的内容。


    二、正文        

    书伴的这篇教程共有四步,还用到了一些工具。工具请自行下载,因下面所用的代码是Python 3的,所以除了Python 2 ,Python 3 也需要安装。第一步和第二步是一样的,不赘言,仅截一张图于此。





    工具准备好后,选择你想转制的MDX词典(本文只针对英文词典,即英英/英汉),下面以论坛里的American Heritage Dictionary 5th [IPA]为例。


    经过第一步和第二步的处理,我们会得到一个体积较大(视MDX而定)的TXT文件。其内容格式应该是这样的:





    得到该TXT文件后,我们可以选择几行看一下或者搜索一下如".jpg", "<img", ".wav",="" ".mp3"之类的关键词,把图片和音频等等鸡肋全部删掉。同时,这类CSS引用也可以删掉,以减少文件体积,提高后续处理的速度。CSS引用可以在最后一步添加。比如随便看一下,扫一下就有这些:





    我用的是Notepad++,以下是我用来替换的正则表达式:

            图片:<img.*?>
            
            音频:<a href="sound://.*?"></a>

            注释行:<!--.*?-->
            
    可能还有一些冗余的标签,视词典而定,比如我这里就有<span> </span>,直接全词匹配删掉即可。

    我这里这样处理了一下之后,文件的体积直接下降了25%(约100MB --> 约75MB)。

    简单处理完之后,便是正式处理@LINK跳转了。TXT文件的格式只有这两种:单词 + Tab + 意项  或者 单词 + Tab + @@@LINK=另一个单词

    这里我们主要要将跳转词后@@@LINK的跳转链接替换成目标词的意项,因为Kindle不支持@LINK跳转。为方便后续称呼的方便,我在此做个定义。以开头两个词条为例:





    但是这里也要分情况,因为如果一股脑全部将@LINK跳转都替换为目标词意项的话,看起来简单。但实际上会导致文件的体积无比巨大,因为里面存在着大量的像这样的跳转:





    仅仅是advocate这样一个词,就有七个变形词,它们的目标词都是一样的,如果只是粗暴的替换,那么最后生成的词典肯定无比庞大,甚至如果你内存低点最后都不够用来生成词典。(猜想而已,我没这么干过,有兴趣有空闲的朋友可以试试)

    因为Kindle词典支持为某个单词添加不同的变形词,利用这一特点,我们可以在此处判断,如果跳转词是目标词的一个简单变形,那就跳过该词条。判断的依据来源于dsl2mobi这个工具里面附带的英语单词变形词列表。文件名称:forms-EN.txt,内容如下:



            

    简单总结一下,做了个程序流程图:





    这是代码,你需要修改第3、4、5行的文件路径和第50、51行endswith方法和replace方法中的值改为你操作的字典的实际值。详细的内容请看注释。






    Fix_Redirections.zip (886.88 KB, 下载次数: 40)

    注意:Fix_Redirections.py有一个同级文件夹wordforms,文件夹内有forms-EN.txt,请勿修改。


    修改完了然后执行代码,你看到的图应该是这样的:





    这一过程的速度取决于你的电脑配置和词典的词头数,我跑这部AHD大概花了大半天的功夫。

    跑完之后的文件可能存在很多空行(不一定,看词典),这里附上一个去空行的脚本,使用方法:





    Remove_Empty_Lines.zip (497 Bytes, 下载次数: 29)

    执行完成后会在处理的文件目录下生成一个名字带_stripped的文件,这就是去除了空行的文件。





    这时候可以打开文件看一看,应该是满屏紧凑,没有空行,没有@LINK跳转的,就像这样:





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





    然后执行命令:python2 tab2opf.py -utf xxx_stripped.txt

    执行完毕后会生成一个opf文件和一堆html文件,如下图所示:





    在进行下一步之前,我们还得写好CSS,我的电脑配置不行,打开太大的HTML文件很卡很卡,因此我提取一些意项较多的词条来单独修改建议"go", "take", "in", "the"等,这里我提取“go”词条,复制"go"词条所在的一整块<idx:entry> </idx:entry>,然后加上头和尾(头尾可在任意一个html文件中复制即可),保存为html即可。如图所示:





    因为我们要测试css,所以再添加一个head标签并在其中用link标签引用一个css文件,然后就可以写css了。





    MOBI的字典只能生成v7版本,该版本对CSS的支持极其有限,margin只支持left其他方向都不支持,即使是看起来有效的margin-left,也不过是在转化过程中替换为blockquote而已。所以只考虑粗体、斜体、下划线和颜色即可,当然不管这里用什么颜色,Kindle上都是浅灰色。

    这是我修改完毕后的效果。





    css满意后,那就可以给所有的html文件批量添加link引用了,这里notepad++可以单独完成,就不写脚本了。方法如下:

    打开任意一个html,Ctrl + F,然后切换到文件查找选项卡,下面注意选择正则表达式,如图所示:






    查找目标: (<html.*?>)

    替换为:\1<head><link rel="stylesheet" type="text/css" href="test.css" /></head>

    文件类型:*.html

    目录:即html文件所在的目录



    然后点击文件中替换即可,这样,所有HTML都添加了CSS引用了。

    现在到了另一个重要时刻了:为即将生成的Kindle词典添加变形词,原理就是检测forms-en.txt里面的单词然后提取出变形词添加进去,上面说过了,此处不再赘言。

    代码很长,不贴了。用法很简单:Add_Infl.py html文件所在的目录





    文件在此,解压后其他文件和文件夹勿动,以免程序不能正常运行。

    Add_Infl.zip (886.36 KB, 下载次数: 32)

    然后会在目录下生成一个名为OK的新目录,新的HTML文件即在此。

    最后就是把之前的opf和css复制进去,然后用mobigen.exe生成即可,mobigen.exe -unicode xxxx.opf

    如果你想修改生成后的词典名称,打开opf,修改这一行即可





    完。

    三、结束

    第一次写这种教程帖,步骤、截图等等都很繁琐,几次我都差点晕了。简单看了几遍,算不上流畅但也不至于晦涩。若诸位有什么问题或发现什么错误也可以在下面回复,希望能有更多优秀的Kindle词典出现。

    另外:关于Kindle上的汉语词典,我发现kindle支持将繁体作为简体的变形词,意味着若处理得当,那就直接为简体词头添加繁体的变形就够了,不必再另添词条,词典体积将大大减少。各位有兴趣可以试试。

    评分

    10

    查看全部评分

    本帖被以下淘专辑推荐:

    该用户从未签到

    0

    主题

    37

    回帖

    530

    积分

    举人

    Rank: 4

    积分
    530
    2
    发表于 2019-9-30 11:03:05 | 只看该作者
    这种技术贴,要好好给楼主点赞
  • TA的每日心情
    奋斗
    2021-3-15 08:06
  • 签到天数: 585 天

    [LV.9]以坛为家II

    5

    主题

    967

    回帖

    6428

    积分

    禁止发言

    积分
    6428
    3
    发表于 2019-9-30 11:09:32 | 只看该作者
    技术文章,不错。
  • TA的每日心情
    擦汗
    前天 16:06
  • 签到天数: 885 天

    [LV.10]以坛为家III

    7

    主题

    2845

    回帖

    2万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    24806
    4
    发表于 2019-9-30 12:56:27 | 只看该作者
    给技术型楼主,点赞。
  • TA的每日心情
    开心
    2022-1-21 00:52
  • 签到天数: 699 天

    [LV.9]以坛为家II

    17

    主题

    1754

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    19738
    5
    发表于 2019-9-30 13:16:44 | 只看该作者
    过程详细,及时总结惠己惠人
  • TA的每日心情
    开心
    2020-1-5 08:04
  • 签到天数: 50 天

    [LV.5]常住居民I

    307

    主题

    854

    回帖

    3万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    34219

    QQ 章

    6
    发表于 2019-11-22 11:42:11 | 只看该作者
    这种技术贴,要好好给楼主点赞,惠人以漁!
  • TA的每日心情
    奋斗
    昨天 06:46
  • 签到天数: 1047 天

    [LV.10]以坛为家III

    1

    主题

    1592

    回帖

    2万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    23059

    QQ 章

    7
    发表于 2020-3-10 18:28:21 | 只看该作者
    喜欢技术贴, 感谢楼主。