Mdict开源

主程序使用的 Tauri 框架,轻量版的 Electron,跨平台使用的是系统提供的 WebView。MDict 的词典里自带索引,你可以使用这个现成的索引,也可以像 GoldenDict-NG 一样自己重建索引。

1 个赞

嗯,这个开源版本没试。一直用的老版本的MDict。


这个应该不是采用webview,我启动之后没有发现相关的webview进程。

mdx里是有索引,但是我只看到对于record block有索引,对于key block没发现有索引。难道是每次查词都解析一下mdx的key block部分,再计算record偏移。这样就慢了。

老版本使用的是 WebBrowser,调用系统自带的 Internet Explorer 的渲染引擎 MSHTML。

Key Block 是有索引的,包含每个 Block 里的首尾词头,不想每次解析的话,可以长期持有这个索引。参考:key_block_index.rs#L66

let (entry_count, first_key, last_key, block_length, raw_data_length) = match meta_info.version {
    ZdbVersion::V3|ZdbVersion::V1 => {
        (
            reader.read_u32::<BigEndian>()? as u64,
            read_key(reader, meta_info)?,
            read_key(reader, meta_info)?,
            reader.read_u32::<BigEndian>()? as u64,
            reader.read_u32::<BigEndian>()? as u64
        )
    },
    ZdbVersion::V2 => {
        (
            reader.read_u64::<BigEndian>()?,
            read_key(reader, meta_info)?,
            read_key(reader, meta_info)?,
            reader.read_u64::<BigEndian>()?,
            reader.read_u64::<BigEndian>()?
        )
    }
};

从资源占用角度,觉得WebBrowser对于像这种查词小工具这种特定场景来说是最为合适的,在拥有较为完整的html渲染的前提下,能将安装包体积,运行时进程资源占用都降到最低。Tarui,electron这一系列新的前端框架还是太重了。虽然能构建和支持更丰富的特性和内容。

2 个赞

IE 浏览器兼容问题多,作者适配很困难。

今天又看了看mdx这个库,琢磨了一下原作者快速搜索key的方式,不知道理解的对不对。使用mdx生成工具的时候,会对key做排序,然后分块存储。查找key的时候直接二分排序查找(对比key_block_index的first key和last key)key block index unit,定位到某个key block index,再直接解析特定key block。

麻烦的地方在于对key的排序规则上,不同的语言的key的排序规则可能不同。貌似项目提到的ICU库进行unicode排序是一种排序规则。多字节的文字如CJK文字可能就是依据这个来排序的?rust新手。。。勉强看懂了一些,如果要移植这套key的搜索规则到其他语言还有点费劲啊

1 个赞

第一段的理解是正确的。第二段 ICU 排序只是 MDict 3.0 格式的要求,而现有词典都是 1.0 或 2.0 的,第三方软件都不支持这个版本,麻烦就不用考虑了。

2 个赞