12 个版本

0.4.2 2018 年 12 月 9 日
0.4.1 2018 年 11 月 2 日
0.4.0 2018 年 10 月 16 日
0.3.5 2018 年 7 月 17 日

1488文本处理

每月 22 次下载

MIT 许可证

63KB
1.5K SLoC

mediawiki-parser

本项目旨在基于解析表达式文法开发 MediaWiki markdown 子集的解析器。目前功能包括从规范文档生成解析器和测试。提供了一个简单的二进制文件,可以从文件中读取并输出 yaml 到标准输出。

免责声明

mediawiki-parser 的目标是 不是 与 MediaWiki 完全兼容及其所有怪癖。如果可以拒绝奇异或格式错误的输入,则建议使用。当前支持的标记主要面向特定 MediaWiki 项目的需求,除非外部贡献,否则可能不会发生重大变化。

如果您想解析带有所有怪癖的任何 MediaWiki,请查看 Parse Wiki Text

目前支持的 MediaWiki

  • 文本格式: ''italic'', '''bold''', <math>\LaTex</math>, <code></code>, ...
  • 段落
  • 标题层次结构
  • 列表
  • 内部引用(文件) [[文件.扩展名|可选|标题]]
  • 外部引用 [https://example.com/ example]
  • 表格
  • 通用模板 {{name|anon_arg|arg=value}}
  • 画廊
  • 通用HTML标签和注释 <thing>内容</thing>

已知限制

本项目存在一些已知限制,这些限制可能在将来被解除。部分原因是将WikiText视为一种上下文无关形式语言,这并不完全正确。

  • {,},[,] 不能在纯文本中使用,因为它们通常表示特殊语法。然而,在数学或 <nowiki> 中使用它们是可以的。
  • 缩进目前不被解析为 pre
  • 模板仅在语法层面上被简化,它们对其内容没有任何影响。

示例

解析将产生一个带有位置信息的语法树(这里为了简洁大部分被省略)

输入

this is some ''formatted'' [https://example.com example] text.

输出(伪YAML形式)

---
type: document
position: ...
content:
  - type: paragraph
    position: ...
    content:
      - type: text
        position: ...
        text: "this is some "
      - type: formatted
        position: ...
        markup: italic
        content:
          - type: text
            position:
              start:
                offset: 15
                line: 1
                col: 16
              end:
                offset: 24
                line: 1
                col: 25
            text: formatted
      - type: text
        position: ...
        text: " "
      - type: externalreference
        position: ...
        target: "https://example.com"
        caption:
          - type: text
            position: ...
            text: example
      - type: text
        position: ...
        text: " text."

或语法错误(这里是一个漂亮的表示形式)

ERROR in line 1 at column 57: Could not continue to parse, expected one of: ''', [, <!--, '', [[, EOF, "\n", {{, [ 	], opening html tag, <, normal text
1 | this is some ''formatted'' [https://example.com example]] text.
2 |

API

该库提供了一个简单的 parse() 函数

let input = "Hello World";
let result = mediawiki_parser::parse(&input)
    .expect(\"Parsing of the input for {} failed!\");
println!(\"{{}}\", &serde_yaml::to_string(&result).unwrap());

结果是自定义的抽象语法树(AST)。详细信息请参阅文档。

依赖项

~5–13MB
~152K SLoC