Wikisłownikarz:Derbeth/sk.js

Z Wikisłownika – wolnego słownika wielojęzycznego

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.
/*<pre><nowiki>*/

var wt_sk = new Object();
// wersja wyświetlana w dymku przy przycisku
var wiktSkVer = '0.22.1';
// jeśli =true, to usuwa np. coś takiego: rzeczownik, rodzaj żeński, męski
wt_sk.usuwajWszystkieNiewypelnione = false;

wt_sk.icon = 'http://upload.wikimedia.org/wikipedia/commons/2/2e/Button_broom.png';
wt_sk.waitIcon = 'http://upload.wikimedia.org/wikipedia/commons/c/cc/Bouton_Vandale2.png';
wt_sk.inactiveIcon = 'http://upload.wikimedia.org/wikipedia/commons/f/f3/Button_broom2.png';
wt_sk.buttonId = 'wiktSkButton';
wt_sk.jezykBezJezyk = 'dżuhuri|esperanto|ewe|hindi|ido|interlingua|inuktitut|jèrriais|jidysz|ladino|lingala|lojban|novial|papiamento|pitjantjatjara|sanskryt|slovio|sranan tongo|tetum|tok pisin|tupinambá|użycie międzynarodowe|volapük|zarfatit|znak chiński|hiri motu';
wt_sk.polskieZnakiSort = new Array('aä','ą','ã','á','b','c','ć','d','e','ę','f',
'g','h','i','j','k','l','ł','m','n','oö','ó','p','q','r','s','ś','t','uü','v',
'w','x','y','z','ź','ż');
wt_sk.SORT_NOTFOUND = 1000;

wt_sk.preloadedWaitIcon = new Image(23,22);
// tablica typu 'rosyjski' => funkcja przyjmująca tekst rosyjskiej funkcji i zwracająca poprawiony
wt_sk.poprawSekcje = Array();

wt_sk.kolejnoscZnaku = function(znak) {
	for (var i=0; i<wt_sk.polskieZnakiSort.length; ++i) {
		if (wt_sk.polskieZnakiSort[i].indexOf(znak) != -1) {
			return i;
		}
	}
	return wt_sk.SORT_NOTFOUND;
}

// -1 gdy str1 jest mniejszy od str2, 0 gdy równe, 1 gdy str2 > str1
wt_sk.porownajNapisy = function(str1,str2) {
	// mniejsza z długości
	var len = (str1.length < str2.length) ? str1.length : str2.length;
	str1 = str1.toLocaleLowerCase();
	str2 = str2.toLocaleLowerCase();
	for (var i=0; i<len; ++i) {
		var sort1 = wt_sk.kolejnoscZnaku(str1.charAt(i));
		var sort2 = wt_sk.kolejnoscZnaku(str2.charAt(i));
		if (sort1 == wt_sk.SORT_NOTFOUND && sort2 == wt_sk.SORT_NOTFOUND) { // dwa niepolskie znaki
			var locComp = str1.charAt(i).localeCompare(str2.charAt(i));
			if (locComp != 0) {
				return locComp;
			}
		} else {
			if (sort1 < sort2) return -1;
			if (sort1 > sort2) return 1;
		}
	}
	return (str1.length < str2.length) ? -1 : ((str1.length < str2.length) ? 0 : 1);
}

wt_sk.trim = function(str) {
   str = str.replace(/ $/gm, "");
   return str.replace(/^\s*|\s*$/g, "");
}

function TurnFirstToLower(input) {
  if (input != "")
  {
    var input = wt_sk.trim(input);
    var temp = input.substr(0, 1);
    return temp.toLowerCase() + input.substr(1, input.length);
  }
  else
    return "";
}

wt_sk.escapeRegex = function(txt) {
	txt = txt.replace(/([{[\]|()])/g, "\\$1");
	return txt;
}

// changeFunc - funkcja, która bierze tekst i zwraca tekst po zmianach
// begin, end - czysty tekst (nie wyr. reg.), między którymi ma zawierać się
// tekst, który będzie podany do funkcji
// jeśli begin i end nie zostaną znalezione, nic nie jest edytowane
function changeTextBetween(str, begin,end,changeFunc) {
	var matches = str.split(new RegExp(wt_sk.escapeRegex(end)));
	if(matches.length == 2) {
		var mid = matches[0], after = matches[1];
		var midMatches = mid.split(new RegExp(wt_sk.escapeRegex(begin)));
		if (midMatches.length == 2) {
			var before = midMatches[0], target = midMatches[1];
			target = changeFunc(target);
			str = before + begin + target + end  + after;
		}
	}
	return str;
}

// zmienia tekst od wystąpienia "begin" do końca lub wystąpienia "optionalEnd"
function changeTextUntil(str, begin,optionalEnd,changeFunc) {
	var matches = str.split(new RegExp(wt_sk.escapeRegex(begin)));
	if(matches.length == 2) {
		var before = matches[0], mid = matches[1];
		var midMatches = mid.split(new RegExp(wt_sk.escapeRegex(optionalEnd)));
		if (midMatches.length == 2) {
			var target = midMatches[0], after = midMatches[1];
			target = changeFunc(target);
			str = before + begin + target + optionalEnd  + after;
		} else if (midMatches.length == 1) {
			target = mid;
			target = changeFunc(target);
			str = before + begin + target;
		}
	}
	return str;
}

function changeTextAfter(str,splitBy,changeFunc) {
	var m = str.split(new RegExp(wt_sk.escapeRegex(splitBy)));
	if (m.length == 2) {
		var before = m[0];
		var text = m[1];
		text = changeFunc(text);
		str = before + splitBy + text;
	}
	return str;
}

wt_sk.buttonIsActive = function() {
	if (!wgUserGroups) {
		return false;
	}
	for (var i=0; i<wgUserGroups.length; ++i) {
		if (wgUserGroups[i] == 'autoconfirmed') {
			return true;
		}
	}
	return false;
}

// Dodaje opis w opisie zmian, o ile takiego nie bylo
wt_sk.dodajOpis = function()
{
	var opis = "[[WS:NSK|WS:SK]]";
	if ("a b".split(/( )/g).length != 3) { // IE albo inny diabeł
		opis += ' (niepełne działanie pod Internet Explorerem)';
	}

	var wpS = document.forms.editform.wpSummary;
	wpS.value=wt_sk.trim(wpS.value);
	if (wpS.value.indexOf(opis)<0) 
		if (wpS.value.substring(wpS.value.length,wpS.value.length-2)=="*\/")
			wpS.value = wpS.value +" "+ opis;
		else
			if (wpS.value.length>0)
				wpS.value = wpS.value +", "+ opis;
			else
				wpS.value = opis;
}

wt_sk.verify = function() {
	var wpS = document.forms.editform.wpSummary;
	var warnJaki = '(UWAGA: sekcja "język jaki" - skrypt SK nie dokończył działania)';
	wpS.value = wpS.value.replace(warnJaki, '');
	if (document.editform.wpTextbox1.value.match(/\{\{język jaki\}\}/)) {
		wpS.value += ' ' + warnJaki;
	}
}

wt_sk.rozne = function(str)
{
	str = str.replace(/\t/g, " "); // Zamienia tabulatory na spacje

// Standaryzujemy końce wiersza
	str = str.replace(/(\r)(\n)/gm, "$2"); // Konwersja uszkodzonych końców wiersza UNIX-DOS
	str = str.replace(/\r/gm, "\n");
	str = str.replace(/(\r)(\n)/gm, "$2");

	str = str.replace(/^ ? ? (\n)/gm, "$1"); // Usuwanie spacji w wierszy z samymi spacjami
	str = str.replace(/(\n\n)\n+/gm, "$1");  // Usuwanie drugiej pustej linii - może być tylko jedna

//Spacje na końcach i początkach wierszy
	str = str.replace(/ ? ?<br \/> ? ?/gi, "<br />"); // Usuwamy spacje sprzed i zza znaku łamania wiersza
	str = str.replace(/^ /gm, ""); // Usuwamy spacje z początku wiersza
	str = str.replace(/ $/g, ""); // Usuwamy spacje z końca wiersza
// Naprawa kategorii
	str = str.replace(/\[\[ ?([Cc]ategory|[Kk]ategoria) ?: ?/g, "[[Kategoria:");
	str = str.replace(/(\]\])(\[\[Kategoria:)/g, "$1\n$2");
// Jednostki
	str = str.replace(/&#150;|&#8211;|&#x2013;/g, "&ndash;");
	str = str.replace(/&#151;|&#8212;|&#x2014;/g, "&mdash;");
	str = str.replace(/(cm| m|km|mi)<sup>2<\/sup>/g, "$1²");
	str = str.replace(/&sup2;/g, "²");
	str = str.replace(/&deg;/g, "°");
	//replace html with wiki syntax
	if( !str.match(/'<\/?[ib]>|<\/?[ib]>'/gi) )
	{
		str = str.replace(/<i>(.*)<\/i>/gi, "''$1''");
		str = str.replace(/<b>(.*)<\/b>/gi, "'''$1'''");
	}
	str = str.replace(/<br\/>/gi, "<br />");
	str = str.replace(/<br>/gi, "<br />");
	str = str.replace(/ ? ?<br \/> ? ?/gi, "<br />");

// Inne
// Wymieniamy w linkach [[w:pl: na [[w:
	str = str.replace(/\[\[w\:pl\:/gi, "[[w:");
// Opuszczanie "szablon:" w {{szablon:ddd}}
        str = str.replace(/\{\{[\s]*szablon[\s]*:[\s]*/gi, "{{");

	return wt_sk.trim(str);
}

// Dekodowanie linków z [[w:Wikipedysta:Nux/wp sk.js]]
wt_sk.rLinkdecode = function(a,name,anchor,end)
{
	try
	{
		name=decodeURIComponent(name)
		anchor=decodeURIComponent(anchor.replace(/\.([0-9A-F]{2})\.([0-9A-F]{2})/g,'%$1%$2'))
		a='[['+name+anchor+end;
	}
	catch(err){}
 
	return a.replace(/_/g,' ');
}

//formats links in standard fashion
wt_sk.linkfixer = function(str, checkImages)
{ 
//	str = str.replace(/\]\[/g, "] [");
	// [[Kto%C5%9B_jaki%C5%9B#co.C5.9B|...]]→[[Ktoś jakiś#coś|...]]
	str = str.replace(/\[\[([^|#\]]*)([^|\]]*)(\||\]\])/g, wt_sk.rLinkdecode);

	var m = str.match(/\[?\[[^\]]*\]\]?/g);
	if (m)
	{
		for (var i = 0; i < m.length; i++)
		{
			var x = m[i].toString();
			var y = x;

	//internal links only
			if ( !y.match(/^\[?\[http:\/\//mi) && !y.match(/^\[?\[image:/mi) )
			{
				if (y.indexOf(":") == -1 && y.substr(0,3) != "[[_" && y.indexOf("|_") == -1)
				{
					if (y.indexOf("|") == -1)
						y = y.replace(/_/g, " ");
					else
						y = y.replace( y.substr(0, y.indexOf("|")), y.substr(0, y.indexOf("|")).replace(/_/g, " "));
				}  
	
				y = y.replace(/ ?\| ?/, "|");
	
			}

			str = str.replace(x, y);
		}
	}

	//repair bad internal links
	str = str.replace(/\[\[ +([^\]]*)\]\]/g, "[[$1]]");
	str = str.replace(/\[\[([^\]]*)( |_)#([^\]]*)\]\]/g, "[[$1#$3]]");
	str = str.replace(/ +(\]\]|\}\})/g, '$1');
	str = str.replace(/\{\{ +/g, '{{');

	//repair bad external links
	str = str.replace(/\[?\[http:\/\/([^\]]*)\]\]?/gi, "[http://$1]");
	str = str.replace(/\[http:\/\/([^\]]*)\|([^\]]*)\]/gi, "[http://$1 $2]");
	
	// [[dobr<y?a>]] -> [[dobry|dobra]], [[<s?S>łowo]] -> [[słowo|Słowo]], [[<s?S>łow<o?a>]] -> [[słowo|Słowa]]
	str = str.replace(/\[\[<([^|#\]=?]+)\?([^|#\]=>]*)>([^|#\]=>]+)(<([^|#\]=?]+)\?([^|#\]=>]*)>)?\]\]/g, '[[$1$3$5|$2$3$6]]');
	str = str.replace(/\[\[([^|#\]=<]+)<([^|#\]=?]+)\?([^|#\]=>]*)>(=[^|#\]=]+)?\]\]/g, '[[$1$2$4|$1$3]]'); 
	
	//Wikisłownik: [[coś=polski]], [[coś=język polski]] -> [[coś#coś (język polski)|coś]]
	var skrotyJezykow = {'da': 'język duński', 'dsb': 'język dolnołużycki', 'de': 'język niemiecki',
		'en': 'język angielski', 'es': 'język hiszpański', 'eo': 'esperanto',
                'fr': 'język francuski', 'hsb': 'język górnołużycki', 'ia': 'interlingua', 'it': 'język włoski', 'nbk': 'język norweski (bokmål)',
                'pl': 'język polski', 'sv': 'język szwedzki'};
	for (var skrot in skrotyJezykow) {
		str = str.replace(new RegExp('='+skrot+'(]]|\\|)', 'g'), '='+skrotyJezykow[skrot]+'$1');
	}
	dopiszJezyk = function(nazwa) {
		if (nazwa.search(/^język/) == -1 && nazwa.search(new RegExp(wt_sk.jezykBezJezyk,'i')) == -1) {			
			nazwa = 'język ' + nazwa;
		}
		return nazwa;
	}
	str = str.replace(/\[\[([^|#\]=]+)=([^|#\]]+)\|/g, function(m, m1, m2) {
		m2 = dopiszJezyk(m2);
		return '[['+m1+'#'+m1+' ('+m2+')|'; 
	});
	str = str.replace(/\[\[([^|#\]=]+)=([^|#\]]+)\]\]/g, function(m, m1, m2) {
		m2 = dopiszJezyk(m2);
		return '[['+m1+'#'+m1+' ('+m2+')|'+m1+']]'; 
	});

	return wt_sk.trim(str);
}

//fixes images
wt_sk.imagefixer = function(str)
{
	// Naprawa odwołań do grafiki
	str = str.replace(/\[\[(Image|Grafika|File|Plik)\: */gmi, "[[Plik:");
	str = str.replace(/\[\[(Image|Grafika|File|Plik)\: *(Image|Grafika|File|Plik)\: */gmi, "[[Plik:");

	//remove external images
	str = str.replace(/\[?\[(?:image|grafika|file|plik):http:\/\/([^\]]*)\]\]?/gi, "[http://$1]");
	//fix links within internal images
	var m = str.match(/\[\[(?:image|grafika|file|plik):[^\[\]\n]*(\[?\[[^\]\n]*\]*[^\[\]\n]*)*\]+/gi);
	if (m)
	{
		for (var i = 0; i < m.length; i++)
		{
			var x = m[i].toString();
			var y = x;

			y = y.replace(/^\[\[p/mi, "P").replace(/\]\]$/, ""); // P bo Plik
			y = y.replace(/(\[[^\]]*)$/, "$1]");
			y = wt_sk.linkfixer(y, true);
			y = "[[" + y + "]]";

			str = str.replace(x, y);
		}
	}

	return wt_sk.trim(str);
}

//simplifies some links e.g. [[dog|dog]] to [[dog]] and [[dog|dogs]] to [[dog]]s
wt_sk.linksimplifyer = function(str)
{
	// ważne: nie powinien poprawiać Massen[[Sprint|sprint]], dlatego wcześniej
	// musi być spacja albo cudzysłów
	var m = str.match(/(?:^| |\n|,|;|'|"|\u201E)\[\[([^\[]*)\|([^\[]*)\]\]/g); //"'
	if (m)
	{
		for (var i = 0; i < m.length; i++)
		{
			var n_arr = m[i].toString().match(/\[\[([^\[]*)\|([^\[]*)\]\]/);
			var n = n_arr[0];
			var a = n_arr[1];
			var b = n_arr[2];

			if (b.indexOf(a) == 0)
			{
				var k = n.replace(/\[\[([^\]\|]*)\|(\1)([a-zA-Ząśżźćęń󳥌ŻŹĆĘŃÓŁ]*)\]\]/i, "[[$2]]$3");
				str = str.replace(n, k);
			}
		}
	}

	str = str.replace(/\[\[([^\]\|]+)\|([^\]\|]+)\]\]([A-Za-z\'][A-Za-z]*)([\.\,\;\:\"\u201D\!\?\)\s\n]|$)/gm, "[[$1|$2$3]]$4"); //"'

	return str;
}

wt_sk.fixNewlines = function(str) {
	str = str.replace(/[\r\n][\r\n][\r\n]+/gm, "\n\n");
	str = str.replace(/(\r)(\n)/gm, "$2"); // Konwersja uszkodzonych końców wiersza UNIX-DOS
	str = str.replace(/\r/g, '');
	return str;
}

wt_sk.wiktionary = function(str)
{
	// czyszczenie kodu przed przystąpieniem do pracy
	str = str.replace(/^-{3,}/mg, ''); // wyrzucenie poziomych linii ----
	str = str.replace(/  +/g, " "); // usuwa podwójne spacje
	str = str.replace(/ +$/gm, ""); // wyrzucenie spacji z końca linii
	str = str.replace(/; +;/g,';');
	str = str.replace(/ ; /g, '; ');
	str = str.replace(/^(\*+\:*)([^ \n\*\:])/gmi, "$1 $2"); // *ala -> * ala
	str = str.replace(/^(\:+)([^ \n\*\:])/gmi, "$1 $2"); // :ala -> : ala
	str = str.replace(/\{\{zobtlum/gi, "{{zobtłum");
	{
		var prefix = ' *\\( *\\{\\{ *';
		str = str.replace(new RegExp(prefix+'język ', 'ig'), ' ({{język ');
		str = str.replace(new RegExp(prefix+'('+wt_sk.jezykBezJezyk+') *\\}\\} *\\)', 'ig'), ' ({{$1}})');
	}
	str = wt_sk.fixNewlines(str);

	str = str.replace(/(?:zobacz|zob\.|patrz) (?:też|także|również)\:? ?\[\[w\: *([^\|\]]+)\|([^\]]+)\]\] (?:w|na) Wikipedii\.?/gi, "{{wikipedia|$1|$2}}");
	{
		var titleEsc = wt_sk.escapeRegex(wgTitle);
		var re=new RegExp("\\{\\{wikipedia\\|"+titleEsc+"\\|"+titleEsc+"\\}\\}","gmi");
		str = str.replace(re, "{{wikipedia}}");
	}
	
	{
		var wpMatches = str.match(/\{\{wikipedia\|([^|}]+)\|([^}]+)\}\}/gmi);
		if (wpMatches) {
			for (var i=0; i<wpMatches.length; ++i) {
				var wpMatch = wpMatches[i].toString().match(/\{\{wikipedia\|([^|}]+)\|([^}]+)\}\}/i);
				if (wpMatch && TurnFirstToLower(wpMatch[1]) == TurnFirstToLower(wpMatch[2])) {
					str = str.replace(wpMatches[i], '{{wikipedia|'+wpMatch[1]+'}}');
				}
			}
		}
	}
	
	str = str.replace(/\n+'*(?:zobacz|zob\.) (?:tez|też|także|również)\:?'* ?/gmi, "\nzobacz też: ");
	str = str.replace(/(; |^\{\{uwagi\}\}\s*(?:\(\d+\.\d+\))?\s*)'*((?:zobacz|zob\.|patrz) (?:tez|też|także|takze|również)|zob\.):?'*:? *→? */gmi, "$1zobacz też: ");
	
	str = str.replace(/\r/g, '');
	str = str.replace(/(\r)(\n)/gm, "$2"); // Konwersja uszkodzonych końców wiersza UNIX-DOS
	
	str = str.replace(/\( +\{\{/g, '({{'); //ważne w tym miejscu, patrz linijka niżej!
	// dzielimy hasło na część przed sekcjami językowymi i na sekcje językowe
	var sectionRegex = /(==(?:[^(]+\([^{]){0,6}[^(]*\(\{\{[^}]+\}\} *\) *==)/g;
	var firstSecIndex = str.search(sectionRegex);
	// najpierw test, czy dzielenie działa dobrze; na IE nie działa
	if (!str.match('{{język jaki}}') && firstSecIndex != -1 && "a b".split(/( )/g).length == 3) {
		var beforeSections = str.substring(0,firstSecIndex);
		beforeSections = poprawTekstPrzedSekcjami(beforeSections);
		var allSections = str.substring(firstSecIndex);
		var allSectionsArray = allSections.split(sectionRegex);	
		if (allSectionsArray.length > 0) {
			// usuń pierwszy element tablicy, jeśli jest pusty
			if(allSectionsArray[0].search(/\w/) == -1) {
				allSectionsArray.shift();
			}
			// muszą być pary: nagł. języka - treść języka
			if (allSectionsArray.length % 2 == 0) {
				allSectionsArray = sortujSekcjeJezykowe(allSectionsArray);
				
				var poczatekObcych = 0;
				if (allSectionsArray[0].match(/{{\s*język polski\s*}}/i)) {
					poczatekObcych = 1;
				}
				
				if (poczatekObcych > 0) {
					allSectionsArray[0] = poprawSekcjePolska(allSectionsArray[0]);
				}
				for (var i=poczatekObcych; i<allSectionsArray.length; ++i) {
					allSectionsArray[i] = poprawSekcjeObca(allSectionsArray[i]);
				}
				
				str = ''; // sklejanie
				for (var i=0; i<allSectionsArray.length; ++i) {
					//if (!allSectionsArray[i].match(/\n{2}$/)) {
						allSectionsArray[i] += "\n\n";
						allSectionsArray[i] = allSectionsArray[i].replace("[\n\r\f]*$", "\n\n");
					//}
					str += allSectionsArray[i];
				}
			} else {
				alert('błąd w skrypcie - zły podział na sekcje!'+allSectionsArray);
			}
		}
		
		beforeSections = beforeSections.replace(/[\n\r\f]+$/, "\n");
		str = beforeSections + str;
	}
	
	str = str.replace(/''\[\[mianownik\|M\]\]''/gi, "{{M}}");
	str = str.replace(/''\[\[dopełniacz\|D\]\]''/gi, "{{D}}");
	str = str.replace(/''\[\[celownik\|C\]\]''/gi, "{{C}}");
	str = str.replace(/''\[\[biernik\|B\]\]''/gi, "{{B}}");
	str = str.replace(/''\[\[narzędnik\|N\]\]''/gi, "{{N}}");
	str = str.replace(/''\[\[miejscownik\|Ms\]\]''/gi, "{{Ms}}");
	str = str.replace(/''\[\[wołacz\|W\]\]''/gi, "{{W}}");

	str = str.replace(/\]\] ''(m|f|n|w|c)''( *$| \(|,|;)/gm, "]] {{$1}}$2");
	str = str.replace(/ \{\{c\}\}/g, ' {{w}}'); // w szwedzkim bywa ''c'' zamiast ''w''

	str = str.replace(/''\[\[liczba pojedyncza\|lp\]\]''/gi, "{{lp}}");
	str = str.replace(/''\[\[liczba mnoga\|lm\]\]''/gi, "{{lm}}");
	str = str.replace(/''lp''/g, "{{lp}}");
	str = str.replace(/''lm''/g, "{{lm}}");
	str = str.replace(/''blp.?''/g, "{{blp}}");
	str = str.replace(/''blm.?''/g, "{{blm}}");
	str = str.replace(/''im\.''/gi, "{{ims}}");


	str = str.replace(/''\[\[rzeczownik\|rzecz.\]\]''/gi, "{{rzecz}}");
	str = str.replace(/''\[\[czasownik\|czas.\]\]''/gi, "{{czas}}");
	str = str.replace(/''\[\[przymiotnik\|przym.\]\]''/gi, "{{przym}}");
	str = str.replace(/''\[\[przysłówek\|przysł.\]\]''/gi, "{{przysł}}");

	str = str.replace(/''\[\[anatomia\|anat.\]\]''/gi, "{{anat}}");
	str = str.replace(/''\[\[biologia\|biol.\]\]''/gi, "{{biol}}");
	str = str.replace(/''\[\[botanika\|bot.\]\]''/gi, "{{bot}}");
	str = str.replace(/''\[\[chemia\|chem.\]\]''/gi, "{{chem}}");
	str = str.replace(/''\[\[mitologia\|mit.\]\]''/gi, "{{mit}}");
	str = str.replace(/''\[\[potocznie\|pot.\]\]''/gi, "{{pot}}");
	str = str.replace(/''\[\[religia\|rel.\]\]''/gi, "{{rel}}");
	str = str.replace(/''\[\[zoologia\|zool.\]\]''/gi, "{{zool}}");
	str = str.replace(/''\[\[żeglarstwo\|żegl.\]\]''/gi, "{{żegl}}");

	str = str.replace(/([^\'])''(czas)\.''([^\'])/g, "$1{{$2}}$3"); //'
	str = str.replace(/([^\'])''(czas)\.''$/g, "$1{{$2}}"); //'
	
	str = str.replace(/''\[\[przestarzale\|przest.\]\]''/gi, "{{przest}}");
	
	{
		var old;
		do {
			old = str;
			str = str.replace(/([^\'])''(abl|adm|alb|amer|anat|ang|antrop|arab|aram|archit|astr|astrol|austr|austral|B|bezosob|białor|biochem|biol|Bm|bot|braz|bret|bryt|bud|bułg|C|chem|chin|chorw|cuk|czesk|D|dawn|dk|dłuż|dolnoniem|dosł|druk|du|duń|ekon|el|elektr|elektron|ent|etc|etw|eufem|ezot|far|farm|filoz|fiz|fizj|folk|franc|fryz|geogr|geol|geom|głuż|goc|góralska|górn|górnol|gram|grec|gwara|hand|hebr|hist|hiszp|hydrol|ims|inform|irl|iron|isl|itd|jęz|jid|jmd|jmdm|jmdn|karc|kolej|komp|książk|kulin|lekcew|licz|lingw|lit|liter|litew|lm m|lm nm|log|lotn|lud|łac|łot|M|mac|mar|masz|mat|mech|med|meteorol|mil|miner|mit|mosob|mot|Ms|muz|N|ndk|ng|ngt|niem|nieodm|nieos|nl|nłac|nmosob|Nn|norw|nprzech|obraź|odczas|odprzym|odrzecz|ofic|ornit|pejor|pers|PIE|podn|poet|pogard|pol|poligr|polit|porów|porównaj|port|pot|pragerm|pranord|praw|przech|przecz|przedr|przen|przest|przesz|przyim|przym|przysł|przysz|psych|qu|reg|rel|roln|ros|rozk|rum|rzadz|rzecz|sanskr|sb|scs|serb|slang|słc|słń|słowiń|sport|staroang|starofranc|starofryz|starogr|staroirl|staronord|starop|starosłow|staroszw|sth|stomat|stopn|strbr|strcz|swh|swn|syst|szw|szwajc|środ|śwn|tamil|także|techn|ter|tłum|turk|UK|ukr|US|W|wet|wędk|węg|wł|włók|wojsk|wulg|zdrobn|zgrub|zobacz|zool|zwł|żart|żegl)\.''([^\']|$)/g, "$1{{$2}}$3");
		} while (old != str);
	}

	str = str.replace(/''(rzecz|przym|czas|przysł|zdrobn|US|UK)''(?!')/g, "{{$1}}");

	str = str.replace(/([^\'])''(?:astron\.?|astronomia)''([^\'])/g,"$1{{astr}}$2");
	str = str.replace(/([^\'])''(?:astrol\.?|astrologia)''([^\'])/g,"$1{{astrol}}$2");
	str = str.replace(/([^\'])''biologia''([^\'])/g,"$1{{biol}}$2");
	str = str.replace(/([^\'])''mitologia''([^\'])/g,"$1{{mit}}$2");
	str = str.replace(/([^\'])''dawna nazwa''([^\'])/g,"$1{{daw}}$2");
	str = str.replace(/([^\'])''dokonany''([^\'])/g,"$1{{dk}}$2");
	str = str.replace(/([^\'])''dosłownie''([^\'])/g,"$1{{dosł}}$2");
	str = str.replace(/([^\'])''drukarstwo''([^\'])/g,"$1{{druk}}$2");
	str = str.replace(/([^\'])''(?:ekonomia|ekonom\.?)''([^\'])/g,"$1{{eko}}$2");
	str = str.replace(/([^\'])''elektronika''([^\'])/g,"$1{{elektron}}$2");
	str = str.replace(/([^\'])''(?:eufemistyczni?e|eufemizm)''([^\'])/g,"$1{{eufem}}$2");
	str = str.replace(/([^\'])''farmac\.?''([^\'])/g,"$1{{farm}}$2");
	str = str.replace(/([^\'])''filozo?f?\.?''([^\'])/g,"$1{{filo}}$2");
	str = str.replace(/([^\'])''i tak dalej''([^\'])/g,"$1{{itd}}$2");
	str = str.replace(/([^\'])''informatyka''([^\'])/g,"$1{{inform}}$2");
	str = str.replace(/([^\'])''potocznie''([^\'])/g,"$1{{pot}}$2");
	str = str.replace(/([^\'])''prawo''([^\'])/g,"$1{{praw}}$2");
	str = str.replace(/([^\'])''milit\.''([^\'])/g,"$1{{mil}}$2");
	str = str.replace(/\{\{dawn\}\}/g, '{{daw}}'); // nie ma takiego skrótu wg SJP PWN

	str = str.replace(/([^\'])''(?:(?:wyraz(?:'' '')| )nieodmienny|nieodmienne)''([^\'])/g,"$1{{nieodm}}$2");
	str = str.replace(/([^\'])''(?:bez liczby mnogiej|bez lm|bez \{\{lm\}\})''([^\'])/g,"$1{{blm}}$2");
	str = str.replace(/([^\'])''(?:bez liczby pojedynczej|bez lp|bez \{\{lp\}\})''([^\'])/g,"$1{{blp}}$2");
	if (wgTitle != "brak") {
		str = str.replace(/([^\'])(?:''bez'' \{\{lm\}\}|\{\{lm\}\} brak)\b([^\'])/g,"$1{{blm}}$2");
		str = str.replace(/([^\'])(?:''bez'' \{\{lp\}\}|\{\{lp\}\} brak)\b([^\'])/g,"$1{{blp}}$2");
	}
	str = str.replace(/([^\'])''bezokol.?''([^\'])/g,"$1''bezokolicznik''$2");
	str = str.replace(/([^\'])''bzosob.?''([^\'])/g,"$1{{bezosob}}$2");
	str = str.replace(/([^\'])''liczba mnoga''([^\'])/g,"$1{{lm}}$2");
	str = str.replace(/([^\'])''liczba podwójna''([^\'])/g,"$1{{du}}$2");
	str = str.replace(/([^\'])''liczba pojedyncza''([^\'])/g,"$1{{lp}}$2");
	str = str.replace(/([^\'])''niedokonany''([^\'])/g,"$1{{ndk}}$2");
	/*str = str.replace(/([^\'])''rodzaj żeński''([^\'])/g,"$1{{f}}$2");
	str = str.replace(/([^\'])''rodzaj męski''([^\'])/g,"$1{{m}}$2");
	str = str.replace(/([^\'])''rodzaj nijaki''([^\'])/g,"$1{{n}}$2");
	str = str.replace(/([^\'])''rodzaj wspólny''([^\'])/g,"$1{{w}}$2");*/
	
	// 'zamiana nawet, gdy nie ma kropki - niepotrzebne, bo robione już wyżej
	//str = str.replace(/pokrewne\}\}\s\'\'(rzecz|czas|przym|przysł|zdrobn)\'\'/g, "pokrewne}} {{$1}}");
	// 'na koniec dodanie średnika przed {{rzecz}}
    str = str.replace(/, \{\{(rzecz|przym|czas|przysł|zdrobn|ims)\}\}/g, "; {{$1}}");
    str = str.replace(/\]\] \{\{(rzecz|przym|czas|przysł|zdrobn|przest|ims)\}\} \[\[/g, "]]; {{$1}} [[");

	// 'usuwanie niewypełnionych części szablonu
	str = str.replace(/(\<\!\-\-)?''(\[\[prosty\|)?Proste(\]\])? (\[\[)?zdanie(\]\])? (\[\[)?z(\]\])? (\[\[)?charakterystyczny(\]\])?m (\[\[)?użycie(\]\])?m ((''')|(\[\[słowo\|))?słowa((''')|(\]\]))?\.''( \→ (\[\[tłumaczenie\|)?Tłumaczenie(\]\])? (\[\[)?na(\]\])? (''')?polski(''')?\.)?(\-\-\>)?/gi, " ");
	str = str.replace(/\<\!\-\-\s\{\{IPA\|[^\}]+\}\}\s\-\-\>/gi, " ");
	str = str.replace(/\:\s\((\d\.\d\))\s\[\[słowo\]\] \[\[po\]\] \[\[polski\|polsku\]\] \[\[lub\]\] \[\[definicja\]\]/gi, "$1");
	str = str.replace(/ +\[\[Aneks:IPA\|IPA\]\](: \/ *\/)? */g, ' ');
	str = str.replace(/ *\<\!\-\- *(?:\[\[Aneks\:IPA\|[^\]\n]*\]\]|\{\{IPA[^\}\n]*\}\})[^\n]*\-\-\> */g, ' ');
	str = str.replace(/<!-- *-->/, ' ');
	str = str.replace(/ *\{\{IPA\|?\}\} */g, ' ');
	str = str.replace(/ ''przykład''( → tłumaczenie)?$/gm, '');
	str = str.replace(/\)\s\[\[polski\]\]\s\[\[odpowiednik\]\]$/gm, ') ');
	str = str.replace(/(: *\(\d\.\d{1,2}\)) *('' *'')? *→/g, '$1');
	str = str.replace(/: *\((1\.(\d{2}|[2-9])|[2-9]\.\d{1,2})\) *\n/g, '');
	str = str.replace(/: *\(1\.1\) *\n(: *\(\d\.\d{1,2}\))/g, '$1');
	
	if (wt_sk.usuwajWszystkieNiewypelnione) {
		str = str.replace(/''rzeczownik, rodzaj żeński, męski''/, "''rzeczownik''");
		str = str.replace(/\* *angielski: \(1\.1\) \[\[ *\]\]\n?/g, '');
		if (str.match(/ \[\[krótki\|krótka\]\] \[\[definicja\]\]/)) {
			if (!str.match(/dopisać definicję/)) {
				str = "{{dopracować|dopisać definicję}}\n" + str;
				str = str.replace(/({{dopracować[^}]*}})\n{2,}/g,"$1\n"); 
			}
		}
	}

	str = str.replace(/''\[\[Do\]\]/g, "''[[do|Do]]");
	str = str.replace(/''\[\[Nie\]\]/g, "''[[nie|Nie]]");
	str = str.replace(/''\[\[Jak\]\]/g, "''[[jak|Jak]]");
	
	str = str.replace(/^(\=+) *([^\n]*[^\=\n ]+) *\=+$/gm, "$1 $2 $1"); // naprawa nagłówków
	// == hasło ({{język jakiś}} ) == -> == hasło ({{język jakiś}}) == (spacja zabija linki)
	str = str.replace(/\}\} +\) *==$/gm, '}}) ==');
	str = str.replace(/\n{2,}({{(wymowa|trans))/g, '\n$1'); // zbędny odstęp przed wymową/transliteracją 
	
	str = str.replace(/\[\[Aneks\:Język polski \- koniugacja ([IVX]+[abc]?)\|[kK]oniugacja [IVX]+[abc]?\]\]/g, "{{koniugacjaPL|$1}}");
	str = str.replace(/\[\[Aneks\:Język hiszpański \- koniugacja (II?I?)\|[kK]oniugacja II?I?\]\]/g, "{{koniugacjaES|$1}}");
	
	str = str.replace(/\<div style=\"[^"]+"\>\n\{\|\-\n\|\- style\=\"font\-size\:72px\; color\: black\; height\: 72px\;\"\n\|([^\n]+)\n\|\-\n\|([^\n]+)\n\|\}\n\<\/div\>/g,"{{litera|$1|$2}}");
	str = str.replace(/\<table align\=right\>\<tr\>\<td width\=[0-9]* height\=[0-9]* bgcolor\=([^\s\>]+) ?(align\=center)?\>(\<font color\=[^\>]+\>)?([^\<]+)?(\<\/font\>)?\<\/td\>\<\/tr\>\<\/table\>/gi, "{{kolor|$1|$4}}");
	
	// korekty poza zwykłymi hasłami - np. w przysłowiach
	str = str.replace(/\{\{uzycie\}\}/i, '{{użycie}}');
	str = str.replace(/\{\{Wersje\}\}/i, '{{wersje}}');
	str = str.replace(/\{\{inneo\}\}/i, '{{przysłowia na temat}}');

	// usuwa średnik i przecinek z końca linii
	str = str.replace(/(;|,)$/gm, "");
	str = str.replace(/\}\}\[\[/g, '}} [[');
	
	str = str.replace(/: : /g, ': '); // temp
	str = str.replace(/\{\{ *PAGENAME *\}\}/g, '{{subst:PAGENAME}}');
	str = str.replace(/\<strike\>([^\n\<]+)\<\/strike\>/gm, "<s>$1</s>");
	str = str.replace(/ -- /g, ' – '); // na ndash (półpauzę)
	str = str.replace(/  +/g, " "); // usuwa podwójne spacje
	str = str.replace(/ +$/gm, ""); // wyrzucenie spacji z końca linii
	
	str = wt_sk.fixNewlines(str);
	
	return wt_sk.trim(str);
}

function poprawCudzyslowyWLinii(str) {
	// podmiana cudzysłowów w kodzie HTML; po wszystkim zrobi się na odwrót
	var TEMP_QUOTE = "\u1111";
	str = str.replace(/(align|alt|background|bgcolor|border|cellpadding|cellspacing|class|clear|color|cols|dir|face|height|id|label|link|name|nowrap|rows|rules|scrolling|size|span|src|style|title|type|valign|width)="([^"]+)"/gm,"$1="+TEMP_QUOTE+"$2"+TEMP_QUOTE);
	// nie poprawiamy cudzysłowów w celu linku
	{
		do {
			var old = str;
			str = str.replace(/(\[\[[^|\]"]*)"([^|\]]*[|\]])/g, "$1"+TEMP_QUOTE+"$2");
		} while(old != str);
	}

	// zamiana wszystkich cudzysłowów na proste "
	str = str.replace(/[\u00AB\u00BB\u2018\u2019\u201A\u201C\u201D\u201E\u2039\u203A\u300C\u300D\u300E\u300F\uFE30\uFE41\uFE42\uFE43\uFE44]/gm, '"');
	
	// otwarcie 201E „ 00AB « 201A ‚ zamknięcie 201D ” 00BB » 2019
	do {
		old = str;
		// ważna kolejność, bo w obu jest sąsiedztwo z ' - dla '''a'''". powinien być nawias zamykający
		// z drugiej strony: ''"'''Cośtam''' - otwierający
		str = str.replace(/>" /gm, ">\u201D ");
		str = str.replace(/( '+|^|[\s\u201E=>\(\*\|])\"/gm, "$1\u201E"); //otw	
		str = str.replace(/\"([\s\u201D\:\.\!\?\)\]\}\<\;\'\,]|$)/gm, "\u201D$1"); //zam
		str = str.replace(/(['])"/gm, "$1\u201E");
	} while (old!=str);
	do {
		old = str;
		str = str.replace(/(\u201E[^\u201D\u201E]*\u201E[^\u201D\u201E]*)\u201E/gm, "$1\"");
		str = str.replace(/\u201D([^\u201D\u201E]*\u201D[^\u201D\u201E]*\u201D)/gm, "\"$1");
	} while (old!=str);
	do {
		old = str;
		str = str.replace(/(\u201E[^\u201D]*)\u201E/gm, "$1\u00AB");
		str = str.replace(/(\u00AB[^\u201E\u201D\u00AB\u00BB]*)\u201D/gm, "$1\u00BB");
	} while (old!=str);
	
	str = str.replace(new RegExp(TEMP_QUOTE,'g'), '"'); // powrót do cudzysłowów w HTML-u
	
	return str;
}

// rozbija tekst na linie i poprawia linijka po linijce
function poprawCudzyslowy(str) {
	//var newline = "a b".split(/( )/g).length == 3 ? "\n" : "\r\n"; // "\r\n" is for IE or other sh*t
	//var lines = str.split(new RegExp(newline));
	var lines = str.split("\n");
	for (var i=0; i<lines.length; ++i) {
		lines[i] = poprawCudzyslowyWLinii(lines[i]);
	}
	str = lines.join("\n");
	return str;
}

// przyjmuje tablicę w postaci par '==coś({{esperanto}})==','{{wymowa}}...'
function sortujSekcjeJezykowe(sekcje) {
	var nieposort = new Array(sekcje.length/2);
	for (var i=0; i<sekcje.length; i+=2) {
		nieposort[i/2] = sekcje[i];
		//http://dev.opera.com/articles/view/efficient-javascript/?page=2#stringaccumulator
		nieposort[i/2] += sekcje[i+1];
	}	
	return nieposort.sort(porownajSekcje);
}

// zwraca 'rosyjski', 'jidysz' itp.
function jezykSekcji(tekstSekcji) {
	return tekstSekcji.match(/\(\s*\{\{(?:język)? *([^}]+)\}\}/i)[1];
}

function porownajSekcje(a,b) {
	var jezykA = jezykSekcji(a);
	var jezykB = jezykSekcji(b);
	var priorytetRegExp = new RegExp('^(polski|znak chiński)');
	if (jezykA.search(priorytetRegExp) != -1) {
		return -1;
	}
	if (jezykB.search(priorytetRegExp) != -1) {
		return 1;
	}
	//return jezykA.localeCompare(jezykB);
	return wt_sk.porownajNapisy(jezykA,jezykB);
}

function jezykTlumaczenia(linia) {
	var tlumRegEx = /^\* *([^:]+):/;
	var jezyk = '';
	var m = linia.match(tlumRegEx);
	if (m) {
		jezyk = m[1];
	}
	return jezyk;
}

function porownajTlumaczenia(a,b) {
	return wt_sk.porownajNapisy(jezykTlumaczenia(a), jezykTlumaczenia(b));
}

// podstawowe założenie: PRZED wywołaniem tej funkcji wszystkie warianty
// zob. też itp. zostały zamienione na "zobacz też"
function poprawTekstPrzedSekcjami(str) {
	str = str.replace(/^zobacz też\:?(?: *\[\[([^\n\]\|]*)\]\] ?\,?)/gmi, "{{zobteż|$1}}");
	str = str.replace(/^zobacz też\:?(?: ?\[\[([^\n\]\|]*)\|([^\n\]\|]*)\]\] ?\,?)/gmi, "{{zobteż2|$1|$2}}");
	str = str.replace(/(\{\{zobteż2\|[^\n\}\|]*(?:\|[^\n\}\|]*\|[^\n\}\|]*)*)(\}\})/gmi, "$1|$2");
	var old;
	do {
		old=str;
		str = str.replace(/(\{\{zobteż\|[^\n\}]+)\}\}(?: ?\[\[([^\n\]\|]*)\]\] ?\,?)/gmi, "$1|$2}}");
		if (str.match(/(\{\{zobteż\|[^\n\}]+)\}\}(?: ?\[\[([^\n\]\|]*)\|([^\n\]\|]*)\]\] ?\,?)/gmi))
		{
			var old2;
			do {
				old2=str;
				str = str.replace(/(\{\{zobteż\|[^\n\}\|]*)\|([^\n\}]*\}\} ?\[\[[^\n\]\|]*\|[^\n\]\|]*\]\])/gmi, "$1\t$2");
			} while (str!=old2);
			do {
				old2=str;
				str = str.replace(/(\{\{zobteż\|[^\n\}\|]*)\t([^\n\}]*\}\} ?\[\[[^\n\]\|]*\|[^\n\]\|]*\]\])/gmi, "$1||$2");
			} while (str!=old2);
			str = str.replace(/(\{\{)zobteż(\|[^\n\}]*)(\}\} ?\[\[[^\n\]\|]*\|[^\n\]\|]*\]\])/gmi, "$1zobteż2$2|$3");
		}
		str = str.replace(/(\{\{zobteż2\|[^\n\}]+)\}\}(?: ?\[\[([^\n\]\|]*)\]\] ?\,?)/gmi, "$1|$2|}}");
		str = str.replace(/(\{\{zobteż2\|[^\n\}]+)\}\}(?: ?\[\[([^\n\]\|]*)\|([^\n\]\|]*)\]\] ?\,?)/gmi, "$1|$2|$3}}");
	} while (str!=old);
	str = str.replace(/\n+(\n\{\{zobteż)/gmi, "$1");
	str = str.replace(/(\{\{zobteż[^}\n]+\}\})\n{2,}/gi, "$1\n");
	return str;
}

function poprawSekcjeOgolnie(str) {
	// ryzykowne zmiany estetyczne
	str = str.replace(/\n{2,}/g, "\n"); // usuwanie pustych linii
	// dodaje średnik: [[raz]] (1.2) [[dwa]] -> [[raz]]; (1.2) [[dwa]]
	str = changeTextAfter(str, '{{składnia}}', function(text) {
		return text.replace(/\]\][ ,] ?(\(\d*\.\d*\)) (\[\[|\{\{)/gm, "]]; $1 $2");
	});
	str = changeTextBetween(str, '{{znaczenia}}', '{{przykłady}}', function(znacz) {
		return znacz.replace(/[\,\.\;\:]? ?\{\{wikipedia/g, "; {{wikipedia");
	});
	
	// dodaje brakującą sekcję źródła
	if (str.search(/(<ref[ >]|sz\spo\sspółgłosce|alternatywna\swymowa\s\-izmów)/) != -1) {
		if (str.search('<references */>') == -1) {
			str = str.replace(/\s+$/, '');
			if (str.indexOf('{{źródła}}') == -1) {
				str += "\n{{źródła}}\n";
			}
			str = str.replace(/\s*\{\{źródła\}\}\s*/, "\n{{źródła}}\n<references />\n");
		}
	} else {
		if (str.search('<references */>') != -1) {
			str = str.replace(/\{\{źródła\}\}\s+<references \/>/, '');
		}
	}
	return str;
}

function poprawSekcjePolska(str) {
	str = poprawSekcjeOgolnie(str);
	str = str.replace(/^\* *(\(\d\.[^)]+\) *\{\{zobtłum)/gm, ': $1');
	
	str = poprawCudzyslowy(str);
	
	// sortowanie tłumaczeń
	var m = str.split(/(\{\{tłumaczenia\}\}[^*]*)/);
	if (m.length == 3) {
		var before = m[0] + m[1];
		var text = m[2];
		var m2 = text.split(/((?:\*[^\n]+(?:$|\n))+)/);
		if (m2.length == 3) {
			var after = m2[2];
			var translations = m2[1];
			
			var lines = translations.split(/\n/);
			var lastLine = lines.pop(); // na końcu pusta linia
			if (lastLine.match(/\w/)) {
				lines.push(lastLine);
			}
			
			var langRegExp = new RegExp(wt_sk.jezykBezJezyk, 'i');
			for (var i=0; i<lines.length; ++i) {
				var matched;
				if (matched = lines[i].match(/^\*\s*([^:]+):/)) { // w tłumaczeniach
					var lang = wt_sk.trim(matched[1]);
					if (lang.search(langRegExp) == -1) {
						lang = 'język ' + lang;
					}
					var linkRegexp = new RegExp("\\[\\[" + wgPageName + "\\]\\]");
					while (lines[i].search(linkRegexp) != -1) {
						lines[i] = lines[i].replace(linkRegexp, '[[#'+wgPageName+' ('+lang+')|'+wgPageName+']]');
					}
				}
				if (lines[i].search(/^\*\s*rosyjski:/) != -1) {
					lines[i] = wt_sk.poprawAkcentWLinkach(lines[i]);
				}
			}
			lines = lines.sort(porownajTlumaczenia);
			translations = lines.join("\n");
			if (!translations.match("\n$")) {
				translations += "\n";
			}
			
			str = before + translations + after;
		}
	}
	return str;
}

function poprawSekcjeObca(str) {
	str = poprawSekcjeOgolnie(str);
	if (str.match(/\{\{język jaki\}\}/)) {
		return str;
	}
	
	str = str.replace(/\{\{tłumaczenia\}\}\s*[\n\r]+\*\s*angielski: \(1\.1\) \[\[\s*\]\]\s*/g, '');
	str = str.replace(/\{\{tłumaczenia\}\}\s*\n*$/g, '');
	str = str.replace(/\{\{tłumaczenia\}\}\s+\{\{źródła\}\}/, '{{źródła}}');
	
	// poprawianie linków do tego samego hasła - ale tylko w sekcji "znaczenia"
	str = changeTextBetween(str, '{{znaczenia}}', '{{przykłady}}', function(znacz) {
		var linkRegexp = new RegExp("\\[\\[" + wgPageName + "\\]\\]",'g');
		return znacz.replace(linkRegexp, '[[#'+wgPageName+' (język polski)|'+wgPageName+']]');
	});
	
	str = changeTextBetween(str, '{{etymologia}}', '{{uwagi}}', poprawCudzyslowy);
	str = changeTextUntil(str, '{{uwagi}}', '{{źródła}}', poprawCudzyslowy);
	
	var funkcjaDlaJezyka = wt_sk.poprawSekcje[jezykSekcji(str)]; 
	if (funkcjaDlaJezyka) {
		str = funkcjaDlaJezyka(str);
	}
	
	return str;
}

wt_sk.poprawSekcje['rosyjski'] = function(str) {
	str = wt_sk.poprawAkcentWLinkach(str);
	return str;
}

wt_sk.poprawAkcentWLinkach = function(str) {
	var oldStr;
	do {
		oldStr=str
		str = str.replace(/\[\[(([^\]|]+)́([^\]|]*))\]\]/g, "[[$2$3|$1]]"); // [[па́па]] -> [[папа|па́па]]
		str = str.replace(/\[\[([^\]|]+)́([^\]|]*)\|/g, '[[$1$2|'); // [[па́па|па́пе]] -> [[папа|па́пе]]
	} while (oldStr != str);
	return str;
}

// "Nazwa używana w linku", // Nazwa do sortowania
// Ta tablica musi już być posortowana
// Kolejność sortowania za pywikipedia/family.py zgodnie z self.alphabetic
// Ponieważ pywikipedia/families/wikipedia_family.py zgodnie z self.interwiki_putfirst jest 'pl': self.alphabetic
// Dane za http://meta.wikimedia.org/wiki/Interwiki_sorting_order#By_order_of_alphabet.2C_based_on_local_language_.28by_first_word.29

wt_sk.Jezyki=[
	    'ace', 'af', 'ak', 'als', 'am', 'ang', 'ab', 'ar', 'an', 'arc',
            'roa-rup', 'frp', 'as', 'ast', 'gn', 'av', 'ay', 'az', 'id', 'ms',
            'bm', 'bn', 'zh-min-nan', 'nan', 'map-bms', 'jv', 'su', 'ba', 'be',
            'be-x-old', 'bh', 'bcl', 'bi', 'bar', 'bo', 'bs', 'br', 'bug', 'bg',
            'bxr', 'ca', 'ceb', 'cv', 'cs', 'ch', 'cbk-zam', 'ny', 'sn', 'tum',
            'cho', 'co', 'cy', 'da', 'dk', 'pdc', 'de', 'dv', 'nv', 'dsb', 'na',
            'dz', 'mh', 'et', 'el', 'eml', 'en', 'myv', 'es', 'eo', 'ext', 'eu',
            'ee', 'fa', 'hif', 'fo', 'fr', 'fy', 'ff', 'fur', 'ga', 'gv', 'sm',
            'gd', 'gl', 'gan', 'ki', 'glk', 'gu', 'got', 'hak', 'xal', 'ko',
            'ha', 'haw', 'hy', 'hi', 'ho', 'hsb', 'hr', 'io', 'ig', 'ilo',
            'bpy', 'ia', 'ie', 'iu', 'ik', 'os', 'xh', 'zu', 'is', 'it', 'he',
            'kl', 'kn', 'kr', 'pam', 'ka', 'ks', 'csb', 'kk', 'kw', 'rw', 'ky',
            'rn', 'sw', 'kv', 'kg', 'ht', 'ku', 'kj', 'lad', 'lbe', 'lo', 'la',
            'lv', 'to', 'lb', 'lt', 'lij', 'li', 'ln', 'jbo', 'lg', 'lmo', 'hu',
            'mk', 'mg', 'ml', 'krc', 'mt', 'mi', 'mr', 'arz', 'mzn', 'cdo',
            'mwl', 'mdf', 'mo', 'mn', 'mus', 'my', 'nah', 'fj', 'nl', 'nds-nl',
            'cr', 'ne', 'new', 'ja', 'nap', 'ce', 'frr', 'pih', 'no', 'nb',
            'nn', 'nrm', 'nov', 'ii', 'oc', 'mhr', 'or', 'om', 'ng', 'hz', 'uz',
            'pa', 'pi', 'pag', 'pnb', 'pap', 'ps', 'km', 'pcd', 'pms', 'nds',
            'pl', 'pnt', 'pt', 'aa', 'kaa', 'crh', 'ty', 'ksh', 'ro', 'rmy',
            'rm', 'qu', 'ru', 'sah', 'se', 'sa', 'sg', 'sc', 'sco', 'stq', 'st',
            'tn', 'sq', 'scn', 'si', 'simple', 'sd', 'ss', 'sk', 'sl', 'cu',
            'szl', 'so', 'ckb', 'srn', 'sr', 'sh', 'fi', 'sv', 'tl', 'ta',
            'kab', 'roa-tara', 'tt', 'te', 'tet', 'th', 'vi', 'ti', 'tg', 'tpi',
            'tokipona', 'tp', 'chr', 'chy', 've', 'tr', 'tk', 'tw', 'udm', 'uk',
            'ur', 'ug', 'za', 'vec', 'vo', 'fiu-vro', 'wa', 'zh-classical',
            'vls', 'war', 'wo', 'wuu', 'ts', 'yi', 'yo', 'zh-yue', 'diq', 'zea',
            'bat-smg', 'zh', 'zh-tw', 'zh-cn'];

function sortujInterwiki(str)
{
	var ilink="";
	var i;
	for (i=0; i<wt_sk.Jezyki.length; i++ )
	{
		var b=true;
		var sr="\\[\\["+wt_sk.Jezyki[i]+"\\:[\^\\n\[\\]]*\\]\\]";
		while (str.search(sr,"gmi") != -1)
		{
			var p=str.search(sr,"gmi");
			var f=str.match(sr,"gmi")[0];
			if (b && (f.replace(/’/g, "'")=="[["+wt_sk.Jezyki[i]+":"+wgTitle.replace(/’/g, "'")+"]]"))
			{
				if (wt_sk.Jezyki[i] != wgContentLanguage) ilink=ilink+" "+f;
				b=false;
			}
			str=str.substring(0,p)+" "+str.substring(p+f.length,str.length);
		}
	}
	str = wt_sk.trim(ilink)+"\n"+wt_sk.trim(str);
	str = str.replace(/\n{3,}/gm, "\n\n");
	str = str.replace(/ +$/gm, ""); // Usuwanie spacji z końców wierszy
	return wt_sk.trim(str);
}

function wiktSk() {	
	document.getElementById(wt_sk.buttonId).src = wt_sk.waitIcon;
	setTimeout('internalWiktSk();', 1);
}

function internalWiktSk()
{
	var txt = document.editform.wpTextbox1;
	var old = txt.value;
	txt.value = wt_sk.linkfixer(txt.value, false);
	txt.value = wt_sk.imagefixer(txt.value);
	txt.value = wt_sk.rozne(txt.value);
	txt.value = wt_sk.wiktionary(txt.value);
	txt.value = wt_sk.linksimplifyer(txt.value);
	if (wgNamespaceNumber == 0) {
		txt.value = sortujInterwiki(txt.value);
	}
	txt.value = wt_sk.trim(txt.value);
	if (txt.value != wt_sk.trim(old)) {
		wt_sk.dodajOpis();
	}
	wt_sk.verify();
	setTimeout('document.getElementById(wt_sk.buttonId).src = wt_sk.icon;',150);
}

wt_sk.addFormatButton = function() {
	editingTools = document.getElementById('toolbar');
	if (editingTools != null)
	{
		if (wt_sk.buttonIsActive() ) {
			FormatTextButton = '<a href="javascript:wiktSk();"><img src="'+wt_sk.icon+'" alt="Formatuj" id="'+wt_sk.buttonId+'" title="Porządkowanie kodu (wersja ' + wiktSkVer + ')"></a>';
		} else {
			FormatTextButton = '<img src="'+wt_sk.inactiveIcon+'" alt="Nieaktywne" title="Nie możesz wykonać sprzątania kodu na tej stronie. Wersja skryptu to ' + wiktSkVer + '.">';
		}
		
		editingTools.innerHTML += FormatTextButton;
		wt_sk.preloadedWaitIcon.src = wt_sk.waitIcon;
	}
}

$(function (){
// Dodaje przycisk do toolbara
		wt_sk.addFormatButton();
});
/*</nowiki></pre>*/