MediaWiki:Gadget-disFixer.js
Uwaga: aby zobaczyć zmiany po opublikowaniu, może zajść potrzeba wyczyszczenia pamięci podręcznej przeglądarki.
- Firefox / Safari: Przytrzymaj Shift podczas klikania Odśwież bieżącą stronę, lub naciśnij klawisze Ctrl+F5, lub Ctrl+R (⌘-R na komputerze Mac)
- Google Chrome: Naciśnij Ctrl-Shift-R (⌘-Shift-R na komputerze Mac)
- Internet Explorer / Edge: Przytrzymaj Ctrl, jednocześnie klikając Odśwież, lub naciśnij klawisze Ctrl+F5
- Opera: Naciśnij klawisze Ctrl+F5.
/*
disFixer v. 2.2.13
by Matma Rex, zmiany by ToSter
cc-by-sa 3.0
Użycie: wybierz disFixer w preferencjach
Szerszy opis: [[w:Wikipedia:Narzędzia/disFixer]].
*/
// FIXME: Use mw.messages.set see example [[s:MediaWiki:Gadget-iw-links.js]]
window.disStr = //strings - translate this!
{
name: 'disFixer',
descriptionPage: 'WS:Narzędzia/disFixer',
and: ' i ', //used in summary
autosummaryBegin: 'poprawa',
dabsShort: 'ujedn.',
redirsShort: 'przek.',
categoryDabPages: 'Kategoria:Strony ujednoznaczniające',
wikipediaDabPage: 'Pomoc:Strona ujednoznaczniająca',
fixLinks: 'Popraw linki do ujednoznacznień i przekierowań', //main button
fixLinksDisam: 'Popraw linki do ujednoznacznień',
fixLinksRedir: 'Popraw linki do przekierowań',
wait: 'Czekaj...', //main button after click
noRedirLinks: 'Brak linków do przekierowań.',
fixingInProgress: 'Rozwiązywanie przekierowań: trwa...',
fixRedirsOnly: 'Popraw przekierowania (Wykonaj także inne zmiany)', //Sama poprawa przekierowań nie ma sensu!)fix button if no dabs
fixButton: 'Popraw', //fix button
fixDabs: 'Popraw ujednoznacznienia:', //before list of dabs
viewDabPage: 'Zobacz stronę ujedn.', //title
scrollToLink: 'Przewiń do pozycji linku w tekście', //title
delink: 'odlinkuj', //last element in every list
fixRedirsCheckbox: 'popraw przekierowania',
otherTarget: 'inny cel...',
setNewLinkTarget: 'Dokąd ma prowadzić link?',
markDisambigsMissing: 'disFixer wymaga włączonego gadżetu <i>Kolorowanie linków wewnętrznych do stron ujednoznaczniających</i>'
};
mw.loader.using('ext.gadget.gConfig', function(){
// ustawienia
gConfig.register('disFixer', { name: disStr.name, descriptionPage: disStr.descriptionPage }, [
{
name: 'fixIfRedirsOnly',
desc: 'Wyświetl przycisk także wtedy, gdy do poprawy są same przekierowania.',
type: 'boolean',
deflt: true,
legacy: [window, 'disFixIfRedirsOnly']
},
{
name: 'markAsMinor',
desc: 'Oznacz zmiany jako małe.',
type: 'boolean',
deflt: false,
legacy: [window, 'disMarkAsMinor']
},
{
name: 'useOldRedirFixing',
desc: '[zaawansowane] Używaj starego sposobu rozwiązywania przekierowań.',
type: 'boolean',
deflt: false,
legacy: [window, 'useOldRedirFixing']
}
]);
function disCallApi( request, callback ) {
request.format = 'json';
jQuery.post( mw.util.wikiScript( 'api' ), request, callback, 'json' );
}
window.disScrollToLink = function(target)
{
if (typeof disHighlightedLinkTimeout != 'undefined' && typeof disHighlightedLink != 'undefined') {
clearTimeout(disHighlightedLinkTimeout);
disHighlightedLink.css('background', '');
}
window.disHighlightedLink = $(dis).filter('[title="' + target.replace('"', '\\"') + '"]').first();
disHighlightedLink.css('background', 'red');
window.disHighlightedLinkTimeout = setTimeout(function() {
disHighlightedLink.css('background', '');
}, 3000);
disHighlightedLink.get(0).scrollIntoView();
};
function disLoadFixer()
{
window.dis = $('#mw-content-text a.mw-disambig').not('table.disambig a.mw-disambig').get();
window.disRedirs = $('#mw-content-text a.mw-redirect').get();
//nie ma disambigów, na pewno - nic do roboty
//korekta konfiguracji (disRedirs.length == 0) { //!gConfig.get('disFixer', 'fixIfRedirsOnly') || - dodaj po naprawie konfiguracji 107
if (dis.length === 0) {
if (!gConfig.get('disFixer', 'fixIfRedirsOnly') || disRedirs.length === 0) {
return; //możliwość wymuszenia sprawdzania mimo braku disambigów, ale tylko, gdy są rediry
}
}
var txt = disStr.fixLinks;
if (dis.length === 0) {
txt = disStr.fixLinksRedir;
}
else if (disRedirs.length === 0) {
txt = disStr.fixLinksDisam;
}
var el = '<input id="disBeginButton" type="submit" class="disFixerButton" value="' + txt + '" />';
$('h1:first').before(el);
$('#disBeginButton').click(function() {
try {
$('#disBeginButton').val(disStr.wait);
} catch(er){}
disBegin();
});
}
function disBegin()
{
var el = '<div id="disRedirsStatus"></div>';
$('h1:first').before(el);
$('#disRedirsStatus').append('<input type="checkbox" id="disFixRedirsCheckbox" style="display:none" />');
if (window.disRedirs.length === 0) {
$('#disRedirsStatus').append(disStr.noRedirLinks);
}
else {
$('#disRedirsStatus').append(disStr.fixingInProgress);
}
var titles = [];
var i;
for (i = 0; i < dis.length; i++) {
titles.push(dis[i].title);
}
disCallApi( {
action: 'query',
prop: 'links',
titles: titles.join( '|' ),
plnamespace: 0,
pllimit: 'max'
}, function( data ) {
disCallback( data );
} );
if (window.disRedirs.length > 0) {
var titles2 = [];
for (i = 0; i < disRedirs.length; i++) {
titles2.push(disRedirs[i].title);
}
if (gConfig.get('disFixer', 'useOldRedirFixing')) {
disCallApi( {
action: 'query',
redirects: '',
titles: titles2.join( '|' )
}, function( data ) {
disRedirCallback( data );
} );
}
else {
disCallApi( {
action: 'query',
prop: 'revisions',
rvprop: 'content',
titles: titles2.join( '|' )
}, function( data ) {
disRedirCallback2( data );
} );
}
}
}
//if (typeof res.query == 'undefined' && true) { // gConfig.get('disFixer', 'fixIfRedirsOnly') 189
function disCallback(res)
{
if (typeof res.query == 'undefined' && gConfig.get('disFixer', 'fixIfRedirsOnly')) {
var el = '<div id="disContainer"><input type="submit" class="disFixerButton" value="' + disStr.fixRedirsOnly
+ '" style="font-weight:bold;color:red" /></div>';
$('#disBeginButton').replaceWith(el);
$('#disContainer input').click(disSend);
}
else {
var addScrollToLink = $('#content').get(0).scrollIntoView;
var pages = res.query.pages;
var str = disStr.fixDabs + '<br>';
var i;
for (i in pages) {
if (isNaN(+i)) continue; //prototypes, damn
var page = pages[i];
str +=
'<label>' + page.title + ' '
+ '<a href="/w/index.php?title=' +encodeURIComponent(page.title) + '" title="' + disStr.viewDabPage
+ '" target="_new">⇗</a>'
+ (addScrollToLink ? '<a href="javascript:disScrollToLink(' + '\'' + page.title
+ '\'' + ')" title="' + disStr.scrollToLink + '">⇓</a>'
: '')
+ ': <select id="input-dislink' + page.title + '">';
str += '<option>' + page.title + '</option>';
if (typeof page.links == 'undefined') {
page.links = [];
}
for (i = 0; i < page.links.length; i++) {
str += '<option>' + page.links[i].title + '</option>';
}
str += '<option style="color:grey">[' + disStr.delink + ']</option>';
str += '</select> <input type="submit" class="disFixerButton" onclick="disSetLinkTarget(this,'
+ '\'' + page.title + '\'' + ')" value="' + disStr.otherTarget + '" /></label><br>';
}
$('#disBeginButton').replaceWith('<div id="disContainer">' + str
+ '<input type="submit" class="disFixerButton" value="' + disStr.fixButton + '" /></div>');
$('#disContainer input:last').click(disSend);
}
}
function disRedirCallback(res)
{
window.disResolvedRedirs = res.query.redirects;
var el = '<input type="checkbox" id="disFixRedirsCheckbox" checked="checked" /> '
+ '<label for="disFixRedirsCheckbox">' + disStr.fixRedirsCheckbox
+ ' (' + disResolvedRedirs.length + ')</label>';
$('#disRedirsStatus').html(el);
$('#disRedirsStatus').css('color', 'green');
}
function disRedirCallback2(res)
{
var pages = res.query.pages;
window.disResolvedRedirs = [];
for (var i in pages) {
if (isNaN(i)) continue;
var f = pages[i].title;
var t = pages[i].revisions[0]['*'].replace(/^#(?:REDIRECT|TAM|PATRZ|PRZEKIERUJ)\s*\[\[([^\]]+)\]\][\s\S]*$/i, '$1');
if (t.match(/[<>\[\]|{}\r\n]/)) {
//coś się pomieszało - tych znaków nie powinno być w tytule strony
continue;
}
window.disResolvedRedirs.push({from:f, to:t});
}
var el = '<input type="checkbox" id="disFixRedirsCheckbox" checked="checked" /> '
+ '<label for="disFixRedirsCheckbox">' + disStr.fixRedirsCheckbox
+ ' (' + disResolvedRedirs.length + ')</label>';
$('#disRedirsStatus').html(el);
$('#disRedirsStatus').css('color', 'green');
}
function disSend()
{
var inputs = $('#disContainer select');
var toFix = [];
for (var i = 0; i < inputs.length; i++) {
var from = inputs[i].options[0].value;
var to = inputs[i].value;
if (from == to) continue;
toFix.push(from + '~' + to);
}
createCookie('disFixDis' + mw.config.get('wgPageName'), toFix.join('|'), 0);
if (typeof disResolvedRedirs != 'undefined' && $('#disFixRedirsCheckbox').prop('checked')) {
toFix = [];
for (var i = 0; i < disResolvedRedirs.length; i++) {
var from = disResolvedRedirs[i].from;
var to = disResolvedRedirs[i].to;
toFix.push(from + '~' + to);
}
createCookie('disFixRedirs' + mw.config.get('wgPageName'), toFix.join('|'), 0);
}
window.location = mw.util.getUrl( mw.config.get('wgPageName'), { action: 'edit' } );
}
function disOnloadEdit()
{
var whatIsFixed = [];
var str = $('#wpTextbox1').val();
str = str.replace(/\r\n/g,'\n').replace(/\s*$/, '');
str = disCleanLinks(str);
var linksDisam = readCookie('disFixDis' + mw.config.get('wgPageName'));
var linksRedir = readCookie('disFixRedirs' + mw.config.get('wgPageName'));
var links = new Array();
if (linksDisam != null && linksDisam != 'undefined' && linksDisam != '') {
links = linksDisam.split('|');
whatIsFixed.push(disStr.dabsShort);
}
if (linksRedir != null && linksRedir != 'undefined' && linksRedir != '') {
links = $.merge(links, linksRedir.split('|'));
whatIsFixed.push(disStr.redirsShort);
}
if (links.length > 0) {
for (var i = 0; i < links.length; i++) {
var l = links[i].split('~');
var from = l[0].replace(/([\/\.\*\+\?\|\(\)\[\]\{\}\\])/g, '\\$1') //regex escape
var to = l[1];
var safe_from = '['+from.substring(0,1).toLowerCase()+from.substring(0,1).toUpperCase()+']'+from.substring(1);
if (to == '[' + disStr.delink + ']') {
str = str.replace(new RegExp('\\[\\[(' + safe_from + ')(?:#[^\\]\\|]+|)\\]\\]', 'g'), '$1');
str = str.replace(new RegExp('\\[\\[' + safe_from + '(?:#[^\\]\\|]+|)\\|([^\\]]+)\\]\\]', 'g'), '$1');
continue;
}
var sh = to.indexOf('#') != -1;
str = str.replace(new RegExp('(\\[\\[|poprzedni *\\= *|następny *\\= *)(' + safe_from + ')(#[^\\]\\|]+|)(\\]\\]|\\n)', 'g'),function replacer(match, p1, p2, p3, p4) {return (p1 + (sh ? to : to + p3) + (p4 === ']]' ? '|' + p2 + p4 : p4));});
str = str.replace(new RegExp('\\[\\[' + safe_from + '(#[^\\]\\|]+|)\\|([^\\]]+)\\]\\]', 'g'), '[[' + (sh ? to : to + '$1') + '|$2]]');
}
}
str = disCleanLinks(str);
eraseCookie('disFixDis' + mw.config.get('wgPageName'));
eraseCookie('disFixRedirs' + mw.config.get('wgPageName'));
if (whatIsFixed.length == 0) {
return;
}
$('#wpTextbox1').val(str);
var newval = $('#wpSummary').val() + '[[' + disStr.descriptionPage + '|' + disStr.autosummaryBegin
+ ' ' + whatIsFixed.join(disStr.and) + ']]';
$('#wpSummary').val(newval);
if (gConfig.get('disFixer', 'markAsMinor')) {
$('#wpMinoredit').prop('checked', 'checked');
}
$('#wpDiff').click();
}
window.disSetLinkTarget = function(el, disName) //helper - for buttons
{
el = $(el); // to jquery object
var target = prompt(disStr.setNewLinkTarget, disName);
if (!target || $.trim(target) === '') {
return;
}
var opt = '<option value="' + target + '">' + target + '</option>';
var sel = el.parent().find('select:first');
sel.append(opt);
sel.find('option:last').prop('selected', 'selected');
}
// based on Nux's code cleanup
// http://pl.wikipedia.org/wiki/Wikipedysta:Nux/wp_sk.js
function disCleanLinks(str)
{
//najprostszy cleanup, głównie po to, żeby regeksy do poprawy linków mogły być prostsze
// [[Kto%C5%9B_jaki%C5%9B#co.C5.9B|...]]›[[Ktoś jakiś#coś|...]]
str = str.replace(/\[\[([^|#\]]*)([^|\]]*)(\||\]\])/g, function(a, name, anchor, end)
{
try {
var name = decodeURIComponent(name);
var anchor = decodeURIComponent(anchor.replace(/\.([0-9A-F]{2})\.([0-9A-F]{2})/g, '%$1%$2'));
a = '[[' + name + anchor + end;
} catch(err){} // błąd na linkach typu [[%]]
return a.replace(/_/g, ' ');
});
//
// (ro)zwijanie wikilinków - ####na ws niestosowane
// [[Link|link]] > [[link]] i [[Link|linka]] > [[link]]a
//str = str.replace(/\[\[([^|\]])([^|\]]*)\|([^\]])\2([a-zżółćęśąźń]*)\]\]/g, function (a, w1_1, w_rest, w2_1, poza)
str = str.replace(/\[\[([^|\]]*)\|([^|\]]*)\]\]/g, function (a, w1_1, w2_1)
{
return (w1_1===w2_1) ? '[['+w2_1+']]' : a;
});
// [[Link|link]]er > [[Link|linker]] ####na ws niestosowane
//str = str.replace(/\[\[([^|\]]+)\|([^|\[\]]+)\]\]([a-zżółćęśąźń]+)/g, '[[$1|$2$3]]');
// usuwanie spacji w wikilinkach (czy // sprawdziłyby się u nas?)
str = str.replace(/\[\[ *([^\]\|:]*[^\]\| ]) *\|/g, '[[$1|');
//str = str.replace(/([^ \t\n])\[\[ +/g, '$1 [[');
str = str.replace(/\[\[ +/g, '[[');
//str = str.replace(/([^ \t\n])\[\[([^\]\|:]+)\| +/g, '$1 [[$2|');
str = str.replace(/\[\[([^\]\|:]+)\| +/g, '[[$1|');
//str = str.replace(/([^ \|]) +\]\]([^ \t\na-zA-ZżółćęśąźńŻÓŁĆĘŚĄŹŃ])/g, '$1]] $2');
//str = str.replace(/([^ \|]) +\]\]([^a-zA-ZżółćęśąźńŻÓŁĆĘŚĄŹŃ])/g, '$1]]$2');
return str;
}
// http://www.quirksmode.org/js/cookies.html
// modified to use sessionStorage when available
function createCookie(name, value, days)
{
if(window.sessionStorage)
{
if (days < 0) sessionStorage.removeItem(name);
else sessionStorage[name] = value;
}
else
{
// fall back to cookies
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
var expires = "; expires=" + date.toGMTString();
}
else var expires = "";
document.cookie = escape(name) + "=" + escape(value) + expires + "; path=/";
}
}
function readCookie(name)
{
if(window.sessionStorage)
{
return (sessionStorage[name]) + '' //weird Firefox fix / FIXME: is this still needed for anything?
}
else
{
var nameEQ = escape(name) + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return unescape(c.substring(nameEQ.length,c.length));
}
return null;
}
}
function eraseCookie(name)
{
createCookie(name, "", -1);
}
/*
AND FINALLY ONLOAD
*/
if ( mw.config.get( 'wgAction' ) == 'edit' && mw.config.get( 'wgNamespaceNumber' ) !== 102 ) {
jQuery( document ).ready( function() {
disOnloadEdit();
} );
}
// Do not show interface, when previewing the page or on talk pages
if (
mw.config.get( 'wgAction' ) != 'submit' && mw.config.get( 'wgNamespaceNumber' ) % 2 == 0
&& mw.config.get( 'wgNamespaceNumber' ) !== 2600 && mw.config.get( 'wgNamespaceNumber' ) !== 102 // Flow's 'Topic' namespace; Index ns
) {
// Make sure the required dependency is loaded
mw.loader.using( ['ext.gadget.mark-disambigs'], function() {
if ( typeof( markDisambigsGadget ) === "undefined" ) {
jQuery( document ).ready( function() {
mw.notify( disStr.markDisambigsMissing );
} );
} else {
// register callback
markDisambigsGadget.addCallback( function() {
disLoadFixer();
} );
}
} );
}
}); // end mw.loader.using