User:GZWDer/common.js
外观
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google Chrome、Firefox、Microsoft Edge及Safari:按住⇧ 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);