從 MDX 格式轉換製作 MOBI 辭書遇到某些詞項釋義是空的情況

初來乍到,如有失禮懇請見諒。

我想基於 辞源-第三版 將 MDX 格式的辭書轉換成 MOBI 格式的辭書以供 Kindle 使用。

我使用 PyGlossary 將 MDX 解包成

  • content.opf
  • g000***.xhtml
    等文件,置於工作目錄下,並將原辭書文件中的 css 拷貝到工作目錄並更名爲 style.css

編輯完元信息,使用 kindlegen 生成 mobi 辭書,我發現生成出來的大多數詞項都沒有釋義。

起初我以爲是 <idx:orth> ... </idx:orth> 中間有代碼的緣故,將它轉成純文本,似乎無濟於事。

我截取了一段 XHTML 代碼:

  <idx:entry scriptable="yes" spell="yes">
   <idx:orth>
    三節棍
   </idx:orth>
   <br/>
   <link href="cy3.css" rel="stylesheet"/>
   <main id="IZN373">
    <header class="phrase_header">
     <div class="info">
      <span class="col">
       3
      </span>
      <span class="yema">
       1460392135
      </span>
      <span class="parentid">
       1460142797
      </span>
     </div>
     <div class="phr_hw">
      <span class="key">
       <a href="bword://三">
        三
       </a>
       <a href="bword://節">節</a>
       <a href="bword://棍">棍</a>
      </span>
      <pron>
       <a href="bword://sān">sān</a>
       <a href="bword://jié">jié</a>
       <a href="bword://hùn">hùn</a>
      </pron>
     </div>
    </header>
    <div class="img_box">
     <img alt="三節棍" src="A100006.png"/>
    </div>
    <section class="phrase_def">
     <div class="sense_box">
      <div class="sense no_num">
       古武器名。在棍的一頭用鐵索連接短棍兩節,用以擊敵,可破刀牌。
       <z>明</z><z> 茅元儀</z> <q>武備志</q>一〇四 <q>軍資乘</q>稱爲連珠雙鐵鞭。</div>
     </div>
    </section>
   </main>
  </idx:entry>
  <hr/>
  <idx:entry scriptable="yes" spell="yes">
   <idx:orth>
    三精
   </idx:orth>
   <br/>
   <link href="cy3.css" rel="stylesheet"/>
   <main id="manualId">
    <header class="phrase_header">
     <div class="phr_hw">
      <span class="key">
       <a href="bword://三">三 </a>
       <a href="bword://精">精 </a>
      </span>
      <pron>
       <a href="bword://sān">sān </a><a href="bword://jīng">
        jīng</a>
      </pron>
     </div>
    </header>
    <section class="phrase_def">
     <div class="sense_box">
      <div class="sense no_num">
       日、月、星。
       <shuzheng>
        <q>後漢</q><q>書</q> <q>光武帝紀</q> <q>贊 </q>:“九縣飆回,三精霧塞。”
       </shuzheng> <q>注 </q>:“三精,日、月、星也。”
      </div>
     </div>
    </section>
   </main>
  </idx:entry>
  <hr/>

這兩項中,「三節棍」的釋義出現在了結果中,而「三精」沒有,僅有詞頭。

我不知道究竟二者有何本質區別而影響了它們是否能在最終的 MOBI 文件中出現。

如有朋友想要測試,我裁剪了一下源文件:
Test.tar.gz (82.5 KB)

我的作業系統是 Arch Linux,而 Kindlegen 版本:

*************************************************************
 Amazon kindlegen(Linux) V2.9 build 1028-0897292 
 A command line e-book compiler 
 Copyright Amazon.com and its Affiliates 2014 
*************************************************************

mdx 存在专门用于跳转的词头,最好先通过 mdict-utils 提取 mdx 的文本,检查下空的词头是否以@@@LINK= 开头,如果是的话,空词条就是正常的。解决空词条的办法是直接复制 @@@LINK= 指向的词头的内容,粘贴到当前位置。

感謝閣下的及時回覆。

您是指 mdict -x dict.mdx -d ./mdx 嗎?這個指令出來的文本和 PyGlossary 基本是一致的。
而且這些空詞條應當不是跳轉詞條,比例太高(99% 都是空詞條),內容上也不像跳轉詞條。

是这样提取。如果词条不是 @@@LINK= 开头,就是正常词条,如果 MOBI 为空,就是 PyGlossary 的问题,至于怎么转 MOBI 我就不了解了。

mdx 除了特定的协定:词头重定向、资源 href 格式,其他几乎全是 HTML,直接手动 string 拼接一下,比深入了解 PyGlossary 工具简单。

我個人的想法是,因爲 PyGlossary 做的事情基本上只是把 HTML 提取出來,然後再針對 MOBI 字典的格式進行客製化,所以問題也許不出在 PyGlossary 上。

我發現,只消刪除每項釋義開頭的 <link href="cy3.css" rel="stylesheet"/> 即可姑且解決問題。箇中原理尚不明確。

Update:使用 Python 將此節點統統刪除即可:

from bs4 import BeautifulSoup as BS

files = [
    ...   # Your xhtml files
]

for file in files:

    with open(file, "r") as fin:
        soup = BS(fin, 'html.parser') 

        # Clearing all <link href="cy3.css" rel="stylesheet"/>
        for link in soup.find_all("link", href="cy3.css"):
            link.extract()
        
    with open(file, "w") as fout:
        fout.write(str(soup))

Update: 解決了一部分,沒有解決全部

不,問題更加微妙,我完全理解錯了,條件居然是使用代碼編輯器(如 VSCode)格式化對應的釋義條目!