跳转到内容

User:GZWDer/common.js

维基百科,自由的百科全书
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
//importScript("User:Stevenliuyi/scripts/Wikidata.js");
//importScript("User:GZWDer/User:Gqqnb/js/category item description.js");
//importScript( 'User:Zhaofeng Li/Reflinks.js' );
importScript( 'User:GZWDer/DisamAssist.js');
$(function() {
//mw.loader.load('http://tools.wmflabs.org/magnustools/resources/js/jquery/jquery-ui.min.js'); 
 
var LTUI = {
    Translate:"翻译",
    TranslateLinks:"翻译链接",
    LinkTranslator:"链接翻译器",
    TLTitle:"自动翻译从其他语言维基百科复制的文本",
    SourceLanguageCode:"目标维基的语言代码:",
    OriginalLink:"原链接:",
    NOLINKINPAGE:"此页没有链接",
    Done:"完成",
    NoWikiEd:"linktranslator.js与WikiEd不兼容,请于页面右上角暂时禁用WikiEd。",
    EditMessage:"由[[User:Kovl/selfportal/代码库/linktranslator.js|链接翻译器]]自动翻译;",
 
    //OPTION
    KeepOriginalText:"显示原文:",
    CommentOriginalLink:"注释原链接:",
    UseLangLink:"跨语言链接:",
 
    //STATUS
    PARSEFAILED:"解析失败",
    ERROR:"错误",
    NOLINK:"没有链接",
    MULTIPLELINK:"多个连接",
    PAGESAME:"页面相同",
    PAGEDIFF:"页面不同",
    DONTEXIST:"页面不存在"
};
 
var LTConf = {
    SourceLanguageCode:"en",
    KeepOriginalText:"", //"checked" OR ""
    CommentOriginalLink:"",
    UseLangLink:"checked"
};
 
//clear previous button
$('#wpLinktranslator').remove();
 
// secure server?
if ((mw.config.get('wgAction') == 'edit' || mw.config.get('wgAction') == 'submit') && mw.config.get('wgServer') == '//zh.wikipedia.org') {
    $('#wpDiff').after('\n<input id="wpLinktranslator" value="' + LTUI.TranslateLinks + '" title="' + LTUI.TLTitle + '" type="button"/>');
    $('#wpLinktranslator').click(LTClick);
}
 
//variables
var jobid = 0;
var ldsb = '__LEFT_DOUBLE_SQUARE_BRACKETS__';
var EXEConf;
 
//on click "Translate links" #wpLinktranslator
function LTClick(event) {
    event.preventDefault();
    $('#linktranslator').remove();
    if ($("#wikEdFrameWrapper").css("visibility") == "visible"){
	    alert(LTUI.NoWikiEd);
	    return;
	}
    $('<div id="linktranslator" title="' + LTUI.LinkTranslator + '">' +
        '<label for="linktranslator-source-lang">' + LTUI.SourceLanguageCode + '</label> ' +
        '<input id="linktranslator-source-lang" value="' + LTConf.SourceLanguageCode + '" type="text" /><br />' +
        '<label for="linktranslator-keep-original">' + LTUI.KeepOriginalText + '</label> ' +
        '<input type="checkbox" id="linktranslator-keep-original" ' + LTConf.KeepOriginalText + '/><br />' +
        '<label for="linktranslator-comment-link">' + LTUI.CommentOriginalLink + '</label> ' +
        '<input type="checkbox" id="linktranslator-comment-link" ' + LTConf.CommentOriginalLink + '/><br />' +
        '<label for="linktranslator-lang-link">' + LTUI.UseLangLink + '</label> ' +
        '<input type="checkbox" id="linktranslator-lang-link" ' + LTConf.UseLangLink + '/><br />' +
        '<input id="linktranslator-translate" value="' + LTUI.Translate + '" type="button" /></div>'
 
    ).dialog({
        modal: false,
        close: function() {jobid++;},
        width: 500
    });
    $('#linktranslator-translate').click(TClick);
}
 
//on click "Translate" #linktranslator-translate
function TClick(event) {
    event.preventDefault();
    var thisjobid = jobid; // or in #wpLinktranslator's click event?
 
    EXEConf = {
		KeepOriginalText:$('#linktranslator-keep-original').prop('checked'),
		CommentOriginalLink:$('#linktranslator-comment-link').prop('checked'),
		UseLangLink:$('#linktranslator-lang-link').prop('checked')
	};
 
    LTConf.SourceLanguageCode = $('#linktranslator-source-lang').val();
    var api = 'http://' + LTConf.SourceLanguageCode + '.wikipedia.org/w/api.php';
    if (document.location.protocol == 'https:') {
        api = 'https://' + LTConf.SourceLanguageCode + '.wikipedia.org/w/api.php';
    }
 
    var wikitext = $('#wpTextbox1').val();
    // how to make a set to avoid duplicated links?
    var links = $('#wpTextbox1').val().match(/\[\[.+?\]\]/g);
 
    if (links === null) {
        $('#linktranslator').text(LTUI.NOLINKINPAGE);
        return;
    } else { // assert links.length != 0 here.
        $('#linktranslator').dialog( "option", "position", { my: "top", at: "top"} );
        //$('#linktranslator').html('<div id="linktranslator-progressbar"></div>');
        //$('#linktranslator-progressbar').progressbar();
    }
 
    var respcount = 0;
    // TODO: should be rewritten using jQuery.each
 
    function eachlink(i) {
        var linkidx = i;
        var link = links[i].slice(2, -2);
 
        var linktarget = link;
        // TODO: pipe tricks like [[/subpage/]]?
        var linkdisplay = link;
        var idx = link.indexOf('|');
        if (idx != -1) {
            linktarget = link.substring(0, idx);
            linkdisplay = link.substring(idx + 1);
        }
        $('#linktranslator').append('<div id="linktranslator-item-' + i + '"></div>');
        $('#linktranslator-item-' + i).text(links[i] + ' -> ')
            .append('<span class="linktranslator-item-newlink">...</span>');
        // TODO: if newtarget == linkdisplay?
        // TODO: cannot identify if missing or [[zh:]] (for main page, also blank text)
        $.ajax({
            data: {
                action: 'parse',
                format: 'json',
                page: linktarget,
                prop: 'langlinks',
                redirects: 1
            },
            dataType: "jsonp",
            type: 'POST',
            url: api,
            success: function(data) {
                console.log(data);
                if (thisjobid != jobid) {
                    return;
                }
 
                var llink;
                var newtarget;
                var newlinks;
 
                if(data.parse){
                	//request successful
                    llink = $.grep(data.parse.langlinks, function(e){ return e.lang === 'zh'; });
                } else if(data.error.info){
                	//request completed with error
                    if(data.error.info == "The page you specified doesn't exist")
                        {$('#linktranslator-item-' + linkidx + ' .linktranslator-item-newlink').text(LTUI.DONTEXIST);}
                    else
                        {$('#linktranslator-item-' + linkidx + ' .linktranslator-item-newlink').text(LTUI.ERROR + '(' + data.error.info + ')');}
                    return;
                } else{
                	//error without info field
                    $('#linktranslator-item-' + linkidx + ' .linktranslator-item-newlink').text(LTUI.PARSEFAILED);
                    return;
                }
 
                if (llink.length === 1) {
                    newtarget = llink[0]["*"];
 
                    if(linktarget === newtarget){
                        $('#linktranslator-item-' + linkidx + ' .linktranslator-item-newlink').text(LTUI.PAGESAME);
                        return;
                    }
 
                    //EXEConf.KeepOriginalText
                    if(EXEConf.KeepOriginalText) {
                        newlinks = ldsb + newtarget + '|' + linkdisplay + ']]';
                    } else {
                        newlinks = ldsb + newtarget + ']]';
                    }
                } else if (llink.length === 0) {
                    if(EXEConf.UseLangLink) {
                        newlinks = '{{link-' + LTConf.SourceLanguageCode + '||' + '';
                        if(EXEConf.KeepOriginalText) {
                            newlinks = '{{tsl|' + LTConf.SourceLanguageCode + '|' + linktarget + '||' + linkdisplay +'}}'; 
                        } else {
                            newlinks = '{{tsl|' + LTConf.SourceLanguageCode + '|' + linktarget + '}}'; 
                        }
                    } else {
                        $('#linktranslator-item-' + linkidx + ' .linktranslator-item-newlink').text(LTUI.NOLINK);
                        return;
                    }
                } else {
                   $('#linktranslator-item-' + linkidx + ' .linktranslator-item-newlink').text(LTUI.MULTIPLELINK);
                   return;
                }
 
 
                //EXEConf.CommentOriginalLink
                var newcomment;
                if(EXEConf.CommentOriginalLink) {
                    newcomment = '<!-- ' + LTUI.OriginalLink + ldsb + link + ']] -->';
                } else {
                    newcomment = '';
                }
 
                //mark on dialogue
                $('#linktranslator-item-' + linkidx + ' .linktranslator-item-newlink').text(newlinks.replace(new RegExp(ldsb, 'g'), '[['));
                // only replacing the first is ok, we will run this many times
                wikitext = wikitext.replace(links[linkidx], newlinks + newcomment);
 
            },
            error: function(jqXHR, textStatus, errorThrown) {
                if (thisjobid != jobid) {
                    return;
                }
                $('#linktranslator-item-' + linkidx + ' .linktranslator-item-newlink').text(LTUI.ERROR + '(' + textStatus + ')');
            },
            complete: function() {
                if (thisjobid != jobid) {
                    return;
                }
                respcount++;
                //$('#linktranslator-progressbar').progressbar('value', respcount * 100 / links.length);
                if (respcount >= links.length) {
                    $('#wpTextbox1').val(wikitext.replace(new RegExp(ldsb, 'g'), '[['));
                    $('#linktranslator').prepend('<div id="linktranlator-done"><strong>' + LTUI.Done + '</strong></div>');
                }
            }
        });//ajax complete
    }//trino complete
 
    for (var i = 0; i < links.length; i++) {eachlink(i);}
    $('#wpSummary').val(LTUI.EditMessage + $('#wpSummary').val());
}
 
//end
});
var LinkClassifier={
    callback:function(r, sts, xhr){
        if(!r.query) {
            if(typeof(window.console)=='undefined' || typeof(window.console.error)!='function')
                mw.log.warn(new Error('Bad response'));
            window.console.error("Bad response", r);
            return;
        }
        if(r['query-continue']){
            var cc=this.rawdata;
            for(var k in r['query-continue']){
                for(var k2 in r['query-continue'][k]){
                    cc[k2]=r['query-continue'][k][k2];
                }
            }
            $.ajax({
                url:mw.util.wikiScript('api'),
                dataType:'json',
                type:'POST',
                data:cc,
                rawdata:cc,
                success:arguments.callee,
                error:function(xhr,textStatus,errorThrown){
                    mw.log.warn(new Error('AJAX error: '+textStatus+' '+errorThrown));
                }
            });
        }
        r=r.query;
 
        var a=document.getElementById('wikiPreview');
        if(!a) a=document.getElementById('bodyContent');
        if(!a) {
        	//mw.log.warnnew Error('Huh? No body content?');
        }
        a=a.getElementsByTagName('A');
        if(a.length==0) return;
 
        var redir={};
        var redirlist=[];
        if(r.redirects) for(var i=r.redirects.length-1; i>=0; i--){
            redir[r.redirects[i].from]=r.redirects[i].to;
            redirlist.push(r.redirects[i].from);
        }
        if(redirlist.length>0) {
            var q = {
                format:'json',
                action:'query',
                titles:redirlist.join('|'),
                prop:'info',
                inprop:'protection',
                cllimit:'max'
            };
            $.ajax({
                url:mw.util.wikiScript('api'),
                dataType:'json',
                type:'POST',
                data:q,
                rawdata:q,
                success:arguments.callee,
                error:function(xhr,textStatus,errorThrown){
                    mw.log.warn(new Error('AJAX error: '+textStatus+' '+errorThrown));
                }
            });
        }
 
        var prefix=(this.rawdata.redirects?'':'redir-');
        var missing={};
        var classes={};
        if(r.pages) for(var i in r.pages){
            classes[r.pages[i].title] = [];
            missing[r.pages[i].title]=(typeof(r.pages[i].missing)!='undefined');
            if(typeof(r.pages[i].protection)!='undefined'){
                var x={};
                for(var j=r.pages[i].protection.length-1; j>=0; j--){
                    var p=prefix+'protection-'+r.pages[i].protection[j].type+'-'+r.pages[i].protection[j].level;
                    if(typeof(x[p])=='undefined'){
                        x[p]=1;
                        classes[r.pages[i].title].push(p);
                    }
                    if(r.pages[i].protection[j].expiry=='infinity'){
                        p+='-indef';
                        if(typeof(x[p])=='undefined'){
                            x[p]=1;
                            classes[r.pages[i].title].push(p);
                        }
                    }
                }
            }
        }
        Array.prototype.forEach.call(a, function(a){
            if(typeof(a.wikipage)=='undefined') return;
            if(typeof(redir[a.wikipage])!='undefined'){
                $(a).addClass('redirect');
                a.wikipage=redir[a.wikipage];
                a.title=a.wikipage;
                var cns=mw.config.get('wgCanonicalNamespace');
                if(a.wikipage==(cns?cns+':':'')+mw.config.get('wgTitle'))
                    $(a).addClass('self-redirect');
                if(missing[a.wikipage])
                    $(a).addClass('broken-redirect');
            }
            var m=a.href.match(/#.*/);
            if(m && m[0].substr(0,10)!=="#cite_note"){
                a.title=a.title.replace(/#.*/,'')+m[0].replace(/_/g,' ').replace(/\.([0-9A-F][0-9A-F])/gi, function(x,n){ return String.fromCharCode(parseInt(n,16)); });
            }
            if(typeof(classes[a.wikipage])!='undefined'){
                for(var j=classes[a.wikipage].length-1; j>=0; j--)
                    $(a).addClass(classes[a.wikipage][j]);
            }
            if(a.wikipage!=a.origwikipage && typeof(classes[a.origwikipage])!='undefined'){
                for(var j=classes[a.origwikipage].length-1; j>=0; j--)
                    $(a).addClass(classes[a.origwikipage][j]);
            }
        });
    },
 
    getPageName:function(url){
        var m=url.match(/\/wiki\/([^?#]+)/);
        if(!m) m=url.match(/\/w\/index.php\?(?:.*&)?title=([^&#]+)/);
        if(!m) return '';
        var t=decodeURIComponent(m[1]).replace(/_/g,' ');
        if(t.substr(0,6)=='Image:') t='File:'+t.substr(6);
        if(t.substr(0,11)=='Image talk:') t='File talk:'+t.substr(6);
        if(t.substr(0,8)=='Special:') t='';
        return t;
    },
 
    classifyChildren:function(node){
        mw.loader.using(['mediawiki.util','mediawiki.user'], function(){
            var a=node.getElementsByTagName('A');
            if(a.length==0) return;
            var self=LinkClassifier.getPageName(location.href);
            a=Array.prototype.map.call(a, function(a){
                a.wikipage='';
                if(/(^|\s)(external|extiw)(\s|$)/.test(a.className)) return '';
                if(!/(^|\s)(image)(\s|$)/.test(a.className)) a.className+=" nonimage";
                a.wikipage=LinkClassifier.getPageName(a.href);
                if(a.wikipage==self) a.wikipage='';
                a.origwikipage=a.wikipage;
                return a.wikipage;
            }).sort().filter(function(e,i,a){
                return e!=='' && (i==0 || a[i-1]!==e);
            });
 
            function processLinks(limit){
                var props = [];
                for ( var k in LinkClassifier.props ) {
                        props.push( k );
                }
                while(a.length>0){
                    var q={
                        format:'json',
                        action:'query',
                        rawcontinue:'',
                        titles:a.splice(0,limit).join('|'),
                        prop:'info',
                        redirects:1,
                        cllimit:'max',
                        inprop:'protection'
                    };
                    if ( props.length <= limit ) {
                        q.ppprop = props.join( '|' );
                    }
                    $.ajax({
                        url:mw.util.wikiScript('api'),
                        dataType:'json',
                        type:'POST',
                        data:q,
                        rawdata:q,
                        success:LinkClassifier.callback,
                        error:function(xhr,textStatus,errorThrown){
                            mw.log.warn(new Error('AJAX error: '+textStatus+' '+errorThrown));
                        }
                    });
                }
            }
 if(a.length>1000) return;
            if(a.length<=100){
                // Not worth querying the API to see if the user has apihighlimits
                processLinks(50);
            } else {
                // Note mw.user.getRights queries the API
                mw.user.getRights(function(rights){
                    processLinks( (rights.indexOf('apihighlimits')>=0) ? 500 : 50 );
                });
            }
        });
    },
 
    onLoad:function(){
        if(window.LinkClassifierOnDemand) return;
        if(window.AJAXPreview) window.AJAXPreview.AddOnLoadHook(LinkClassifier.classifyChildren);
        LinkClassifier.onDemand();
    },
 
    onDemand:function(){
        var node=document.getElementById('wikiPreview');
        if(!node) node=document.getElementById('bodyContent');
        if(node) LinkClassifier.classifyChildren(node);
    }
};
 
if(!window.LinkClassifierOnDemand) $(document).ready(LinkClassifier.onLoad);