/**
* @source: ]
* @author: ]
* @author: ]
* @author: ]
* Detector de desambiguações personalizado. Diferenças em relação ao script padrão da pt.wikipedia:
* 1) O script padrão sinaliza as páginas de desambiguação somente em modo de edição,
* ao passo que este detecta as páginas de desambiguação ao exibir a página e em modo de edição.
* Neste aspécto é similar ao script utilizado na es.wikipedia
* (MediaWiki:Gadget-DetectaDesambiguaciones.js - es:Wikipedia:Detector de desambiguaciones).
* 2) Detecta de páginas de desambiguação em uma maior quantidade de categorias, ao passo que
* o script padrão da wikipédia (MediaWiki:Gadget-desambiguações.js - Wikipédia:Detector de desambiguações),
* detecta desambiguações em três categorias.
* 3) Em função da maior quantidade de categorias analizadas, é mais lento que o script padrão.
*/
var bklCheck = {
cat : {
'Categoria:Desambiguação' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de nomes' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de prenomes' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de epônimos' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de sobrenomes' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de artes' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de cinema' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de literatura' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de música' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de teatro' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de Shakespeare' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de televisão' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de biologia' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de animais' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de vegetais' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de números' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de siglas' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de sinais' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de sinais' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de topônimos' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de praias' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Epônimos' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">d-Epônimo</sup>'},
'Categoria:Desambiguações de carnaval' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de comunicações' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de jornais' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de rádio' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de televisão' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de datas' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de esportes' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de espécies' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de ciências' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações sobre construções' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguação da Eurovisão' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguação de cinema' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de gêneros homônimos' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de história' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguação de cinema' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de santos' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:!Desambiguações de categorias' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'},
'Categoria:Desambiguações de predefinições' : {
className : 'bkl-link',
titleAppend : ' (desambiguação)',
htmlAppend : '<sup class="bkl-link-sup">desambig</sup>'}
},
queryUrlView : wgScriptPath + '/api.php?action=query&format=json'
+ '&prop=categories&pageids=' + wgArticleId + '&callback=bklCheck.viewResultArrived'
+ '&generator=links&redirects&gpllimit=max&gplnamespace=0&cllimit=max&indexpageids'
+ '&nocache=' + wgCurRevisionId, //Break client caching, when page has been edited
queryUrlPreview : wgScriptPath + '/api.php?action=query&format=json&prop=categories'
+ '&cllimit=max&redirects&indexpageids',
titles : {},
count : 0,
previewQueryCount : 0,
execute : function () {
if ( window.bklCheckOnlyCheckMainNS && wgNamespaceNumber != 0 ) return;
//Use &clcategories to reduce needed queries
var cats = ;
for ( var name in bklCheck.cat ) if ( bklCheck.cat.className )
cats.push( encodeURIComponent( name ) );
bklCheck.queryUrlView += '&clcategories=' + cats.join( '|' );
bklCheck.queryUrlPreview += '&clcategories=' + cats.join( '|' );
if ( wgAction == 'submit' ) bklCheck.doPreviewQueries();
else if ( wgAction == 'view' || wgAction == 'historysubmit' || wgAction == 'purge' )
mw.loader.load( bklCheck.queryUrlView );
else {//"Show preview on first edit" enabled?
var prev = document.getElementById( 'wikiPreview' );
if ( prev && prev.firstChild ) mw.loader.load( bklCheck.queryUrlView );
}
//Make sure that our style is put before other css so users can override it easily
var head = document.getElementsByTagName( 'head' );
head.insertBefore( mw.util.addCSS( '.bkl-link {background-color:#FFFF00;}' ), head.firstChild );
},
storeTitles : function ( res ) {
if ( !res || !res.query || !res.query.pageids ) return;
var q = res.query;
var redirects = {};
for ( var i = 0; q.redirects && i < q.redirects.length; i++ ) {
var r = q.redirects;
if ( !redirects ) redirects = ;
redirects.push( r.from );
}
for ( var i = 0; i < q.pageids.length; i++ ) {
var page = q.pages];
if ( page.missing === '' || page.ns !== 0 || !page.categories ) continue;
for ( var j = 0; j < page.categories.length; j++ ) {
var cat = bklCheck.cat.title];
if ( !cat ) continue;
bklCheck.count++;
bklCheck.titles = cat;
if ( !redirects ) break;
for ( var k = 0; k < redirects.length; k++ )
bklCheck.titles] = cat;
break;
}
}
},
markLinks : function () {
if ( !bklCheck.count ) return;
var links = bklCheck.getLinks( 'wikiPreview' ) || bklCheck.getLinks( 'bodyContent' )
|| bklCheck.getLinks( 'mw_contentholder' ) || bklCheck.getLinks( 'article' );
if ( !links ) return;
for ( var i = 0; i < links.length; i++ ) {
if ( links.className == 'image' ) continue; //Don't mess with images!
var cat = bklCheck.titles.title];
if ( !cat ) continue;
links.innerHTML = '<span class="' + cat.className + '" title="' + links.title
+ cat.titleAppend + '">' + links.innerHTML + cat.htmlAppend + '</span>';
}
},
viewResultArrived : function ( res ) {
bklCheck.storeTitles( res );
if ( res && res ) {
var c = res;
if ( c.categories ) {
mw.loader.load( bklCheck.queryUrlView + '&clcontinue='
+ encodeURIComponent( c.categories.clcontinue ) );
} else if ( c.links ) {
bklCheck.queryUrlView = bklCheck.queryUrlView.replace( /&gplcontinue=.*|$/,
'&gplcontinue=' + encodeURIComponent( c.links.gplcontinue ) );
mw.loader.load( bklCheck.queryUrlView );
}
} else bklCheck.markLinks();
},
PreviewQuery : function ( titles ) {
bklCheck.previewQueryCount++;
//We have to keep the titles in memory in case we get a query-continue
this.data = 'titles=' + titles.join( '|' );
this.doQuery( bklCheck.queryUrlPreview );
},
doPreviewQueries : function () {
var links = bklCheck.getLinks( 'wikiPreview' );
if ( !links ) return;
var titles=; var m;
var unique = {};
var rxEscape = function(s) {return s.replace( /(\{\}\\])/g, '\\$1' );};
var siteRegex = new RegExp( rxEscape( wgServer ) + rxEscape( wgArticlePath.replace( /\$1/, '' ) ) + '(*)' );
//We only care for main ns pages, so we can filter out the most common cases to save some requests
var namespaceRegex = /^((Usuário|Utilizador|Wikipédia|Ficheiro|MediaWiki|Predefinição|Ajuda|Categoria|Portal)(_Discussão)?|Especial|Discussão):/i;
for ( var i = 0; i < links.length; i++ ) {
if ( !links.title || !( m = links.href.match( siteRegex ) )
|| m.match( namespaceRegex ) || unique] ) continue;
unique] = true; //Avoid requesting same title multiple times
titles.push( m.replace( /_/g, '%20' ) ); //Avoid normalization of titles
if ( titles.length < 50 ) continue;
new bklCheck.PreviewQuery( titles );
titles=;
}
if ( titles.length ) new bklCheck.PreviewQuery( titles );
},
getLinks : function ( id ) {
var el = document.getElementById( id );
return el && el.getElementsByTagName( 'a' );
}
};
bklCheck.PreviewQuery.prototype.doQuery = function ( url ) {
var q = this;
var req = sajax_init_object();
if ( !req ) return;
req.open( 'POST', url, true );
req.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
req.onreadystatechange = function () {
if ( req.readyState == 4 && req.status == 200 )
eval( 'q.resultArrived(' + req.responseText + ');' );
};
req.send( q.data );
delete req;
};
bklCheck.PreviewQuery.prototype.resultArrived = function ( res ) {
bklCheck.storeTitles( res );
if ( res && res && res.categories ) {
this.doQuery( bklCheck.queryUrlPreview + '&clcontinue='
+ encodeURIComponent( res.categories.clcontinue ) );
} else bklCheck.previewQueryCount--;
if ( !bklCheck.previewQueryCount ) bklCheck.markLinks();
};
if ( wgNamespaceNumber >= 0 ) $( bklCheck.execute );