【问题标题】:How do I parse wikitext using built-in mediawiki support for lua scripting?如何使用对 lua 脚本的内置 mediawiki 支持来解析 wikitext?
【发布时间】:2018-10-15 12:18:03
【问题描述】:

微弱的维基词典条目位于https://en.wiktionary.org/wiki/faint

词源部分的维基文本是:

来自 {{inh|en|enm|faynt}},{{m|enm|feynt||weak;弱}},来自 {{etyl|fro|en}} {{m|fro|faint}},{{m|fro|feint||feigned;疏忽; 呆滞}},{{m|fro|feindre}} 的过去分词,{{m|fro|faindre||to 假装;假;工作疏忽}},来自 {{etyl|la|en}} {{m|la|fingere||触摸,处理,通常形成,形状,框架,形成 思考、想象、构思、设计、设计、伪装}}。

它包含各种形式的模板 {{xyz|...}}

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

源自中古英语 faynt,feynt(“弱;弱”),源自古法语 fake, feint (“feigned; negligent; sluggish”), 的过去分词 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")。如果有,我该如何调用它?

【问题讨论】:

  • Module:languages/print 中的code_to_namename_to_code 函数输出一个语法高亮表。要将代码转换为名称,请使用Module:languages/code to canonical name 返回的表。控制台使用 Lua 5.1,因此要查看表达式的值,请在其前面放置一个等号:= p.code_to_name("aaa")

标签: lua mediawiki


【解决方案1】:

要在 wikitext 中扩展模板(和其他内容),请使用 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>

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    相关资源
    最近更新 更多