查看: 3264|回复: 9
打印 上一主题 下一主题

[教程] mdx文件转换为mac原生词典

[复制链接]
  • TA的每日心情
    开心
    2023-3-21 21:40
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    2

    主题

    71

    回帖

    4905

    积分

    贡士

    Rank: 6Rank: 6

    积分
    4905
    跳转到指定楼层
    1
    发表于 2021-1-16 23:26:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 a447600334 于 2021-1-16 23:29 编辑


    Requirements
    转换过程中需要用到PyGlossary,直接去github克隆仓库,或者直接去releases页面下载最新版。作者在这里已经给出了Requirements. 我电脑上配置了anaconda环境,通过<code>brew</code>安装好gtk+3和pygobject3之后,通过Gtk3-based interface运行程序一直报错。而且Tkinter-based interface也是报错,懒得折腾虚拟环境了。所以索性就直接用命令行运行了。
    以下所有操作都是基于macOs Big Sur 11.1进行的
    如果需要用过Command-line interface运行的话,可以通过执行以下命令。
    pip3 install prompt_toolkit
    python3 main.py --ui=cmd

    我是直接通过命令行逐步运行的。
    下面的链接是官方给出的例子。
    https://github.com/ilius/pyglossary/blob/master/doc/apple.md
    • Reading from AppleDict Binary (.dictionary)
      sudo pip3 install lxml
    • Writing to AppleDict
      sudo pip3 install lxml beautifulsoup4 html5lib

    除了这几个包,还需要下载Command Line Tools for  Xcode,直接登录自己的apple id就可以下载。
    找到Additional Tools for Xcode,下载解压。Dictionary Development KitAdditional Tools for Xcode的一部分。在解压好的Additional Tools for Xcode文件夹里面找到Dictionary Development Kit,将它放到~/Developer/Extras/文件夹下。
    这一步只是为了省事,避免在接下来的步骤中需要手动调整Makefile里面的路径。
    Convert Mdict to Mac OS X dictionary
    建议大家把一个词典和它相对应的所有资源文件全部放到一个文件夹下。
    假设我们已经有了一个词典文件,在<code>~/Downloads/oald8/oald8.mdx</code> 里面。跟<code>mdx</code> 在同一个文件夹里面的还有<code>mdd</code> 资源文件。
    假设我们把最新版的pyglossary解压在了这个文件夹~/Software/pyglossary
    1. cd ~/Downloads/oald8/
    2. python3 ~/Software/pyglossary/main.py --write-format=AppleDict oald8.mdx oald8-apple
    3. cd oald8-apple
    复制代码
    我是将pyglossary文件夹和词典文件夹放在同一个目录下。所以我的命令是这样的:
    1. python3 ./main.py --write-format=AppleDict ../oald8/oald8.mdx ../oald8-apple
    2. cd ../oald8-apple
    复制代码
    这个文件夹里面<code>oald8.xml</code> 放的是词典文件,其他资源文件都在<code>OtherResources</code> 里面。
    需要把所有<code>oald8.xml</code> 里面相对链接里面的"\"去掉。
    sed -i "" 's:src="/:src=":g' oald8.xml

    然后还有一个问题是音频文件,原始的音频文件里面有不少spx格式,原作者说的是需要用speex转换,实际上并不需要。直接改一下后缀名就可以了。修改后缀名可以进入到文件夹里面,全选右键,重命名。然后选择后缀即可。改成wav或者mp3都行。我改的是mp3。
    1. find OtherResources -name "*.spx" -execdir sh -c 'spx={};speexdec $spx ${spx%.*}.wav' \;
    2. sed -i "" 's|sound://\([/_a-zA-Z0-9]*\).spx|\1.wav|g' oald8.xml
    复制代码
    spx文件一般都在<code>OtherResources/media/spx</code> 路径下。接下里就是把词典文件<code>oald8.xml</code> 里面所有的引用全部改掉。
    打脸了,直接改后缀在词典里面是播放不出来的,还是需要使用speex。安装speex的过程中需要从源码编译安装,使用port install speex命令是不行的。很多人说还需要将wav转换成mp3,实际上是不需要的。亲测。当然如果需要优化存储的话还是需要使用mp3。wav比spx甚至大了几十倍。。。下面是我转换Cambridge English Pronouncing Dictionary - 18th Edition得到的一张对比图:

    sed -i "" 's|sound://([/_a-zA-Z0-9]*).spx|\1.wav|g' oald8.xml

    以上两步实际上都是需要自己查看xml里面的代码,看看是以那种形式出现的。并不一定都跟上面相同。我在最后会给出我转换不同词典的过程中用到的正则表达式。
    最后一步就是编译,安装。
    1. make
    复制代码
    make过程中可能会出现一些问题:
    ~/Developer/Extras/Dictionary Development Kit/bin/build_dict.sh: line 221: /bin/cp: Argument list too long

    解决方案是将<code>build_dict.sh</code> 的第221行改为下面的代码,重新执行make。
    rsync -a "$OTHER_RSRC_DIR"/ "$OBJECTS_DIR"/dict.dictionary/"$CONTENTS_DATA_PATH" || error "Error."

    完成之后,会在当前文件夹下生成一个objects文件夹,里面就有我们所需要的.dictionary文件。
    原生词典里面是不支持<code>base64</code>格式的字体文件的,所以我们需要手动将原先css里面base64格式的字体转换成它原来的样子并放到<code>Contents</code>文件夹下。
    下面这个网站可以提供在线转换服务
    Base64 Online - base64 decode and encode
    转换过程如下
    默认css的路径如下所示:
    objects/oald8-apple.dictionary/Contents/DefaultStyle.css

    打开<code>DefaultStyle.css</code> , 在里面查找<code>@font-face</code> ,找到里面的将对应字体的base64编码复制到上面那个网站里面,选择decode。输出栏目里面选择export to a binary,其实后面的文件名可以直接以ttf对应的字体格式结尾。例如:ttf,woff之类的。前缀就写成原先的字体名。下面代码中font-family就是对应的字体名。
    下面我举一个修改之前和修改之后的例子吧。
    1. @font-face {
    2.     font-family: 'lm5pp_icomoon';
    3.     src: url(data:font/truetype;charset=utf-8;base64,AAEAAAAOAIAAAwBgRkZUTX/w9zYAAAakAAAAHEdERUYAJwANAAAGhAAAAB5PUy8yDxcGTwAAAWgAAABgY21hcOpwLgYAAAHkAAABZmdhc3AAAAAQAAAGfAAAAAhnbHlmVsOtfQAAA1wAAAE0aGVhZA5ZovkAAADsAAAANmhoZWEHMgPIAAABJAAAACRobXR4DUkAAAAAAcgAAAAcbG9jYQA4ALoAAANMAAAAEG1heHAACwBWAAABSAAAACBuYW1l+lhN2AAABJAAAAGbcG9zdIDVhT8AAAYsAAAAT3dlYmaPmVnAAAAGwAAAAAYAAQAAAAAAADy/p+JfDzz1AAsEAAAAAADV5h5jAAAAANXmQBgAAAAAA3ADgQAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAAAAADcAABAAAAAAAAAAAAAAAAAAAABwABAAAABwBUAAMAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMC/QGQAAUABAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAB6icDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAABBAAAAAAAAAABVQAAAAAAAAIAAAAB9AAABAAAAAAAAAMAAAADAAAAHAABAAAAAABgAAMAAQAAABwABABEAAAADAAIAAIABAABACAl/Oon//3//wAAAAAAICX86if//f//AAD/5NoJFd8AAwABAAwAAAAAAAAAAAAAAAEAAwAAAQYAAAEDAAAAAAAAAQIAAAACAAAAAAAAAAAAAAAAAAAAAQAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIABAAGAAgAJoAAQAAAAAAAAAAAAIAADkCAAEAAAAAAAAAAAACAAA5AgABAAAAAAAAAAAAAgAAOQIAAQAAAAAAAAAAAAMAADkDAAMAAAAAA3ADgQAfADgAUwAAJSImJyY0Nz4BNCYnJjQ3NjIXHgMVFA4CBw4BIzEnIiYnJjQ3PgE0JicmNDc2MhceARQGBw4BByImLwEjIiY1ETQ2OwE3PgEXHgEVERQGBw4BAtAKEQcODjExMTEODg4nDh8vIBERIC8fBxEJqwkSBw4OHh8fHg4ODigOLC0tLAcSjgYMBfZzDRMTDXP2BxMJCQsLCQMGgAcIDicOMnuCezIOJw4PDx5HTVQrK1RNRx4IB1sHBw4oDh5NUE0eDigODg4scXRxLAcH2wUE9xMNAUANE/cGBAMEEAr8wAoQBAEBAAAAAA4ArgABAAAAAAABAAcAEAABAAAAAAACAAcAKAABAAAAAAADAAcAQAABAAAAAAAEAAcAWAABAAAAAAAFAAsAeAABAAAAAAAGAAcAlAABAAAAAAAKABoA0gADAAEECQABAA4AAAADAAEECQACAA4AGAADAAEECQADAA4AMAADAAEECQAEAA4ASAADAAEECQAFABYAYAADAAEECQAGAA4AhAADAAEECQAKADQAnABpAGMAbwBtAG8AbwBuAABpY29tb29uAABSAGUAZwB1AGwAYQByAABSZWd1bGFyAABpAGMAbwBtAG8AbwBuAABpY29tb29uAABpAGMAbwBtAG8AbwBuAABpY29tb29uAABWAGUAcgBzAGkAbwBuACAAMQAuADAAAFZlcnNpb24gMS4wAABpAGMAbwBtAG8AbwBuAABpY29tb29uAABGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAEZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAABAgACAQMAAwEEAQUGZ2x5cGgxB3VuaTAwMDEHdW5pMjVGQwd1bmlFQTI3AAABAAH//wAPAAEAAAAMAAAAFgAAAAIAAQABAAYAAQAEAAAAAgAAAAAAAAABAAAAANQkmLoAAAAA1eYeYwAAAADV5kAYAAFZwI+YAAA=) format('truetype');
    4.     font-weight: normal;
    5.     font-style: normal;
    6. }

    7. @font-face {
    8.     font-family: 'cjkextent';
    9.     src: url(data:font/truetype;charset=utf-8;base64,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) format('truetype');
    10.     font-weight: normal;
    11.     font-style: normal;
    12. }
    复制代码
    记得修改的时候,字符编码和源中保持一致,我现在展示的这个源是uft-8,所以我在下图中选择utf-8。

    修改之后的代码如下:
    1. @font-face {
    2.     font-family: 'lm5pp_icomoon';
    3.     src: url("lm5pp_icomoon.ttf");
    4.     font-weight: normal;
    5.     font-style: normal;
    6. }

    7. @font-face {
    8.     font-family: 'cjkextent';
    9.     src: url("cjkextent.ttf");
    10.     font-weight: normal;
    11.     font-style: normal;
    12. }
    复制代码
    把转换之后的字体文件也需要放到<code>Contents</code> 文件夹里面。
    还有一个问题是原生词典不支持加载<code>js</code> 脚本的,所以很多时候都需要我们自己手动调整<code>css</code> 文件,让它全部展开。
    经过上面的步骤,我们就可以得到了自己DIY之后的css,需要将自己修改好的css文件直接替换掉原先路径下的<code>DefaultStyle.css</code> 。使用别人提供的css也一样,也需要把字体从<code>base64</code> 格式转换成原有的格式。然后替换掉默认的css文件。
    最后就是安装了,直接运行下面的命令就会将<code>.dictionary</code>文件夹移动到<code>~/Library/Dictionaries/</code> 。
    1. make install
    复制代码
    Example
    LDOCE5
    以下是我转换LDOCE5++时候用到的命令。里面有一些正则表达式可以参考。然后我自己基于lgmcw大佬和trivialstuff的css弄出了一个比较适合mac用的风格。修复上一版中原先的spx音频播放不了的问题。
    1. python3 ./main.py --write-format=AppleDict ../LDOCE5/LDOCE5++\ V\ 2-15.mdx ../朗文当代5
    2. cd ../朗文当代5
    3. find OtherResources  -name "*.spx" -execdir sh -c 'spx={};speexdec $spx ${spx%.*}.wav' \;
    4. rm -rf OtherResources/*.spx
    5. sed -i "" 's|\([/_a-zA-Z0-9]*\).spx|\1.wav|g' 朗文当代5.xml
    复制代码
    lgmcw大和trivialstuff的css放入mac中都有一个问题,就是<code>PHRASAL VERBS</code> 默认不展开,我注意到应该是mdx导致的原因。所以我直接在css里面强制将这些项目全部展开了。以下是效果图。corpus默认不展开,需要的话可以自行在css里面调整。(直接搜索hide,里面会有提示的)

    Cambridge English Pronouncing Dictionary - 18th Edition
    为了节省电脑空间,还是需要把wav压缩一下的。
    1. python3 ./main.py --write-format=AppleDict ../Cambridge\ English\ Pronouncing\ Dictionary\ -\ 18th\ Edition/Cambridge\ English\ Pronouncing\ Dictionary\ -\ 18th\ Edition.mdx ../Cambridge\ English\ Pronouncing\ Dictionary\ -\ 18th\ Edition-apple
    2. cd ../Cambridge\ English\ Pronouncing\ Dictionary\ -\ 18th\ Edition-apple
    3. find OtherResources  -name "*.spx" -execdir sh -c 'spx={};speexdec $spx ${spx%.*}.wav' \;
    4. # rm -f OtherResources/*.spx 可能报如下错误
    5. # zsh: argument list too long: rm, 可以改成下面的命令
    6. find OtherResources/ -name '*.spx'|xargs rm -f
    7. cd OtherResources
    8. sh ./converter.sh
    9. cd ..
    10. sed -i "" 's|\([/_a-zA-Z0-9]*\).spx|\1.mp3|g' Cambridge\ English\ Pronouncing\ Dictionary\ -\ 18th\ Edition-apple.xml
    复制代码
    转换代码, converter.sh。将这个文件放入OtherResources里面, 直接运行即可。
    1. for i in *.wav;
    2. do
    3. ffmpeg -i "$i" -f mp3 "${i}.mp3";
    4. rename 's/.wav.mp3/.mp3/g' "${i}.mp3"
    5. rm -f "$i" # 如果需要保留原先的wav文件,则注释掉这一行
    6. done
    复制代码
    转换之前我看了一下大概有15G。下图是转换过程中的一张图。原始的spx文件只有400m左右。请忽略文件数量的差异,因为我在转换过程中添加了一些脚本文件。左图显示的是正在转换过程中的截图,有脚本新增的也有还没来得及清理的文件。

    wav

    spx

    mp3
    Summary
    本文只是做了一个很简单的介绍,如何将第三方词库(Mdic)转换为mac原生词库。时间允许的话我之后会做一个关于修改词典里面css的视频教程。敬请期待!

    评分

    7

    查看全部评分

    本帖被以下淘专辑推荐:

  • TA的每日心情
    奋斗
    1 小时前
  • 签到天数: 1226 天

    [LV.10]以坛为家III

    21

    主题

    1534

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    10192
    2
    发表于 2021-1-17 12:27:20 | 只看该作者
    MAC词典 能转换成 普通格式吗?

    例如 MAC格式词典
  • TA的每日心情
    开心
    2023-3-21 21:40
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    2

    主题

    71

    回帖

    4905

    积分

    贡士

    Rank: 6Rank: 6

    积分
    4905
    3
     楼主| 发表于 2021-1-17 17:04:55 | 只看该作者
    liqima 发表于 2021-1-17 12:27
    MAC词典 能转换成 普通格式吗?

    例如  MAC格式词典

    用这个软件,不支持直接转mdx文件。


    但是可以转成epub,然后解压。最后制作mdx。
  • TA的每日心情
    奋斗
    2022-10-24 01:14
  • 签到天数: 97 天

    [LV.6]常住居民II

    3

    主题

    316

    回帖

    1434

    积分

    解元

    Rank: 5Rank: 5

    积分
    1434

    QQ 章

    4
    发表于 2021-1-20 22:49:47 | 只看该作者
    本帖最后由 Scissors_Stand 于 2021-1-20 22:56 编辑

    谢谢分享,有用
  • TA的每日心情
    开心
    2022-1-5 10:27
  • 签到天数: 80 天

    [LV.6]常住居民II

    23

    主题

    178

    回帖

    5184

    积分

    会元

    Rank: 7Rank: 7Rank: 7

    积分
    5184
    5
    发表于 2021-2-12 09:37:36 | 只看该作者
    谢谢分享好资源!谢谢谢谢

    该用户从未签到

    0

    主题

    19

    回帖

    48

    积分

    白身

    Rank: 1

    积分
    48
    6
    发表于 2022-9-10 16:52:41 | 只看该作者
    膜拜大神,写的好详细

    该用户从未签到

    0

    主题

    3

    回帖

    2

    积分

    白身

    Rank: 1

    积分
    2
    7
    发表于 2022-11-21 13:56:36 | 只看该作者
    “以上两步实际上都是需要自己查看xml里面的代码,看看是以那种形式出现的。并不一定都跟上面相同。我在最后会给出我转换不同词典的过程中用到的正则表达式。” 感谢作者,这句话帮了我一个大忙,终于知道为什么发不出声。现在全部搞定了,除了样式有些难看,但翻译和发音都正常。作为一个0基础编程小白,靠着阅读理解能力最终成功,这种喜悦的心情难以表达。再次感谢楼主。

    该用户从未签到

    0

    主题

    1

    回帖

    4

    积分

    白身

    Rank: 1

    积分
    4
    8
    发表于 2023-1-5 16:38:05 | 只看该作者
    我也提供一些解决 XML 解析错误的正则表达式, 这些解析错误是我在转换柯林斯高阶的时候遇到的, 都替换完后就可以正常 make 了.

    错误1: parser error : AttValue: " or ' expected
    原因: 「d:title=」后面的单词没有加引号, 比如「d:title=abandon」应该被修改为「d:title="abandon"」
    解决方法: 将「d:title=([^/]{1,})>」替换为「d:title="$1">」

    错误2: Entity 'raquo' not defined
    原因: 出错信息已经说得很明白了
    解决方法: 将「&raquo;」替换为「&#187;」

    错误3: parser error : EntityRef: expecting ';'
    原因: 「&」字符没有转义
    解决方法: 将「&([^#a])」替换为「&#38;$1」

    该用户从未签到

    0

    主题

    1

    回帖

    76

    积分

    白身

    Rank: 1

    积分
    76
    9
    发表于 2023-1-11 23:48:41 | 只看该作者
    mac 词典是支持javascript的
    可以这样写
    ```js
    <script>
                    document.addEventListener("keydown", function(event) {
                            if (event.key == "F2") {
                                    document.getElementById('1').play();
                                    event.preventDefault();
                            }
                    });
    </script>
    ```

    该用户从未签到

    0

    主题

    21

    回帖

    16

    积分

    白身

    Rank: 1

    积分
    16
    10
    发表于 前天 14:44 | 只看该作者
    谢谢楼主,教程很全面,费心了