StarDict支持JavaScript和Firefox OS应用程序

我为Firefox OS:
http://tuxor1337.github.io/firedict
https://marketplace.firefox.com/app/firedict以GoldenDict(www.goldendict.org,也参见Google Play商店)的精神编写了一本字典应用程序,以获取更多信息.

由于ffos的应用程序基于HTML,CSS和JavaScript(WebAPI等),我不得不从头开始编写所有内容.首先,我编写了一个基本库,用于在JavaScript中对StarDict词典进行同步和异步访问:https://github.com/tuxor1337/stardict.js

尽管此应用程序现在可以称为稳定版,但总体性能仍然有点低迷.对于一些词典,我有一个近1,000,000个条目的单词列表!那太大了.索引需要很长时间(每个字典最多几分钟)和查找.目前,单词存储在IndexedDB对象库中.还有另一种选择吗?使用当前的解决方案(使用二进制搜索访问和插入单词),整体体验非常缓慢.也许它会变得更快,如果IndexedDB有一些语言环境排序支持……实际上,我甚至没有将这些术语本身存储在数据库中,而只是存储在* .syn / * .idx文件中的偏移量.我希望能节省一些记忆.但当然我无法在此配置中使用任何IDB排序功能……

也许在内存中进行排序不是最好的主意,因为现在由于某些设备上的OOM(例如ZTE Open),应用程序被内核杀死.一个包含超过500,000个条目的字典肯定会超过100 MB的内存. (每个条目只有200字节,如果你认为关键字字符串是UTF-8,你立即超过100 MB …)

随意在GitHub上直接贡献该项目.否则,我很高兴听到您对上述问题的建议.

最佳答案 我正在研究一个类似于你的stardict项目的MDict解析器(
https://github.com/fengdh/mdict-js)的纯Javascript实现. MDict是另一种流行的字典格式,格式丰富(嵌入图像/音频/ css等),广泛支持window / linux / ios / android / windows手机.我有一些想法可以分享,并希望你将来可以用它来改进stardict.js.

MDict字典文件(mdx / mdd)将关键字和记录分成(optionaly compressed)块,每个包含大约2000个条目,并且还提供关键字块索引表和记录块索引表,以帮助快速查找.由于其紧凑的数据结构,我可以使用小的预加载索引表直接在字典文件上实现我的MDict解析器扫描,但不需要IndexDB.

>每个关键字块索引如下所示:

{num_entries: .., 
 first_word: .., 
 last_word: .., 
 comp_size: ..,    // size in compression 
 decomp_size: ..,  // size after decompression
 offset: ..,       // offset in mdx file
 index: ..
}

>在keyblock中,每个条目都是一对[keyword,offset]
>每个记录块索引如下所示:

{comp_size: ..,    // size in compression 
 decomp_size: ..,  // size after decompression
}

>给定一个单词,使用二进制搜索来定位可能包含它的关键字块.
>切换关键字块并加载其中的所有键,过滤掉匹配的一个并获取其记录的offfset.
>使用二进制搜索来查找包含单词记录的记录块.
>切片记录块并直接检索其记录(文本中的定义或ArrayBuffer中的资源).

由于每个块只包含大约2000个条目,因此它足以在100ms内在100K~1M字典条目中查找单词,对于人类交互非常有价值. mdict-js仅解析文件头,它速度超快且内存使用率低.

以相同的方式,即使使用外卡,也可以检索给定短语的相邻单词列表.

请在这里查看我的在线演示:http://fengdh.github.io/mdict-js/
(您必须选择本地MDict字典:mdx可选的mdd文件)

点赞