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运行时作为依赖项添加到我的应用程序中,即使我想这样做,文档也是最糟糕的.
2017 年更新:
您可以使用ParseoidSharp获得完全兼容的 MediaWiki 渲染器。
它通过 NodeServices 使用官方 Wikipedia Parsoid库。
(NetStandard 2.0)由于Parsoid是GPL 2.0,并且GPL代码是通过网络在单独的进程中在nodejs中调用的,您甚至可以使用您喜欢的任何许可证;)
问题解决了。正如最初假设的那样,解决方案在于使用 C# 中现有的替代解析器之一。
WikiModel (Java) 非常适合此目的。
第一次尝试是pinvoke kiwi。它有效,但失败了,因为:
第二次尝试是 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
| 归档时间: |
|
| 查看次数: |
1731 次 |
| 最近记录: |