Skip to main content

基于 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 的目录重组、性能改进和其他修复

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

mediawiki-parser-0.4.1.tar.gz (34.5 kB 查看哈希)

已上传 source