delete_______

因为你繁琐的转换做在前面了。。

A 词典 例句在 <div class='liju'></div> 里面, B 词典例句在 <p class='ex'></p> 里面。C 词典例句在 <span></span> 里面。

楼主和我刚入圈时的想法差不多,浪费了我很多精力,新格式确实要有,但一定和 mdx 类似。

部份词典的结构已经修乱了,还有如oed,mwu这样的大型词典,分析 html 结构定义 json都很困难。

渲染模板有个兼容性的问题,科普也是个问题。

实时编辑我认为是伪需求,文本编辑器+正则,已经被那些词典大佬们,用的出神入化了。

有多少人参与是个问题,词典真是个很小的圈子,都还各有所爱。

2 Likes

常用的模板渲染引擎都试过,像vue,jinja2 在goldendict qt5上报错,handlebars 在 qt4 上报错,如果要输出静态 html 导出别的格式,前后端渲染的api还有兼容性差异问题,有些特性,后端不支持,比如jinja2的各种 filter,给用户科普这些差异也很麻烦。

如果真考虑做这块,推荐最简单的mustache,ie7也支持。

很怀疑。oed 这种,程序怎么分析?提取 json,是你后面所有一切的大前提。

我觉得讨论这些问题,有时候有点像在思考开源项目和社区的成败得失、正反经验哈。

MdxBuilder 3.0 确实容错性很强,听说有些txt用其他开源工具编译失败但用官方的可以成功编译。

不过,其同key词条排序确实很有问题。
比如两个key均为elder的两个词条,在 txt 原文本中的顺序为


编译后查询elder显示为

这种情况的出现不止一个key如此,而且貌似是随机的。在对别的词条进行编辑后,下次再编译成mdx,这个elder的顺序有可能又正常了或者仍然不正常。

这种情况一种不是解决方法的办法见

1 Like

这个想法不错,不需要懂技术即可把json 转成 html

没想过 GUI 可以这么搞,感谢指教。如果这一步实现,后面所有词典都可以这么来,那就是造福社区了。

期待楼主大作!

mdict-utils 已经解决这些问题了

发布的词典成品若没有附带原始的JSON,而依然是HTML的话,别人要重新改造这个词典,依然是个很麻烦的事。非程序员,好像难以做到。不知如何解决?

用模板渲染的话,发布的就是原始 JSON。

能否进一步解释一下:上述哪些属于词典的范畴?哪些属于词典程序的范畴?

这样对于我们只懂HTML、CSS和正则的非程序员,可以更好的理解。特别是第一个问题,对于希望能够方便自定义词典的普通制作者,很关心。目前的mdx,让我们只要知道制作HTML网页,就可以制作出词典。不知切换到这个新模式下,我们需要具备什么样的知识背景?

3 Likes

可能需要学习JSON和HTML模板的书写格式,再具体要问楼主了。

JSON类似常见的INI配置文件,以键/值对形式存在,如下INI文件的组织形式:

title=freemdict
def=make knowledge free

title, def 是键名称,等号后面的freemdict 和 make knowledge free 分别是对应的值,这里把title 当作词头, def 当作解释项,这两键名称由你自己定义,更多键值对也可以,转化成 JSON文件,如下:

{"title": "freemdict", "def": "make knowledge free"}

可以注意到,冒号前是键名称,冒号后面跟着是对应的值,只是用双引号保护起来了。更多的 JSON语法说明可以参考 w3c 的 JSON 教程:链接

简单的HTML模板可以想象成把HTML 文件挖坑后的样子,由模板引擎负责把JSON里的键/值对填充进模板对应的坑里生成HTML。下面是一个词条的HTML片段:

<div>
  <h2>freemdict</h2>
  <span>make knowledge free</span>
</div>

参考上面的 JSON 格式,把词头和解释项,用前后两个花括号挖坑后就变成了 HTML 模板:

<div>
  <h2>{{ title }}</h2>
 <span>{{ def }}</span>
</div>

模板引擎由作者提供,模板引擎会查找 JSON 里的 title 和 def,把他们对应的值填充进这个模板里相应位置,生成正常的 HTML:

<div>
  <h2>freemdict</h2>
  <span>make knowledge free</span>
</div>

在有了 JSON 和 HTML 模板后,只需要更新 JSON 里的内容,就能生成对应的 HTML。词典作者们的主要任务就是书写 HTML 模板,原始JSON数据的提取参考作者#37楼。

2 Likes

如果JSON字符串很复杂,有没有方法或者程序能自动生成模板? :smiley:

要问作者了。

感谢这么浅显易懂的细致解释!如果是这样,数据和格式彻底分开了,比HTML和CSS分的还彻底,对后期重新利用确实再方便不过了!强烈支持!!

新格式最好能很方便地从现有mdx 转换过去。

以论坛COD9 双解的mdx为例,其标签绝大多数是自定义的,这种情况转换方不方便呢?
如果不能,那新格式可能只会用于部分新词典。

举个代表性词条agree为例
<rw><hwd><c>agree</c></hwd></rw>
<rw><phx><pho>/əˈɡri:/</pho></phx></rw>
<rw><sa>
<prx><pos>v.</pos> (<h>agrees</h>, <h>agreed</h>, <h>agreeing</h>)</prx>
<def>
<sb><sqn>1</sqn> <prx><pos>intr.</pos></prx>
<def><uit><en>hold a similar opinion</en> <zh><cn>同意,意见一致</cn> </zh>
<ex> <exp> <eps>
<eg><en><x>I agree with you about that</x></en> <zh> <cn>我同意你对此事的意见</cn></zh></eg>
<eg><en><x>they agreed that it would rain</x></en> <zh> <cn>他们都认为会下雨</cn></zh></eg>
</eps></exp></ex></uit></def></sb>

<sb><sqn>2</sqn> <prx><pos>intr.</pos> (often foll. by <cn>常后跟</cn> <x>to</x>, or <x>to</x> + infin.)</prx>
<def><uit><en>consent</en> <zh><cn>赞同,赞成</cn> </zh>
<ex> <exp> <eps>
<eg><en><x>agreed to the arrangement</x></en> <zh> <cn>赞同所做的安排</cn></zh></eg>
<eg><en><x>agreed to go</x></en> <zh> <cn>同意前往</cn></zh></eg>
</eps></exp></ex></uit></def></sb>

<sb><sqn>3</sqn> <prx><pos>intr.</pos> (often foll. by <cn>常后跟</cn> <x>with</x>)</prx>
<sc><sqa>a</sqa> <def><uit><en>become or be in harmony</en> <zh><cn>融合,和谐</cn></zh></uit></def></sc>
<sc><sqa>b</sqa> <def><uit><en>suit; be good for</en> <zh><cn>适合;适宜</cn> </zh>
<ex> <exp> <eps>
<eg><en><x>caviar didn't agree with him</x></en> <zh> <cn>鱼子酱不合他的胃口</cn></zh></eg>
</eps></exp></ex></uit></def></sc>

想起来,肯定比直接改HTML来得难,好像在做逆向工程。估计对于复杂的大型词典,通常一个模板是不够的,或实现起来很难,可能得通过多个HTML模板实现。

以前学习过PHP Smarty,应该是类似的吧?