LLWiki正在建设中,欢迎加入我们

“MediaWiki:Gadget-autocomplete-core.js”的版本间差异

来自LLWiki
跳转到导航 跳转到搜索
第10行: 第10行:
const regexp1 = /\[\[((?:(?!(\[|]|\|)).)*)$/,
const regexp1 = /\[\[((?:(?!(\[|]|\|)).)*)$/,
regexp2 = /{{((?:(?!({|}|\||:|#)).)*)$/,
regexp2 = /{{((?:(?!({|}|\||:|#)).)*)$/,
regexp3 = /{{#invoke:((?:(?!({|}|\|)).)*)$/,
regexp3 = /{{#invoke:((?:(?!({|}|\|)).)*)$/i,
regexp4 = /{{#widget:((?:(?!({|}|\|)).)*)$/;
regexp4 = /{{#widget:((?:(?!({|}|\|)).)*)$/i;
var getPrefix = function() {
var getPrefix = function() {
var position = editbox.prop('selectionEnd'),
var position = editbox.prop('selectionEnd'),
第72行: 第72行:
}
}
else if(prefix[0] == '274') {
else if(prefix[0] == '274') {
editbox.val(left.replace(regexp3,'{{#') + ele.text() + ']]' + right);
editbox.val(left.replace(regexp3,'{{#') + ele.text() + '}}' + right);
}
}
else if(prefix[0] == '828') {
else if(prefix[0] == '828') {
editbox.val(left.replace(regexp4,'{{#invoke') + ele.text().substring(2) + ']]' + right);
editbox.val(left.replace(regexp4,'{{#invoke') + ele.text().substring(2) + '}}' + right);
}
}
hideHints();
hideHints();

2020年9月7日 (一) 10:40的版本

$(function() {
    if(!['edit','submit'].includes( mw.config.get('wgAction') ) ||
        mw.config.get('wgPageContentModel') != 'wikitext') {
        return;
    }
    mw.util.addCSS('.wikiEditor-ui-text { position:relative; } #autocompleteHints { display:inline-block; position:absolute; left:50%; top:0; cursor:move; padding:0.1em 0.3em; } #autocompleteHints ul { list-style:none; margin:0; } #autocompleteHints li { cursor:pointer; color:#0645ad; } #autocompleteHints li:hover { text-decoration:underline; }');
    var editbox = $('#wpTextbox1'),
        api = new mw.Api(),
        autocomplete = false;
    const regexp1 = /\[\[((?:(?!(\[|]|\|)).)*)$/,
        regexp2 = /{{((?:(?!({|}|\||:|#)).)*)$/,
        regexp3 = /{{#invoke:((?:(?!({|}|\|)).)*)$/i,
        regexp4 = /{{#widget:((?:(?!({|}|\|)).)*)$/i;
    var getPrefix = function() {
        var position = editbox.prop('selectionEnd'),
            left = editbox.val().substring(0, position),
            result = null;
        if(result = left.match(regexp1)) {
            if( /^(.+):/.test(result[1]) ) { return ['*', result[1]]; }
            if( /^:/.test(result[1]) ) { return ['6|14', result[1]]; }
            return ['0', result[1]];
        }
        if(result = left.match(regexp2)) { return ['10', result[1]]; }
        if(result = left.match(regexp3)) { return ['828', result[1]]; }
        if(result = left.match(regexp4)) { return ['274', result[1]]; }
        return null;
    };
    var showHints = function() {
        //console.log('Autocompletion begins.');
        autocomplete = true;
        var prefix = getPrefix();
        if(prefix[1]) { updateHints(prefix); }
        editbox.on('input', function() {
            var prefix = getPrefix();
            if(!prefix) {
                hideHints();
            }
            else {
                setTimeout(function() {
                    updateHints(prefix);
                }, 500);
            }
        });
    };
    var hideHints = function() {
        //console.log('Autocompletion ends.');
        autocomplete = false;
        editbox.off('input');
        $('#autocompleteHints').remove();
    };
    var updateHints = function(prefix) {
        var hints;
        if( $('#autocompleteHints').length ) {
            hints = $('#autocompleteHints').eq(0);
        }
        else {
            hints = $('<div id="autocompleteHints" class="ui-widget-content">').insertAfter(editbox);
            hints.draggable();
            hints.on('click', 'li', function(e) {
                var ele = $(e.target),
                    position = editbox.prop('selectionEnd'),
                    left = editbox.val().substring(0, position),
                    right = editbox.val().substring(position);
                if(prefix[0] == '*' || prefix[0] == '0') {
                    editbox.val(left.replace(regexp1,'[[') + ele.text() + ']]' + right);
                }
                if(prefix[0] == '6|14') {
                    editbox.val(left.replace(regexp1,'[[:') + ele.text() + ']]' + right);
                }
                else if(prefix[0] == '10') {
                    editbox.val(left.replace(regexp2,'{{') + ele.text().substring(9) + '}}' + right);
                }
                else if(prefix[0] == '274') {
                    editbox.val(left.replace(regexp3,'{{#') + ele.text() + '}}' + right);
                }
                else if(prefix[0] == '828') {
                    editbox.val(left.replace(regexp4,'{{#invoke') + ele.text().substring(2) + '}}' + right);
                }
                hideHints();
            });
        }
        if(!prefix[1]) {
            hints.html('<span class="error">' + wgUCS("请输入页面部分标题", "請輸入頁面部分標題") + '</span>');
            return;
        }
        api.get({action:'query', list:'prefixsearch', pssearch:prefix[1].replace(/^:/, ''), psnamespace:prefix[0], formatversion:2})
            .then(function(data) {
            var titles = data.query.prefixsearch.map( (ele) => '<li>' + ele.title + '</li>' );
            if(titles.length) {
                hints.html('<ul>' + titles.join('') + '</ul>');
            }
            else {
                hints.html('<span class="error">' + wgUCS("没有对应页面", "沒有對應頁面") + '</span>');
            }
        });
    };

    editbox.keydown(function(e) {
        if(e.keyCode == 9) {
            var prefix = getPrefix();
            e.preventDefault();
            if(prefix && !autocomplete) {
                showHints();
            }
        }
        if(e.keyCode == 27) {
            e.preventDefault();
            if(autocomplete) {
                hideHints();
            }
        }
    });
});