--=REKLAMA=--
Uwaga: aby zobaczyć zmiany po zapisaniu, może zajść potrzeba wyczyszczenia pamięci podręcznej przeglądarki.
/* disFixer v. 2.2.7 by Matma Rex, zmiany by ToSter cc-by-sa 3.0 Użycie: wybierz disFixer w preferencjach Szerszy opis: [[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: 'WP:Narzędzia/disFixer', and: ' i ', //used in summary autosummaryBegin: 'poprawa linków do', dabsShort: 'ujedn.', redirsShort: 'przek.', categoryDabPages: 'Kategoria:Strony ujednoznaczniające', wikipediaDabPage: 'Wikipedia: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: false, legacy: [window, 'disFixIfRedirsOnly'] }, { name: 'markAsMinor', desc: 'Oznacz zmiany jako małe.', type: 'boolean', deflt: false, legacy: [window, 'disMarkAsMinor'] }, { name: 'codeCleanup', desc: 'Automatycznie uruchom WP:SK po każdej zmianie.', type: 'boolean', deflt: false, legacy: [window, 'disCodeCleanup'] }, { 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 = $('a.mw-disambig').get(); window.disRedirs = $('a.mw-redirect').get(); //nie ma disambigów, na pewno - nic do roboty 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 = []; for (var 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 (var 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 ); } ); } } } 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 />'; for (var 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 (var 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 />'; } var el = '<div id="disContainer">' + str + '<input type="submit" class="disFixerButton" value="' + disStr.fixButton + '" /></div>'; $('#disBeginButton').replaceWith(el); $('#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').attr('checked')) { var 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); } var edittab = document.getElementById('ca-editsource') || document.getElementById('ca-edit'); window.location = $(edittab).find('a:first').attr('href'); } function disOnloadEdit() { var whatIsFixed = []; var str = $('#wpTextbox1').val(); str = str.replace(/\r\n/g,'\n').replace(/\s*$/, ''); if (gConfig.get('disFixer', 'codeCleanup') && typeof wp_sk !== 'undefined') { str = wp_sk.cleaner(str); } else { 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('\\[\\[(' + safe_from + ')(#[^\\]\\|]+|)\\]\\]', 'g'), '[[' + (sh ? to : to + '$2') + '|$1]]'); 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) + ']]' + (gConfig.get('disFixer', 'codeCleanup') ? ', [[WP:SK]]' : ''); $('#wpSummary').val(newval); if (gConfig.get('disFixer', 'markAsMinor')) { $('#wpMinoredit').attr('checked', 'checked'); } $('#wpDiff').click(); } window.disSetLinkTarget = function(el, disName) //helper - for buttons { el = $(el); // to jquery object var target = prompt(disStr.setNewLinkTarget, disName); if (typeof target == 'undefined' || target == '') { return; } var opt = '<option value="' + target + '">' + target + '</option>'; var sel = el.parent().find('select:first'); sel.append(opt); sel.find('option:last').attr('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, ' '); }); // [[Link|link]] > [[link]] str = str.replace(/\[\[([^|\]])([^|\]]*)\|([^\]])\2\]\]/g, function (a, w1_1, w_rest, w2_1) { return (w1_1.toUpperCase() == w2_1.toUpperCase()) ? '[[' + w2_1 + w_rest + ']]' : a; }); // (ro)zwijanie wikilinków str = str.replace(/\[\[([^|\]]*)\|\1([a-zA-ZżółćęśąźńŻÓŁĆĘŚĄŹŃ]*)\]\]/g, '[[$1]]$2'); str = str.replace(/\[\[([^|\]]+)\|([^|\]]+)\]\]([a-zA-ZżółćęśąźńŻÓŁĆĘŚĄŹŃ]+)/g, '[[$1|$2$3]]'); // usuwanie spacji w wikilinkach 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' ) { jQuery( document ).ready( function() { if ( gConfig.get('disFixer', 'codeCleanup') && typeof wp_sk === 'undefined' ) { // Wait for RL to load WP:SK mw.loader.using( 'ext.gadget.wp_sk', function() { disOnloadEdit(); } ); } else { 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 ) { // Make sure the required dependency is loaded mw.loader.using( ['ext.gadget.mark-disambigs-core'], function() { if ( typeof( markDisambigsGadget ) === "undefined" ) { jQuery( document ).ready( function() { jsMsg( disStr.markDisambigsMissing ); } ); } else { // register callback markDisambigsGadget.addCallback( function() { disLoadFixer(); } ); } } ); } }); // end mw.loader.using