创建一个 kindle 词典

Creating a kindle dictionary

我正在尝试创建一个可用于离线查找的 Kindle 词典。我已经有了这些词和它们的词形变化,但很难将其变成一本可用的词典。

亚马逊提供了一些关于此的 documentation。它基本上说你应该:

  1. 创建一个 XHTML 文件,其中包含指定所有变形等的特殊标记。
  2. 把它变成 epub
  3. 用 Kindle Previewer 打开它
  4. 使用 Kindle Previewer 将其导出到 MOBI

所以我根据 Amazon 规范创建了一个大的 XHTML 文件(23 MB 左右)并在 Kindle Previewer 中打开它,看起来不错。但是,Kindle Previewer 不允许您将 XHTML 个文件导出到 MOBI。他们希望您创建一个中间 epub 文件。

我尝试使用 Pandoc 进行转换,但没有成功,因为它删除了所有特定的 HTML 标签,只留在段落中。然后我尝试使用口径。根据错误消息,正常的 XHTML -> epub 转换失败,因为 XHTML 文件太大。如果您 运行 遇到此错误,Calibre 建议打开“启发式模式”,我试过了,但在 运行 时间 运行 小时后仍未完成 运行ning。

然后我尝试自己创建 epub 文件,使用取自 this tutorial. I discovered that this is not trivial, and a check using epubcheck 的示例文件显示我生成的文件中有许多难以理解的错误。 epub 文件的生成也有点复杂,因为您可能需要将 XHTML 文件拆分成许多较小的文件,这些文件的大小可能应该是 250 kb,因为电子阅读器往往难以处理正在解析较大的文件。

所以我想也许应该有更简单的方法来做到这一点,或者也许有一个图书馆可以帮助做到这一点。也许将单词 + 词形变化输出为其他一些更简单的字典格式,然后使用现有库将其转换为 MOBI 并完全省略 XHTML 生成甚至是一个好主意。目前我正在使用 Python,但如果有必要,我也会使用其他语言。我可以尝试什么?

编辑:补充一下我尝试过的事情:有一个明显封闭的源代码脚本 here that unfortunately doesn't support inflections, so does not work. And there are instructions here 建议使用 Mobipocket Creator 将文件转换为 PRC,然后使用 Kindle Previewer 打开它。这种方法的问题是 Kindle Previewer 抛出错误:

Kindle Previewer does not support this file, which has either been created using an older version of KindleGen or a third party application. We recommend using EPUB or DOCX format directly for previewing and publishing your book on Kindle.

Mobipocket Creator也有更详细的使用说明here,直接将生成的.prc文件移动到kindle上即可。我试过了,但它没有被识别为字典。

我自己想出来的。首先我自己实现了一个解决方案,然后我找到了 pyglossary 库(现在下面的代码只适用于 Github 而不是 pip 的版本)并像这样使用它:

from pyglossary.glossary import Glossary    
Glossary.init()
glos = Glossary()
defiFormat = "h"

base_forms = get_base_forms()

for canonical_form in base_forms:
    inflections = get_inflections(canonical_form)
    definitions = get_definition(canonical_form)

    definitionhtml = ""
    for definition in definitions:
        definitionhtml += "<p>" + gloss + "</p>"
    all_forms = [canonical_form]
    all_forms.extend(inflections)
glos.addEntryObj(glos.newEntry(all_forms, glosshtml, defiFormat))
glos.setInfo("title", "Russian-English Dictionary")
glos.setInfo("author", "Vuizur")
glos.sourceLangName = "Russian"
glos.targetLangName = "English"
glos.write("test.mobi", format="Mobi", keep=True, kindlegen_path="path/to/kindlegen.exe")