如何使用内置的MediaWiki支持lua脚本来解析Wikitext?

时间:2018-10-15 12:18:04

标签: lua mediawiki

虚弱的警告条目位于https://en.wiktionary.org/wiki/faint

词源学部分的维基文字是:

  

从{{inh | en | enm | faynt}}中,{{m | enm | feynt || weak;虚弱}},来自   {{etyl | fro | en}} {{m | fro | faint}},{{m | fro | feint ||伪装;过失   呆滞的}},{{m | fro | feindre}}的过去分词,{{m | fro | faindre || to   假装;假; {{etyl | la | en}}的}}   {{m | la |手指||触摸,处理,通常形成,形状,框架,   思想,想象,构想,尝试,设计,伪装}}。

它包含各种形式为{{xyz | ...}}

的模板

我想解析它们并获得页面上显示的文本输出:

  

来自中古英语faynt,feynt(“弱;虚弱”),来自古法语   虚弱,虚弱(“伪装;过失;迟钝”),过去分词   feindre,faindre(“假装;假装;工作失职”),来自拉丁语   fingere(“触摸,处理,通常以形状,形状,框架,形式   思想,想象,构想,尝试,设计,伪装”。

我从免费here的免费可用转储中提取了大约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”)。如果可以,我该如何调用它?

1 个答案:

答案 0 :(得分:1)

要在Wiki文本中扩展模板(和其他内容),请使用frame.preprocess,它被称为frame对象上的方法。要获取frame对象,请使用mw.getCurrentFrame。例如,在控制台中键入= mw.getCurrentFrame():preprocess('{{l|en|word}}')以获取{{l|en|word}}产生的Wikitext。当前为<span class="Latn" lang="en">[[word#English|word]]</span>

您也可以在Expandtemplates actionhttps://en.wiktionary.org/w/api.php?action=expandtemplates&text={{l|en|word}})或MediaWiki API页面或JavaScript中使用Special:ExpandTemplates(如果您在浏览Wiktionary时打开浏览器控制台,页):

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.
});

这些是扩展模板的一些方法。