# 一键制作图片词典 MdxSourceBuilder

**URL:** <https://forum.freemdict.com/t/topic/2882>\
**Category:** 技术交流与词典编修\
**Tags:** 图片词典, mdxsourcebuilder, opensource, mdx工具, ⭐star\
**Created:** [2020 年8 月 12 日 08:34 UTC](https://forum.freemdict.com/t/topic/2882 "2020-08-12T08:34:34Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Vim](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/vim/32/8408_2.png) [@Vim](https://forum.freemdict.com/u/Vim)\
**Post date:** [2020 年8 月 12 日 08:34 UTC](https://forum.freemdict.com/t/topic/2882/1 "2020-08-12T08:34:34Z")

</div>

# 发布地址

> **[GitHub - VimWei/MdxSourceBuilder: 一键制作mdx图片词典](https://github.com/VimWei/MdxSourceBuilder)**
>
> 一键制作mdx图片词典

一键制作图片词典：原始词条==\> 标准化词条==\> mdx源文件 ==\> mdx词典文件

## 精彩案例

[https://forum.freemdict.com/tag/mdxsourcebuilder](https://forum.freemdict.com/tag/mdxsourcebuilder)

# 动图演示

 ![MdxSourceBuilder](https://forumcdn.freemdict.com/uploads/default/original/2X/c/cd87fee7aba5a4e44db0ee43f2d5c25e0564e6f6.gif)

更多视频演示：[https://www.bilibili.com/video/BV1Ki4y1g74X/](https://www.bilibili.com/video/BV1Ki4y1g74X/)

# 缘起

ref: [图片词典的制作规范与开源工具](https://forum.freemdict.com/t/topic/2418)

---

<div class="post-metadata">

**Author:** ![Vim](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/vim/32/8408_2.png) [@Vim](https://forum.freemdict.com/u/Vim)\
**Post date:** [2020 年8 月 12 日 08:36 UTC](https://forum.freemdict.com/t/topic/2882/2 "2020-08-12T08:36:02Z")

</div>

# MdxSourceBuilder

一键制作图片词典：原始词条==\> 标准化词条==\> mdx源文件 ==\> mdx词典文件

## 背景

### 需求背景

时常遇到一些好资料，怎奈只有纸质版或扫描版之类，希望将这些资料转换为可以检索的mdx词典，既方便使用，也提高利用率。

但是，常常在辛苦整理好词条（这是纯苦力活）之后，使用过往技术方案实现的成品却不够理想，不理想之处有两大方面：

- 导航不理想，极大降低了用户的使用体验
- 制作修订过程复杂，极大干扰了制作者的热情

这完全可以通过工具来解决。

### 程序设计背景

本来我只是提出痛点，希望有高人能出手解决，怎奈高人大都不屑于处理。

本非码农，可鉴于实在痛的厉害，只好自己用三脚猫功夫倒腾了人生第一个具有完整功能的程序。在此之前，从来没用过list、dict之类的，连这个github发布，都是现学现卖，还望高人不要耻笑，多提点才是。若有高人能够弄个更好的程序或是python版的或是GUI版的，那大家就有福了，我这纯粹抛砖引玉。

非码农的好处，或许是可以有更好的用户视角：既考虑词典终端用户的使用体验，也考虑普通的词典制作者的使用体验。虽不能解决所有问题，但至少已能解决我自己的大部分诉求，希望也能解决众多mdx词典用户的些许痛点。

## 解决方案

基本思路： 1.原始词条==\> 2.标准化词条==\> 3.mdx源文件 ==\> 4.mdx词典文件

1. 原始词条：鉴于资料的多样性，原始词条的获取方式也是多种多样，有OCR来的，有手工输入的，也有从其他人的资料转编译来的，也有是因为制作人的喜好或用的工具不同，导致原始词条的格式完全不同。这个特点造就了解决方案必须：(1)兼容多样性，将最常见的词条样式纳入进来；(2)开放性，用户可以根据需要自定义更多个性化的原始词条样式。

2. 标准化词条：若能将多样化的原始词条转化为标准化的词条，那么后续就可以标准化处理了。因此如何定义标准化词条就变得很重要，它是实现后续程序的基础。

3. mdx源文件：这个txt文件与其他技术方案的最大区别是——包含了足够优良的页面导航、关键词导航以及用户自由定义的导航信息，极大提升用户对图片词典的使用体验。图片导航如何设计仁者见仁智者见智，因此，解决方案必须：(1)足够优良，不能太简陋，能用机器实现的定位，就不要浪费肉眼定位、繁琐操作定位等人类的精力；(2)兼容多样性，将最常见的导航样式纳入进来，比如封面附录等无需关键词导航、正文等需要关键词导航、拼音等则无需导航直接转链接到现有页面即可；(3)开放性，用户可以根据需要自定义CSS样式，或者添加更多个性化的导航样式。

4. mdx词典文件：这个步骤是可选项，但一步到位可以极大提升用户的体验，更重要的是使用这个工具可以实现跨平台制作mdx词典了，不必局限于Windows，Linux、Mac统统不在话下。当然要说明的是，这一环节用到了另一个开源工具， [GitHub - liuyug/mdict-utils: MDict pack/unpack/list/info tool](https://github.com/liuyug/mdict-utils) ，功劳统统属于他！

## 程序文件及安装

根本谈不上安装，因为整个程序就是3个Vim脚本文件而已，下载后，直接将这些脚本文件放在与词条文件同一个目录即可。

- MdxSourceBuilder.vim 这是入口文件：上半部分是配置文件，需要用户定义词典参数；下半部分是主程序，通常无需理会
- MdxSourceBuilderCore.vim 这是主程序调用的程序，仅当需要高级定制时修改，通常无需理会
- MdxSourceBuilderCSS.vim 这是CSS文件，样式文件可以在这里定义，通常无需理会

其他文件，都是附带的Readme、动图演示、参考资料、案例词典之类，可以忽略。

## 体验案例“火星词典”

为展示程序的特点，特制作了“火星词典”，供观摩使用。

- 案例词条文件：以"火星词典"开头的所有.txt和.html文件，其中body.part1、body.part2、Pinyin三个文件展示了不同的词条格式
- 程序及词典配置文件：以"MdxSourceBuilder"开头的所有.vim文件，其中MdxSourceBuilder.vim已经包含了案例词典的配置信息

案例使用：打开Vim，输入命令 `:bro so`，找到MdxSourceBuilder.vim，打开，结束。

- 你会看到，仅仅使用上述一个命令，就会输出3个成品文件：MarsDict.css，火星词典.txt，火星词典.mdx
- 你若没有复现上述效果，也别着急，可能是vim、python和mdict-utils没有安装配置好，继续往下看说明文件即可解决
- 之后你只要照猫画虎，即可制作自己的图片词典了

## 使用说明

### 极简使用说明

打开Vim，输入命令 `:bro so`，找到MdxSourceBuilder.vim，打开，结束。

### 概要使用说明

1. 按格式要求准备好词条文件
2. 使用任意文本编辑器配置好 MdxSourceBuilder.vim 中的词典参数
3. 打开Vim，输入命令 `:bro so`，找到MdxSourceBuilder.vim，打开，结束。

### 详细使用说明

- 直接打开查阅 MdxSourceBuilder.vim，其中“使用方法”及“词典参数配置”两个部分自带详细使用说明。
- 若想深度定制，把所有以"MdxSourceBuilder"开头的.vim文件看一遍就知道怎么处理了，即使不懂VimL语言，看注释也能猜个差不离。

### Tips: 使用更便捷快速的命令

- 若觉得如下步骤还要寻找MdxSourceBuilder.vim，有些麻烦

打开Vim，输入命令 `:bro so`，找到MdxSourceBuilder.vim，打开，结束。

- 那么建议使用如下更快的方法(自动寻址)：

用 Vim 打开 MdxSourceBuilder.vim，新建文档`:new`，输入命令`:so MdxSourceBuilder.vim`

甚至输入`:so mdx` 之后，按Tab键即可自动补全命令 `:so MdxSourceBuilder.vim`

这个新方法的逻辑，其实是利用Vim首次打开一个文件时，会将该文件所在目录设置为Vim当前工作目录。

也可以使用系统命令 `:cd` 来更换Vim的工作目录，如 `:cd d:\火星词典`

若您使用附带的`_vimrc`，还可以直接使用自定义的命令 `:CD` 将Vim的工作目录切换为当前文件所在目录。

### 相关FAQ

1. 关于Vim的使用：号称编辑器之神，要想完全掌握确实有难度，但本程序要用到的Vim知识则少的可怜，不必顾虑。

- Q: vim出现乱码

- A: 请将`_vimrc`文件复制到`$HOME`目录下，Windows下即是`c:\Users\YourName\`

1. 关于mdict-utils的使用：除了打包，还有很多其他解包、读取等功能，大家可以尽情挖掘改造。

## 社区讨论与反馈

- Github: [GitHub - VimWei/MdxSourceBuilder: 一键制作mdx图片词典](https://github.com/VimWei/MdxSourceBuilder)
- 讨论社区1: [一键制作图片词典 MdxSourceBuilder](https://forum.freemdict.com/t/topic/2882)
- 讨论社区2: [一键制作图片词典 MdxSourceBuilder - 词库制作交流区 - Dictionary-Making - 掌上百科 - PDAWIKI - Powered by Discuz!](https://www.pdawiki.com/forum/thread-41287-1-1.html)

## LICENSE

[GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html)

---

<div class="post-metadata">

**Author:** ![W2K](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/w2k/32/5_2.png) [@W2K](https://forum.freemdict.com/u/W2K)\
**Post date:** [2020 年8 月 12 日 09:02 UTC](https://forum.freemdict.com/t/topic/2882/3 "2020-08-12T09:02:28Z")

</div>

祝贺开新楼发布制作工具！

---

<div class="post-metadata">

**Author:** ![endnote](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/e/9de0a6/32.png) [@endnote](https://forum.freemdict.com/u/endnote)\
**Post date:** [2020 年8 月 12 日 10:00 UTC](https://forum.freemdict.com/t/topic/2882/4 "2020-08-12T10:00:32Z")

</div>

谢谢分享。  
开源了，这样可以方便后来人不断修改完善mdx的制作

---

<div class="post-metadata">

**Author:** ![Mandolin](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/mandolin/32/4948_2.png) [@Mandolin](https://forum.freemdict.com/u/Mandolin)\
**Post date:** [2020 年8 月 12 日 12:01 UTC](https://forum.freemdict.com/t/topic/2882/5 "2020-08-12T12:01:04Z")

</div>

所以要先装个Vim？对非程序员来说，Windows上装个Vim似乎都挺费劲……

---

<div class="post-metadata">

**Author:** ![Vim](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/vim/32/8408_2.png) [@Vim](https://forum.freemdict.com/u/Vim)\
**Post date:** [2020 年8 月 12 日 12:28 UTC](https://forum.freemdict.com/t/topic/2882/6 "2020-08-12T12:28:33Z")

</div>

> [@Mandolin](#):
>
> 所以要先装个Vim？对非程序员来说，Windows上装个Vim似乎都挺费劲……

Vim与其他任何软件没有区别：

1、下载：到官方网站 [https://www.vim.org/](https://www.vim.org/) ，看见 download 就点击。  
2、安装：在Windows下更简单，都是眼睛闭起来，下一步、下一步。。。完成。

不要被莫须有的“似乎”吓倒了。

---

<div class="post-metadata">

**Author:** ![Vim](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/vim/32/8408_2.png) [@Vim](https://forum.freemdict.com/u/Vim)\
**Post date:** [2020 年8 月 12 日 12:35 UTC](https://forum.freemdict.com/t/topic/2882/7 "2020-08-12T12:35:35Z")

</div>

关于 Vim 的学习难度，好像把大家给吓住了。我想说，完全没必要。

 ![image](https://forumcdn.freemdict.com/uploads/default/original/2X/5/5ad65a3e9a80d80f0fef40f7e17ddb7c34004bc4.png)

---

<div class="post-metadata">

**Author:** ![23uyd](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/23uyd/32/24_2.png) [@23uyd](https://forum.freemdict.com/u/23uyd)\
**Post date:** [2020 年8 月 12 日 12:58 UTC](https://forum.freemdict.com/t/topic/2882/8 "2020-08-12T12:58:34Z")

</div>

这个不难是建立在，只把vim当作最后的统一格式，统一编译的脚本执行器上，

要上手习惯vim的三种模式编辑文本，还是用户曲线挺陡峭的。

不过这套能统一规范的软件，还是真的值得好评！！！ 👋 👋

---

<div class="post-metadata">

**Author:** ![huamaofan](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/h/b9e5f3/32.png) [@huamaofan](https://forum.freemdict.com/u/huamaofan)\
**Post date:** [2020 年8 月 13 日 02:25 UTC](https://forum.freemdict.com/t/topic/2882/9 "2020-08-13T02:25:00Z")

</div>

请教一下大神，烦请指教哈，多谢。

实际操作起来需要安装 vim和python以及下载mdict-utils吗？

---

<div class="post-metadata">

**Author:** ![Vim](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/vim/32/8408_2.png) [@Vim](https://forum.freemdict.com/u/Vim)\
**Post date:** [2020 年8 月 13 日 03:01 UTC](https://forum.freemdict.com/t/topic/2882/10 "2020-08-13T03:01:22Z")

</div>

> [@huamaofan](#):
>
> 实际操作起来需要安装 vim和python以及下载mdict-utils吗？

必须安装vim，这个程序很小，只有8M多，建议去官网下载 [https://www.vim.org](https://www.vim.org)

 ![VimDownload](https://forumcdn.freemdict.com/uploads/default/original/2X/6/63bf3da744f66692c52241594a677d570595b358.png)

Python和mdict-utils是可选项，不安装只能输出css和.txt词典源文件，不会输出.mdx和.mdd。

---

<div class="post-metadata">

**Author:** ![Vim](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/vim/32/8408_2.png) [@Vim](https://forum.freemdict.com/u/Vim)\
**Post date:** [2020 年8 月 13 日 03:04 UTC](https://forum.freemdict.com/t/topic/2882/11 "2020-08-13T03:04:36Z")

</div>

更新了程序。增加了自动设置工作目录的功能，让不熟悉Vim的用户操作更加简单，且不易出错：

打开Vim，输入命令 `:bro so` ，找到MdxSourceBuilder.vim，确定，结束。

[详细讨论，参见友站的第16楼-21楼](https://www.pdawiki.com/forum/forum.php?mod=redirect&goto=findpost&ptid=41287&pid=1972366)

---

<div class="post-metadata">

**Author:** ![Vim](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/vim/32/8408_2.png) [@Vim](https://forum.freemdict.com/u/Vim)\
**Post date:** [2020 年8 月 13 日 04:19 UTC](https://forum.freemdict.com/t/topic/2882/12 "2020-08-13T04:19:43Z")

</div>

进一步更新。解决Vim乱码以及满足常见的Vim用户需求。

请将 `_vimrc` 文件复制到 `$HOME` 目录下，Windows下即是 `c:\Users\YourName\`

---

<div class="post-metadata">

**Author:** ![huamaofan](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/h/b9e5f3/32.png) [@huamaofan](https://forum.freemdict.com/u/huamaofan)\
**Post date:** [2020 年8 月 13 日 07:49 UTC](https://forum.freemdict.com/t/topic/2882/13 "2020-08-13T07:49:12Z")

</div>

好滴，谢谢您的指导！

---

<div class="post-metadata">

**Author:** ![sczhong](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/s/df705f/32.png) [@sczhong](https://forum.freemdict.com/u/sczhong)\
**Post date:** [2020 年8 月 15 日 15:20 UTC](https://forum.freemdict.com/t/topic/2882/14 "2020-08-15T15:20:56Z")

</div>

授人以渔，好啊。一般图片版词典是OCR出索引，如下列格式：  
勹 714  
包 716  
雹 816  
保 631  
寶 593  
㬥 536  
曓 777  
暴 777  
虣 777  
那该设置何种格式？是"火星词典.Pinyin.txt"那样设为2？  
'一行页码 + 多行关键词（每行一个关键词）'的标准词条格式&'一个页码+多个中文单字符的关键词’的压缩词条格式，这两者电子版书籍通常不会提供，一般是提供笔画索引或拼音索引。  
要是能给出一部制作好的词典作指引更好。什么火星词典，不是食人间烟火者所要的。

---

<div class="post-metadata">

**Author:** ![Vim](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/vim/32/8408_2.png) [@Vim](https://forum.freemdict.com/u/Vim)\
**Post date:** [2020 年8 月 15 日 16:53 UTC](https://forum.freemdict.com/t/topic/2882/15 "2020-08-15T16:53:51Z")

</div>

你可以自行添加这种格式。或者先用正则将现有词条转为已有的pinyin格式2。

毕竟大家所处理的字典不同，情形很不一样。我给出的三种词条样式，都是我自己常用的。

---

<div class="post-metadata">

**Author:** ![Vim](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/vim/32/8408_2.png) [@Vim](https://forum.freemdict.com/u/Vim)\
**Post date:** [2020 年8 月 15 日 16:54 UTC](https://forum.freemdict.com/t/topic/2882/16 "2020-08-15T16:54:58Z")

</div>

更新：关键词导航加入定位的百分比信息，更直观一些。

 ![2020-08-16_004945](https://forumcdn.freemdict.com/uploads/default/original/2X/8/8e0adff40724afb28d70a0c2a6bad3ebb24581ff.png)

---

<div class="post-metadata">

**Author:** ![sczhong](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/s/df705f/32.png) [@sczhong](https://forum.freemdict.com/u/sczhong)\
**Post date:** [2020 年8 月 15 日 17:00 UTC](https://forum.freemdict.com/t/topic/2882/17 "2020-08-15T17:00:19Z")

</div>

导航中没有上一页和下一页，那是点阿拉伯数字（如图中1312、1313）等达到翻页的目的？

---

<div class="post-metadata">

**Author:** ![Vim](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/vim/32/8408_2.png) [@Vim](https://forum.freemdict.com/u/Vim)\
**Post date:** [2020 年8 月 15 日 17:01 UTC](https://forum.freemdict.com/t/topic/2882/18 "2020-08-15T17:01:20Z")

</div>

默认是这样的。这些你都可以改造，想显示上下页或数字，随便定制。

---

<div class="post-metadata">

**Author:** ![sczhong](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/s/df705f/32.png) [@sczhong](https://forum.freemdict.com/u/sczhong)\
**Post date:** [2020 年8 月 15 日 17:03 UTC](https://forum.freemdict.com/t/topic/2882/19 "2020-08-15T17:03:32Z")

</div>

这么晚了还给指导，谢谢。

---

<div class="post-metadata">

**Author:** ![HDtiger](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/h/47e85d/32.png) [@HDtiger](https://forum.freemdict.com/u/HDtiger)\
**Post date:** [2020 年8 月 15 日 23:50 UTC](https://forum.freemdict.com/t/topic/2882/20 "2020-08-15T23:50:05Z")

</div>

出个懒人包，所有工具包括vim、Python和mdict-utils，打包直接发在论坛多方便。

[下一页](https://forum.freemdict.com/t/topic/2882.md?page=2)
