Python輔助MDX轉(zhuǎn)MOBI(以AHD5th為例)
本文于?2019-9-30 10:32:44 發(fā)布至
https://www.pdawiki.com/forum/forum.php?mod=viewthread&tid=36130
以下僅作備份。

一、前言
本篇文章的所有部分均來(lái)源于書(shū)伴的《如何把 MDX 格式詞典轉(zhuǎn)換成 Kindle 字典》 ,只是僅通過(guò)該教程的方法所轉(zhuǎn)出來(lái)的詞典基本沒(méi)法用,原因是Kindle不支持@LINK跳轉(zhuǎn)、不需要音頻、以及需要添加Kindle支持的變形詞搜索功能。經(jīng)過(guò)幾天的摸索,逐漸有了點(diǎn)頭緒,并制作了AHD5th,試用兩天后覺(jué)得尚可。便于昨天發(fā)布。帖子見(jiàn)此:[Kindle詞典]美國(guó)傳統(tǒng)詞典American Heritage Dictionary 5th(精制版)。
本文章展示如何通過(guò)Python來(lái)最大限度的優(yōu)化以生成體驗(yàn)較好的Kindle MOBI詞典,為各位提供一種思路,以期眾人群策群力,制作出更多好用的Kindle詞典。
為了文章的連續(xù)性和完整性,對(duì)于完全相同的部分將全文引用這篇文章《如何把 MDX 格式詞典轉(zhuǎn)換成 Kindle 字典》 的內(nèi)容。
二、正文? ? ? ??
書(shū)伴的這篇教程共有四步,還用到了一些工具。工具請(qǐng)自行下載,因下面所用的代碼是Python 3的,所以除了Python 2 ,Python 3 也需要安裝。第一步和第二步是一樣的,不贅言,僅截一張圖于此。

工具準(zhǔn)備好后,選擇你想轉(zhuǎn)制的MDX詞典(本文只針對(duì)英文詞典,即英英/英漢),下面以論壇里的American Heritage Dictionary 5th [IPA]為例。
經(jīng)過(guò)第一步和第二步的處理,我們會(huì)得到一個(gè)體積較大(視MDX而定)的TXT文件。其內(nèi)容格式應(yīng)該是這樣的:

得到該TXT文件后,我們可以選擇幾行看一下或者搜索一下如".jpg", "<img", ".wav",="" ".mp3"之類的關(guān)鍵詞,把圖片和音頻等等雞肋全部刪掉。同時(shí),這類CSS引用也可以刪掉,以減少文件體積,提高后續(xù)處理的速度。CSS引用可以在最后一步添加。比如隨便看一下,掃一下就有這些:

我用的是Notepad++,以下是我用來(lái)替換的正則表達(dá)式:
? ? ? ? 圖片:<img.*?>
? ? ? ? 音頻:<a href="sound://.*?"></a>
? ? ? ? 注釋行:<!--.*?-->
可能還有一些冗余的標(biāo)簽,視詞典而定,比如我這里就有<span> </span>,直接全詞匹配刪掉即可。
我這里這樣處理了一下之后,文件的體積直接下降了25%(約100MB --> 約75MB)。
簡(jiǎn)單處理完之后,便是正式處理@LINK跳轉(zhuǎn)了。TXT文件的格式只有這兩種:
單詞 + Tab + 意項(xiàng)? 或者?
單詞 + Tab + @@@LINK=另一個(gè)單詞
這里我們主要要將跳轉(zhuǎn)詞后@@@LINK的跳轉(zhuǎn)鏈接替換成目標(biāo)詞的意項(xiàng),因?yàn)镵indle不支持@LINK跳轉(zhuǎn)。為方便后續(xù)稱呼的方便,我在此做個(gè)定義。以開(kāi)頭兩個(gè)詞條為例:

但是這里也要分情況,因?yàn)槿绻还赡X全部將@LINK跳轉(zhuǎn)都替換為目標(biāo)詞意項(xiàng)的話,看起來(lái)簡(jiǎn)單。但實(shí)際上會(huì)導(dǎo)致文件的體積無(wú)比巨大,因?yàn)槔锩娲嬖谥罅康南襁@樣的跳轉(zhuǎn):

僅僅是advocate這樣一個(gè)詞,就有七個(gè)變形詞,它們的目標(biāo)詞都是一樣的,如果只是粗暴的替換,那么最后生成的詞典肯定無(wú)比龐大,甚至如果你內(nèi)存低點(diǎn)最后都不夠用來(lái)生成詞典。(猜想而已,我沒(méi)這么干過(guò),有興趣有空閑的朋友可以試試)
因?yàn)镵indle詞典支持為某個(gè)單詞添加不同的變形詞,利用這一特點(diǎn),我們可以在此處判斷,如果跳轉(zhuǎn)詞是目標(biāo)詞的一個(gè)簡(jiǎn)單變形,那就跳過(guò)該詞條。判斷的依據(jù)來(lái)源于dsl2mobi這個(gè)工具里面附帶的英語(yǔ)單詞變形詞列表。文件名稱:forms-EN.txt,內(nèi)容如下:

簡(jiǎn)單總結(jié)一下,做了個(gè)程序流程圖:

這是代碼,你需要修改第3、4、5行的文件路徑和第50、51行endswith方法和replace方法中的值改為你操作的字典的實(shí)際值。詳細(xì)的內(nèi)容請(qǐng)看注釋。

Fix_Redirections.zip下載地址:
鏈接: https://pan.baidu.com/s/1vzohkHf8u1hUG-IUZ4f8cw 提取碼: 1sbm?
注意:Fix_Redirections.py有一個(gè)同級(jí)文件夾wordforms,文件夾內(nèi)有forms-EN.txt,請(qǐng)勿修改。
修改完了然后執(zhí)行代碼,你看到的圖應(yīng)該是這樣的:

這一過(guò)程的速度取決于你的電腦配置和詞典的詞頭數(shù),我跑這部AHD大概花了大半天的功夫。
跑完之后的文件可能存在很多空行(不一定,看詞典),這里附上一個(gè)去空行的腳本,使用方法:

Remove_Empty_Lines.zip 下載地址:
鏈接: https://pan.baidu.com/s/1vzohkHf8u1hUG-IUZ4f8cw 提取碼: 1sbm
執(zhí)行完成后會(huì)在處理的文件目錄下生成一個(gè)名字帶_stripped的文件,這就是去除了空行的文件。

這時(shí)候可以打開(kāi)文件看一看,應(yīng)該是滿屏緊湊,沒(méi)有空行,沒(méi)有@LINK跳轉(zhuǎn)的,就像這樣:

到了這里,就可以開(kāi)始正式進(jìn)行第三步了。這里用到的是tab2opf.py這個(gè)工具,該工具基于py2,所以要用py2來(lái)執(zhí)行。從書(shū)伴直接下載的tab2opf雖然沒(méi)問(wèn)題,但是根據(jù)我的經(jīng)驗(yàn),把253行的print df給注釋掉,速度會(huì)提升許多,而且出錯(cuò)的機(jī)率也會(huì)減少。除此之外,由于詞典的不規(guī)范及其他特殊原因,我們上述生成的xxx_stripped.txt難免會(huì)有幾個(gè)或十幾個(gè)錯(cuò)誤行(MDX詞典本身的問(wèn)題),因此,最好加一個(gè)異常處理的塊,遇到錯(cuò)誤行直接提示一下就跳過(guò),免得程序中止運(yùn)行,你們可以參照下圖修改,注意紅色箭頭的地方。

然后執(zhí)行命令:python2 tab2opf.py -utf xxx_stripped.txt
執(zhí)行完畢后會(huì)生成一個(gè)opf文件和一堆html文件,如下圖所示:

在進(jìn)行下一步之前,我們還得寫(xiě)好CSS,我的電腦配置不行,打開(kāi)太大的HTML文件很卡很卡,因此我提取一些意項(xiàng)較多的詞條來(lái)單獨(dú)修改建議"go", "take", "in", "the"等,這里我提取“go”詞條,復(fù)制"go"詞條所在的一整塊<idx:entry> </idx:entry>,然后加上頭和尾(頭尾可在任意一個(gè)html文件中復(fù)制即可),保存為html即可。如圖所示:

因?yàn)槲覀円獪y(cè)試css,所以再添加一個(gè)head標(biāo)簽并在其中用link標(biāo)簽引用一個(gè)css文件,然后就可以寫(xiě)css了。

MOBI的字典只能生成v7版本,該版本對(duì)CSS的支持極其有限,margin只支持left其他方向都不支持,即使是看起來(lái)有效的margin-left,也不過(guò)是在轉(zhuǎn)化過(guò)程中替換為blockquote而已。所以只考慮粗體、斜體、下劃線和顏色即可,當(dāng)然不管這里用什么顏色,Kindle上都是淺灰色。
這是我修改完畢后的效果。

css滿意后,那就可以給所有的html文件批量添加link引用了,這里notepad++可以單獨(dú)完成,就不寫(xiě)腳本了。方法如下:
打開(kāi)任意一個(gè)html,Ctrl + F,然后切換到文件查找選項(xiàng)卡,下面注意選擇正則表達(dá)式,如圖所示:

查找目標(biāo): (<html.*?>)
替換為:\1<head><link rel="stylesheet" type="text/css" href="test.css" /></head>
文件類型:*.html
目錄:即html文件所在的目錄
然后點(diǎn)擊文件中替換即可,這樣,所有HTML都添加了CSS引用了。
現(xiàn)在到了另一個(gè)重要時(shí)刻了:為即將生成的Kindle詞典添加變形詞,原理就是檢測(cè)forms-en.txt里面的單詞然后提取出變形詞添加進(jìn)去,上面說(shuō)過(guò)了,此處不再贅言。
代碼很長(zhǎng),不貼了。用法很簡(jiǎn)單:Add_Infl.py html文件所在的目錄

文件在此,解壓后其他文件和文件夾勿動(dòng),以免程序不能正常運(yùn)行。
?Add_Infl.zip 下載地址:
鏈接: https://pan.baidu.com/s/1vzohkHf8u1hUG-IUZ4f8cw 提取碼: 1sbm
然后會(huì)在目錄下生成一個(gè)名為OK的新目錄,新的HTML文件即在此。
最后就是把之前的opf和css復(fù)制進(jìn)去,然后用mobigen.exe生成即可
mobigen.exe -unicode xxxx.opf
如果你想修改生成后的詞典名稱,打開(kāi)opf,修改這一行即可

完。
三、結(jié)束
第一次寫(xiě)這種教程帖,步驟、截圖等等都很繁瑣,幾次我都差點(diǎn)暈了。簡(jiǎn)單看了幾遍,算不上流暢但也不至于晦澀。若諸位有什么問(wèn)題或發(fā)現(xiàn)什么錯(cuò)誤也可以在下面回復(fù),希望能有更多優(yōu)秀的Kindle詞典出現(xiàn)。
另外:關(guān)于Kindle上的漢語(yǔ)詞典,我發(fā)現(xiàn)kindle支持將繁體作為簡(jiǎn)體的變形詞,意味著若處理得當(dāng),那就直接為簡(jiǎn)體詞頭添加繁體的變形就夠了,不必再另添詞條,詞典體積將大大減少。各位有興趣可以試試。

2021.05.01 17:05
以上是初學(xué)時(shí)所用方法,后面隨著經(jīng)驗(yàn)的積累其實(shí)已經(jīng)沒(méi)有那么麻煩了,不過(guò)字典已經(jīng)做出且公開(kāi),加之此教程也足夠啟發(fā)有想法的人,就不再補(bǔ)寫(xiě)了。