如何知道从MediWiki“个人脚本”编辑哪个部分(及其父部分)?

时间:2015-04-11 06:05:26

标签: javascript mediawiki mediawiki-api

在MediaWiki网站上运行的自定义用户脚本,例如User:Username/common.jsUser:Username/vector.js我想在用户编辑部分时添加一些功能。

但是为了获得正确的上下文,我需要知道他们按名称编辑哪个部分以及部分/子部分层次结构中的父部分。

我知道我可以解析网址以获取部分编号,但我找不到直接的方法从该编号转到部分名称或部分结构中的位置。我知道有一些变量可以通过JavaScript以各种方式访问​​,名称以wg开头,但到目前为止,我无法找到任何相关的变量。

明显的黑客攻击是通过AJAX加载相关页面,如果有TOC则解析TOC,否则解析页面布局。这看起来很昂贵,如果有部分使用<h3>X</h3>代码而非===X===样式的wikitext,则可能甚至不那么容易。

当前的MediWiki JavaScript界面​​中有什么东西我找不到?

(用例是英文维基词典,与维基百科不同,相同的部分名称可以多次发生,例如&#34;名词&#34;同时在&#34;英语&#34;和#34;意大利&# 34;等。)

1 个答案:

答案 0 :(得分:2)

您可以使用Parsing API获取当前页面的各个部分。 prop=sections是您想要的。然后是循环结果并得到你想要的东西。

table页面的示例输出:

{
    "parse": {
        "title": "table",
        "sections": [
            {
                "toclevel": 1,
                "level": "2",
                "line": "English",
                "number": "1",
                "index": "1",
                "fromtitle": "table",
                "byteoffset": 21,
                "anchor": "English"
            },
            {
                "toclevel": 2,
                "level": "3",
                "line": "Etymology",
                "number": "1.1",
                "index": "2",
                "fromtitle": "table",
                "byteoffset": 223,
                "anchor": "Etymology"
            },
            // ...
        ]
    }
}   

以下内容应该为您提供一个包含相关部分的数组(反之:当前部分为sections[0],父母为sections[1]等等(如果有)

$(document).ready(function(){
    // Whitelist allowable Namespaces here
    if( mw.config.get('wgNamespaceNumber') !== 0 ) return;

    if( ['edit','submit'].indexOf(mw.config.get('wgAction')) > -1 ) {
        var sectionId = $("#editform input[name=wpSection]").val();
        if( !sectionId || isNaN(sectionId) || sectionId == "0" ) return;

        mw.loader.using( 'mediawiki.api', function () {
            ( new mw.Api() ).get( {
                action: 'parse',
                page: mw.config.get('wgPageName'),
                prop: 'sections',
            } ).done( function ( data ) {
                var sections = [];
                // Might want to check for errors here first
                var allSections = data.parse.sections;

                for( var i = 0, l = allSections.length; i < l; ++i) {
                    var thisSection = allSections[i];

                    if( thisSection.index == sectionId ) {
                        sections.push(thisSection);

                        // Loop back for the parents
                        var toclevel = thisSection.toclevel;
                        while( toclevel > 1 && i > 0 ) {
                            --i;
                            var possibleParent = allSections[i];
                            if( possibleParent.toclevel < toclevel ) {
                                sections.push(possibleParent);
                                toclevel = possibleParent.toclevel;
                            }
                        }
                        break;
                    }
                }

                // Use sections here
                console.log(sections);
            } );
        } );
    }

});

未在维基词典上进行测试,但在1.24本地维基上运行。

编辑:如评论中所述,如果页面包含带有部分的模板,则索引不匹配,因此最好手动查找具有正确索引的部分。