代码之家  ›  专栏  ›  技术社区  ›  Capstone

如何使用内置的mediawiki对lua脚本的支持来解析wikitext?

  •  0
  • Capstone  · 技术社区  · 7 年前

    昏厥的秘密记录在 https://en.wiktionary.org/wiki/faint

    从{{inh | en | enm | faynt}},{m | enm | feynt |弱;虚弱的}},来自 {{etyl | fro | en}}{{m | fro | blue}},{{m | fro | feint | | feigned;疏忽; 假装;伪装;工作疏忽}},从{{etyl | la | en}} {{m | la | fingere | | | | | | | | | | | | | |触摸、处理,通常是形式、形状、框架、形式 思考、想象、构思、设计、设计、伪装。

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

    来自中古英语faynt,feynt(弱;虚弱),来自古法语 假装;伪装;工作疏忽),来自拉丁语 思想、想象、构思、设计、设计、伪装)。

    我从wiktionary的免费转储中提取了大约10000个条目 here

    为此,我的想法是提取模板及其扩展(以某种形式)。为了探索我在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\ U name(“aaa”)不会返回任何内容。

    这里大概是扩展词源部分模板的代码: https://en.wiktionary.org/w/index.php?title=Module:etymology/templates

    如何正确调用此代码? 有没有更简单的方法来实现我解析wikitext模板的目标? mediawiki中是否有一些我可以调用的函数,比如“parse wikitext”(“text”)。如果是,我如何调用它?

    1 回复  |  直到 7 年前
        1
  •  3
  •   cyclaminist    7 年前

    要在wikitext中展开模板(和其他内容),请使用 frame.preprocess frame 对象。得到一个 框架 对象,使用 mw.getCurrentFrame . 例如,键入 = mw.getCurrentFrame():preprocess('{{l|en|word}}') 在控制台中获取 {{l|en|word}} . 目前的情况是 <span class="Latn" lang="en">[[word#English|word]]</span> .

    您也可以使用 Expandtemplates action MediaWiki API ( https://en.wiktionary.org/w/api.php?action=expandtemplates&text={{l|en|word}} Special:ExpandTemplates 页面或JavaScript(如果在浏览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.
    });