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

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

来自LLWiki
跳转到导航 跳转到搜索
第12行: 第12行:
result = null;
result = null;
if(result = left.match(regexp1)) {
if(result = left.match(regexp1)) {
if( /^(.+)#/.test(result[1]) ) {
var section = result[1].match(/^(.+)#(.*)/);
return ['sec', section[1], section[2]];
}
if( /^(.+):/.test(result[1]) ) { return ['*', result[1]]; }
if( /^(.+):/.test(result[1]) ) { return ['*', result[1]]; }
if( /^:/.test(result[1]) ) { return ['6|14', result[1]]; }
if( /^:/.test(result[1]) ) { return ['6|14', result[1]]; }
第56行: 第60行:
left = editbox.val().substring(0, position),
left = editbox.val().substring(0, position),
right = editbox.val().substring(position);
right = editbox.val().substring(position);
if(prefix[0] == 'sec') {
editbox.val(left.replace(regexp1,'[[') + prefix[1] + '#' + ele.text() + ']]' + right);
}
if(prefix[0] == '*' || prefix[0] == '0') {
if(prefix[0] == '*' || prefix[0] == '0') {
editbox.val(left.replace(regexp1,'[[') + ele.text() + ']]' + right);
editbox.val(left.replace(regexp1,'[[') + ele.text() + ']]' + right);
第76行: 第83行:
if(!prefix[1]) {
if(!prefix[1]) {
hints.html('<span class="error">' + wgUCS("请输入页面部分标题", "請輸入頁面部分標題") + '</span>');
hints.html('<span class="error">' + wgUCS("请输入页面部分标题", "請輸入頁面部分標題") + '</span>');
return;
}
if(prefix[0] == 'sec') {
api.get({action:'parse', page:prefix[1], prop:'sections', formatversion:2})
.then(function(data) {
if(data.error) { hints.html('<span class="error">' + wgUCS("没有对应页面", "沒有對應頁面") + '</span>'); }
else {
var section = data.parse.sections.map((ele) => ele.line),
secHints = [],
regexp = new RegExp('^' + prefix[1]);
section.forEach(function(ele) {
if(regexp.test(ele)) { secHints.push(ele); }
});
if(c.length === 0) { hints.html('<span class="error">' + wgUCS("该页面没有对应章节", "該頁面沒有對應章節") + '</span>'); }
else { hints.html('<ul>' + secHints.join('') + '</ul>'); }
}
});
return;
return;
}
}

2020年9月8日 (二) 06:34的版本

$(function() {
    var editbox, prefix,
        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]) ) {
                var section = result[1].match(/^(.+)#(.*)/);
                return ['sec', section[1], section[2]];
            }
            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;
        if(prefix[1]) { updateHints(); }
        editbox.on('input', function() {
            prefix = getPrefix();
            if(!prefix) {
                hideHints();
            }
            else {
                setTimeout(function() {
                    updateHints();
                }, 500);
            }
        });
    };
    var hideHints = function() {
        //console.log('Autocompletion ends.');
        autocomplete = false;
        editbox.off('input');
        $('#autocompleteHints').remove();
    };
    var updateHints = function() {
        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] == 'sec') {
                    editbox.val(left.replace(regexp1,'[[') + prefix[1] + '#' + ele.text() + ']]' + right);
                }
                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] == '828') {
                    editbox.val(left.replace(regexp3,'{{#invoke') + ele.text().substring(2) + '}}' + right);
                }
                else if(prefix[0] == '274') {
                    editbox.val(left.replace(regexp4,'{{#') + ele.text() + '}}' + right);
                }
                hideHints();
            });
        }
        if(!prefix[1]) {
            hints.html('<span class="error">' + wgUCS("请输入页面部分标题", "請輸入頁面部分標題") + '</span>');
            return;
        }
        if(prefix[0] == 'sec') {
            api.get({action:'parse', page:prefix[1], prop:'sections', formatversion:2})
                .then(function(data) {
                    if(data.error) { hints.html('<span class="error">' + wgUCS("没有对应页面", "沒有對應頁面") + '</span>'); }
                    else {
                        var section = data.parse.sections.map((ele) => ele.line),
                            secHints = [],
                            regexp = new RegExp('^' + prefix[1]);
                        section.forEach(function(ele) {
                            if(regexp.test(ele)) { secHints.push(ele); }
                        });
                        if(c.length === 0) { hints.html('<span class="error">' + wgUCS("该页面没有对应章节", "該頁面沒有對應章節") + '</span>'); }
                        else { hints.html('<ul>' + secHints.join('') + '</ul>'); }
                    }
            });
            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>');
            }
        });
    };

    $('body').on('keydown', '#wpTextbox1, #Wikiplus-Quickedit', function(e) {
        editbox = $(this);
        if(e.keyCode == 9) {
            prefix = getPrefix();
            e.preventDefault();
            if(prefix && !autocomplete) {
                showHints();
            }
        }
        if(e.keyCode == 27) {
            e.preventDefault();
            if(autocomplete) {
                hideHints();
            }
        }
    });
});