2个版本
0.1.1 | 2021年10月26日 |
---|---|
0.1.0 | 2021年10月26日 |
#501 in 配置
每月 39 次下载
36KB
797 行
获取MediaWiki网站配置
辅助脚本,用于为不同的维基正确配置parse_wiki_text
。
最初位于https://github.com/portstrom/fetch_mediawiki_configuration (网络档案馆快照),该仓库已删除,连同所有用户相关的维基仓库。这些库保存在各种GitHub分叉和docs.rs上。但是,没有公开的fetch_mediawiki_configuration
副本。
此项目是对原始脚本功能的重构。在实现说明中记录了做出的推断和假设。
用法
该项目使用cargo包管理器。按照常规方式构建和运行。
传递命令行参数--help
获取更多信息。例如
cargo run -- --help
实现说明
获取ConfigurationSource
所需的所有信息都从给定域的MediaWiki操作API实例中获取。我们使用查询siteinfo元数据端点,将siprop
设置为所需的类别。有关响应的更详细文档,请参阅https://www.mediawiki.org/wiki/API:Siteinfo。
规范化
parse_wiki_text
使用trie存储大多数配置值,这隐式地插入所有可能的折叠大小写变体。对于extension_tags
,使用区分大小写的数据结构,但将维基文本中的ASCII字符在比较之前转换为小写。由于预期扩展标记只包含ASCII字符,这实际上使比较变为不区分大小写。对于link_trail
,使用HashSet<char>
并直接将其中字符与维基文本进行比较。
换句话说,除了 link_trail
之外,所有 ConfigurationSource
字段的值都是不区分大小写的。这种实现将所有配置值(除了链尾字符)都规范化为小写。此外,每个字段中都会移除重复项并按升序排列值;尽管这对正确性并非绝对必要,但它可以去除冗余并提高可重复性。
命名空间
category_namespaces
和 file_namespaces
从 siprop=namespaces
和 siprop=namespacealiases
中提取。
尽管名称具有误导性且缺少文档,但这些字段必须包含主命名空间和规范命名空间名称,以及别名。
扩展标签和协议
extension_tags
直接从 siprop=extensiontags
提取。
protocols
直接从 siprop=protocols
提取。
链尾
link_trail
从 siprop=general
中的键 linktrail
提取。
这是一个包含两个组的 PHP PCRE 模式
- 跟随链接的部分,将成为链接的一部分
- 之后的一切
我们使用 regex-syntax crate 对模式进行一些简单的解析。同时也会解析和适用于相关场景的修饰符。如果组 1 为空,链尾没有字符。如果是重复结构,则递归提取重复部分,只允许生成单个字符序列的构造。否则,正则表达式被认为是无效的。
限制
这种方法只接受具有特定结构的正则表达式,并且不考虑 PHP PCRE 和 rust 正则表达式之间的差异。然而,预计模式在结构上不会多样化到引起问题,也不会复杂到使得语法差异变得重要。这些差异大部分是微小的或边缘情况,因为两种语法都直接来源于 Perl 正则表达式。
一个更严重的限制是,link_trail
不能存储比简单的字符集更复杂的内容。如果正则表达式中的重复部分包含连接、前瞻或类似的操作,则无法在字段中表示,并且会导致致命错误。这确实影响了少数实际的维基实例(例如尝试 ca.wiktionary.org
或 se.wikipedia.org
),但这是 parse_wiki_text
的限制,目前没有绕过的方法。
魔法词
magic_words
从 siprop=magicwords
提取。
搜索所有魔法词及其别名。我们只接受那些前后都带有 __
的魔法词,并移除前缀和后缀。
重定向
redirect_magic_words
从同一类别提取。
收集名为 redirect
的魔法词的别名。由于 parse_wiki_text
解析器在这些别名中仅在进行查找之后才会查找起始 #
,因此我们移除了任何起始 #
。此外,redirect
本身也必须包含在内。
许可
本项目采用 MIT 许可证。
依赖项
~8–21MB
~350K SLoC