基于 Pijnu 的 MediaWiki 语法解析器。
项目描述
介绍
这是 MediaWiki (MW) 语法的解析器。它的目标是将 wikitext 转换为抽象语法树 (AST),然后将此 AST 呈现为各种格式,例如纯文本和 HTML。
这是 Peter Potrowl 和他的导师 Erik Rose 在 2011 年 Google Summer of Code 期间完成的原创作品。
要求
这个解析器依赖于 Pijnu。您必须安装最新版本的 Pijnu,网址为:https ://github.com/peter17/pijnu
不要使用来自http://spir.wikidot.com的版本,它已经过时了。
对于基本和简单的安装,只需尝试:
pip install mediawiki-parser
这个怎么运作
两个文件 preprocessor.pijnu 和 mediawiki.pijnu 使用形成语法的模式来描述 MW 语法。另一个名为 Pijnu 的 Python 工具将解释这些语法并使用它们来匹配 wikitext 内容并构建 AST。
然后,特定的 Python 函数会将 AST 的叶子渲染为所需的格式。
我们使用两种语法的原因是,在实际解析页面内容之前,我们将首先用预处理器替换 wikitext 中的模板。
构建解析器
必须先从 Pijnu 语法构建预处理器和 mediwiki 解析器,然后才能使用 mediawiki-parser。您可以通过 setup.py 构建它们,可能将 PYTHONPATH 设置为指向 pijnu:
cd /PATH/TO/mediawiki-parser/ env PYTHONPATH=/PATH/TO/pijnu python setup.py build_parsers
如何测试
当前测试该工具的最简单方法是将 wikitext 放入 wikitext.txt 文件中。然后,运行:
python parser.py
wikitext 将在 article.htm 文件中呈现为 HTML。
未来可能会采用其他方式。
单元测试
安装鼻子并运行:
cd /PATH/TO/mediawiki-parser/ env PYTHONPATH=/PATH/TO/pijnu/ nosetests tests
如何在程序中使用
HTML 示例
为了在 Python 程序中使用此工具将 wikitext 呈现为 HTML,您可以使用以下行:
templates = {}
allowed_tags = []
allowed_self_closing_tags = []
allowed_attributes = []
interwiki = {}
namespaces = {}
from mediawiki_parser.preprocessor import make_parser
preprocessor = make_parser(templates)
from mediawiki_parser.html import make_parser
parser = make_parser(allowed_tags, allowed_self_closing_tags, allowed_attributes, interwiki, namespaces)
preprocessed_text = preprocessor.parse(source)
output = parser.parse(preprocessed_text.leaves())
- 输出字符串将包含呈现的 HTML。您应该通过填充第一行的变量来描述您期望的行为:
如果 wikitext 调用外来模板,请将它们的名称和内容放在模板字典中(例如:{'my template': 'my template content'})
如果您的 wiki 上允许使用某些 HTML 标签,请将它们列在allowed_tags列表中(例如:['center', 'big', 'small', 'span'] ;出于安全原因,请避免使用'script'和其他一些标签)
如果您的 wiki 上允许使用某些自关闭 HTML 标签,请将它们列在allowed_self_closing_tags列表中(例如:['br', 'hr'] ;出于安全原因,请避免使用'script'和其他一些标签)
如果您的 wiki 上允许使用某些 HTML 标签,请列出它们可以使用allowed_attributes列表的属性(例如:['style', 'class'] ;出于安全原因,避免使用'onclick'和其他一些标签)
如果您希望能够使用跨维基链接,请在跨维基字典中列出外国 wiki (例如:{'fr': 'http://fr.wikipedia.org/wiki/'})
如果您希望能够区分标准链接、文件包含或类别,请在命名空间字典中列出您的 wiki 的命名空间(例如:{'Template': 10, 'Category': 14, 'File': 6} where数字是 MW 中使用的命名空间代码)
文本示例
为了在 Python 程序中使用此工具将 wikitext 呈现为文本,您可以使用以下行:
templates = {}
from mediawiki_parser.preprocessor import make_parser
preprocessor = make_parser(templates)
from mediawiki_parser.text import make_parser
parser = make_parser()
preprocessed_text = preprocessor.parse(source)
output = parser.parse(preprocessed_text.leaves())
输出字符串将包含呈现的文本。如果 wikitext 调用外来模板,请将它们的名称和内容放在模板字典中(例如:{'my template': 'my template content'})
模板替换示例
如果您只想替换给定 wikitext 中的模板,您可以只调用预处理器而不是渲染后处理器:
templates = {}
from mediawiki_parser.preprocessor import make_parser
preprocessor = make_parser(templates)
output = preprocessor.parse(source)
输出字符串将包含呈现的 wikitext。将模板名称和内容放在模板字典中(例如:{'my template': 'my template content'})
后处理器
- 解析器产生一个 AST。为了提供人类可读的输出,提供了三个后处理器:
html.py,用于 HTML 输出
text.py,用于文本输出
raw.py,用于原始输出
目前,我们主要关注 HTML 后处理器。文本输出可能不像预期的那样干净。
您可以根据自己的需要调整它们。
已知错误
这个工具应该能够将任何 wikitext 页面呈现为文本或 HTML。
但是,它并不打算与 MW 兼容。例如,目前不支持在模板调用中使用 HTML 实体(例如: '{{temp©late}} ')。
请不要犹豫,报告您在使用此工具时可能发现的错误。
特别感谢
感谢 Nicholas Burlett 的目录重组、性能改进和其他修复