在C#中渲染MediaWiki的最佳方法?

Ste*_*ger 7 c# asp.net parsing mediawiki .net-core

题:

我想渲染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运行时作为依赖项添加到我的应用程序中,即使我想这样做,文档也是最糟糕的.

Ste*_*ger 4

2017 年更新:
您可以使用ParseoidSharp获得完全兼容的 MediaWiki 渲染器。
它通过 NodeServices 使用官方 Wikipedia Parsoid库。
(NetStandard 2.0)由于Parsoid是GPL 2.0,并且GPL代码是通过网络在单独的进程中在nodejs中调用的,您甚至可以使用您喜欢的任何许可证;)


2017年之前

问题解决了。正如最初假设的那样,解决方案在于使用 C# 中现有的替代解析器之一。
WikiModel (Java) 非常适合此目的。

第一次尝试是pinvoke kiwi。它有效,但失败了,因为:

  • kiwi 使用 char* (在任何非英语/ASCII 上都会失败)
  • 不是线程安全的。
  • 不好,因为每个架构的代码中都需要有一个本机 dll(确实添加了 x86 和 amd64,然后它在我的 ARM 处理器上崩溃了)

第二次尝试是 mwlib。那次失败是因为 IronPython 无法正常工作。

第三次尝试是 Swebele,它本质上是学术蒸汽软件。

第四次尝试是使用原始的 mediawiki 渲染器,即 Phalanger。但失败是因为 MediaWiki 渲染器并不是真正的模块化。

第五次尝试是通过 Phalanger 使用 Wiky.php,它有效,但速度很慢,而且 Wiky.php 并没有完全实现 MediaWiki。

第六次尝试是通过 ikvmc 使用 bliki,但由于过度使用第 3 方库而失败 ==> 它可以编译,但仅产生空引用异常

第七次尝试是在 C# 中使用 JavaScript,它有效但非常慢,而且实现的 MediaWiki 功能非常不完整。

第八次尝试是通过正则表达式编写自己的“解析器”。
但要让它发挥作用所需的时间实在是太长了,所以我停了下来。

第9次尝试成功了。在 WikiModel 上使用 ikvmc 会生成一个有用的 dll。问题在于示例代码已经过时了。但使用谷歌和 WikiModel 源代码,我能够将其拼凑在一起。

最终结果可以在这里找到: https:
//github.com/ststeiger/MultiWikiParser