主要是有些词典想边看边改错,还想顺手加上跳转链接。目前来来回回的全编译有点麻烦。
在mdx里词头key和释义(record)是分开储存的,mdx前半段是key,后面段是所有record。但是key并不是唯一的,mdx允许同一个key出现多次,但是出现一次必须要有record对应。但是python的dictionary就不是如此,key是唯一的,对应唯一的content。我为了应付key重复的情况,把content定义成一个list,这样如果有多个对应的record,会把他们按顺序存入content list里。mdict软件对于每个词条的排序很讲究的,稍微排不好你就查不全dot,DoT,DOT这些样子的单词。
因为我需要自定义排序,而且原厂的mdxbuilder的会强行乱排序,mdxbuilder肯定是不能用了,所以我用writemdict来生成mdx文件。writemdict是开源的python代码,可以转mdx。原版的writemdict python代码,并不支持一key对多record的操作,你只能合并多出来的的释义在一条释义里,但这样弄的话,同时有释义和跳转的词就会失效,并且实际使用时会代码会漏显示出来在屁股后面挂一个@@@LINK这种。所以我动手改了writemdict的python代码,让他可以读我这种稍高级的content是个list的dictionary。这个改动可以顺利生成mdx文件。
然而关键的问题来了,在mdx二进制文件里的header里有一个字段表明了词头的数量。这个字段在writemdict原版里在代码很开始的部分被很随意地直接写作dictionary的key数量,这个在原版里确实没有任何问题,但是在我这儿就并不适用了,因为词条数是content里面record之和,而不是key数量。转出来的文件,goldendict并不读取这个字段,所以不报错,所以在goldendict里面没有任何问题。而安卓MDict读取mdx校验发现和实际不一致,有的版本直接闪退,闪退。ios MDict有的版本不闪退但不可以查后面的词,仅仅是后面的词查不到。导致报错的具体原因是有些词头(key)对应多个解释(Record)。但是python字典解构必须是一一对应,所以一个key下面对应一个数组,数组里每一条包含这多个Record。
相较于writemdict原版我主要改了两个地方:1. 在原版代码里,以前一个字典的key只能对应唯一个value。而MDict完全支持多个相同词头对应多个意思。所以我改了一下生成mdx的python代码,让他不只take一个record,而是用一个for loop 遍历take所有的record,让一个字典的key可以对应多个value。2. 修改排序算法。原版是用的默认python排序,输出的文件在MDict简直不能查,GD勉强能查。
不知道后面哪一步和我这个代码改动不合拍,结果就这样了。
- GoldenDict 默认读取全部词条,然后存储在自己的缓冲区中,查询在缓冲区中进行,可以对全部词条搜索
- MDict 严重依赖于词典自身排序,根据排序规则查找词条所在扇区块,然后再找到词条。如果排序不符合他的规则,即使有这个词条,但不能找到正确的扇区块,也不能定位词条
- ecdic 更怪,他也依赖于词典自身排序,基本规则与 MDict 相同,但遇到特殊字符时,如 空格 减号 等,有时能查出,有时不能。闭源的软件,没办法…