lua - 如何使用对 lua 脚本的内置 mediawiki 支持来解析 wikitext?
问题描述
微弱的维基词典条目位于https://en.wiktionary.org/wiki/faint
词源部分的维基文本是:
从 {{inh|en|enm|faynt}},{{m|enm|feynt||weak; 虚弱}},来自 {{etyl|fro|en}} {{m|fro|faint}},{{m|fro|feint||feigned; 疏忽;sluggish}},{{m|fro|feindre}} 的过去分词,{{m|fro|faindre||to feign; 假; 粗心大意地工作}}, 源自 {{etyl|la|en}} {{m|la|fingere||触摸,处理,通常形成,塑造,构筑,思想中的形式,想象,构思,设计,设计,假装} }。
它包含 {{xyz|...}} 形式的各种模板
我想解析它们并获取页面上显示的文本输出:
源自中古英语 faynt, feynt(“虚弱;虚弱”),源自古法语衰弱,feint(“假装;疏忽;迟缓”),feindre 的过去分词,faindre(“假装;假装;疏忽地工作”),源自拉丁语fingere(“触摸,处理,通常形成,塑造,框架,思想形式,想象,构思,设计,设计,假装”)。
我从这里免费提供的维基词典转储中提取了大约 10000 个条目。
为此,我的想法是提取模板及其扩展(以某种形式)。为了探索可能性,我一直在摆弄 mediawiki 上的 lua 脚本工具。通过在模块的编辑页面上尝试调试控制台内的各种查询,如下所示:
https://en.wiktionary.org/w/index.php?title=Module:languages/print&action=edit
mw.log(p)
>> table
mw.logObject(p)
>> table#1 {
["code_to_name"] = function#1,
["name_to_code"] = function#2,
}
p.code_to_name("aaa")
>>
p.code_to_name("ab")
>>
但是,我什至无法正确调用函数。p.code_to_name("aaa") 不返回任何内容。
可能扩展词源部分模板的代码在这里: https ://en.wiktionary.org/w/index.php?title=Module:etymology/templates
如何正确调用此代码?有没有更简单的方法来实现我解析 wikitext 模板的目标?mediawiki 中是否有一些我可以调用的函数,例如“parse-wikitext("text")。如果是这样,我该如何调用它?
解决方案
要在 wikitext 中扩展模板(和其他内容),请使用frame.preprocess
,它被称为frame
对象上的方法。要获取frame
对象,请使用mw.getCurrentFrame
. 例如,= mw.getCurrentFrame():preprocess('{{l|en|word}}')
在控制台中输入以获取来自{{l|en|word}}
. 目前给出<span class="Latn" lang="en">[[word#English|word]]</span>
.
您还可以使用MediaWiki API ( ) 或Special:ExpandTemplates页面或 JavaScript中的Expandtemplates 操作(如果您在浏览维基词典页面时打开浏览器控制台):https://en.wiktionary.org/w/api.php?action=expandtemplates&text={{l|en|word}}
new mw.Api().get({
action: 'parse',
text: '{{l|en|word}}',
title: mw.config.values.wgPageName,
}).done(function (data) {
const wikitext = data.parse.text['*'];
if (wikitext)
console.log(wikitext);
});
如果该mw.api
库尚未加载并且您收到 TypeError(“mw.Api 不是构造函数”):
mw.loader.using("mediawiki.api", function() {
// Use mw.Api here.
});
所以这些是扩展模板的一些方法。
推荐阅读
- python - 无需线程即可同时运行 Kivy 和 DeepSpeech
- sql - 可以在 Entity Framework Core 中动态加入相关模型吗?
- asp.net - 带有剃须刀的引导轮播问题
- javascript - 当“元素不可交互”时如何使用 Selenium 将“值”设置为输入
- oracle19c - 有没有办法转置两个字符串并得到一个表格作为结果?
- java - 方法 insert(String, Pair
>) 对于 BSTMap 类型不明确 >> 错误 - qt - 如何在 qml 中将半径应用于 ApplicationWindow
- c# - 使用 Twilio 发送 Apple 静默推送通知
- swift - 扩展中符合protocl,如何初始化属性?
- python - 我什么时候应该考虑使用预训练模型 word2vec 模型权重?