【发布时间】:2011-11-01 20:49:41
【问题描述】:
问题:
我想渲染 MediaWiki 语法(我的意思是 WikiPedia 使用的 MediaWiki 语法,而不是来自其他引擎(如 WikiPlex)的其他 wiki 格式),以及 C# 中的语法。
输入:MediaWiki 标记字符串
输出:HTML 字符串
有一些替代的 mediawiki 解析器,但在 C# 中什么都没有,此外,由于这些库的结构,C/C++ 看起来很暗淡。
作为语法指南,我使用 http://en.wikipedia.org/wiki/Wikipedia:Cheatsheet
我的第一个目标是正确呈现该页面的标记。
标记可以在这里看到: http://en.wikipedia.org/w/index.php?title=Wikipedia:Cheatsheet&action=edit
现在,如果我使用正则表达式,它并没有多大用处,因为不能准确说出哪个标签结束哪个起始标签,尤其是当某些元素(例如斜体)成为父元素的属性时。
另一方面,逐个字符解析也不是一个好方法,因为 例如'''表示粗体,''表示斜体,'''''表示粗体和斜体......
我研究过移植一些其他解析器的代码,但 java 实现不明确,Python 实现有非常不同的正则表达式语法。
目前我看到的最好的方法是将 mwlib 移植到 IronPython http://www.mediawiki.org/wiki/Alternative_parsers
但坦率地说,我并不期待将 IronPython 运行时作为依赖项添加到我的应用程序中,即使我愿意,文档充其量也很糟糕。
【问题讨论】:
-
看看 WikiPlex 是如何做到的。那时你所要做的就是修改它。
-
@Ramhound:好主意。我认为他们使用正则表达式,AFAIK。不确定这是否适用于 MediaWiki,因为它有点复杂。此外,它们将所有内容呈现为 HTML 标签,因此没有 css,也没有属性,但有很多不推荐使用的标签,例如 或 .
-
“猕猴桃”呢? (github.com/aboutus/kiwi,在mediawiki.org/wiki/Alternative_parsers 上提到)。由于它是基于 C 的,并且 I/O 只是由 stdin/stdout 完成,因此从它创建一个“PInvoke”-able DLL 应该不会太难。
-
@Doc Brown:在尝试编译时,我得到:leg -o src/syntax.leg "make: leg: command not found"
-
@Quandary:leg 是一个解析器生成器 (piumarta.com/software/peg),不知道这东西的便携性如何。也许您应该联系 kiwi 的作者,询问他们是否可以使用 MSVC 编译该东西。我没有发表我的评论作为答案,因为我没有自己尝试过,也不知道这种方法是否值得努力。
标签: c# asp.net parsing .net-core mediawiki