MediaWiki:Gadget-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.
if ( wt_sk !== undefined ) {
	mw.notify("Uwaga! Gadżet <b>Sprzątanie kodu</b> wykrył kolizję w nazwach zmiennych globalnych. Kod został najprawdopodobniej uruchomiony dwa razy. Taka sytuacja nie powinna mieć miejsca.");
}

var wt_sk = window.wt_sk = {
	/** Wersja wyświetlana w dymku przy przycisku */
	version: '0.23.2c',
	/** jeśli =true, to usuwa np. coś takiego: rzeczownik, rodzaj żeński, męski */
	usuwajWszystkieNiewypelnione: false,
	buttonId: 'wiktSkButton',
	jezykBezJezyk: null,
	polskieZnakiSort: ['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','ź','ż'],
	SORT_NOTFOUND: 1000,
	preloadedWaitIcon: new Image(23,22),
	/** tablica typu 'rosyjski' => funkcja przyjmująca tekst rosyjskiej funkcji i zwracająca poprawiony */
	poprawSekcje: []
};

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);
};

/**
 * Usuwa spacje z początku i końca tekstu
 * @param str Przetwarzany łańcuch znaków
 */
wt_sk.trim = function (str) {
	return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
};

/**
 * Zamienia pierwszą literę tekstu na małą
 * @param str Przetwarzany łańcuch znaków
 */
wt_sk.lcfirst = function (str) {
	if (str == "")
		return "";

	str = this.trim(str);
	return str.substr(0, 1).toLowerCase() + str.substr(1, str.length);
};

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 target;
		var before = matches[0], mid = matches[1];
		var midMatches = mid.split(new RegExp(wt_sk.escapeRegex(optionalEnd)));
		if (midMatches.length == 2) {
			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 () {
	return true;
};

// 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=this.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 ($('#wpTextbox1').textSelection('getContents').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 this.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', 'la': 'język łaciński', '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 this.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 = this.linkfixer(y, true);
			y = "[[" + y + "]]";

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

	return this.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]+)([\.\,\;\:\"\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+'('+this.jezykBezJezyk+') *\\}\\} *\\)', 'ig'), ' ({{$1}})');
	}
	str = this.fixNewlines(str);

	str = str.replace(/(?:zobacz|zob\.|patrz) (?:też|także|również)\:? ?\[\[w\: *([^\|\]]+)\|([^\]]+)\]\] (?:w|na) Wikipedii\.?/gi, "{{wikipedia|$1|$2}}");
	{
		var titleEsc = this.escapeRegex(mw.config.get( '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 && this.lcfirst(wpMatch[1]) == this.lcfirst(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!

	var sections = this.splitSections(str);

	if (sections) {
		// pierwsza sekcja jest traktowana specjalnie
		var firstSection = sections.shift();
		firstSection.content = poprawTekstPrzedSekcjami(firstSection.content);

		// sortowanie sekcji językowych
		sections = sections.sort(compareSections);

		// poprawianie sekcji
		for (var i = 0; i < sections.length; i++) {
			this.cleanupSection(sections[i]);
		}

		// scal sekcje w tekst
		str = this.joinSections(firstSection, sections);
	}

	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(/''\[\[teologia\|teol.\]\]''/gi, "{{teol}}");
	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łń|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}}', '{{daw}}'); // nie ma takiego skrótu wg SJP PWN
	str = str.replace('{{f}}', '{{ż}}');
	str = str.replace('{{zdr}}', '{{zdrobn}}');

	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 (mw.config.get( '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(/\'\'\[\[przykład\|Przykład\]\] \[\[zdanie\|zdania\]\]\.\'\'$/gm, '');
	str = str.replace(/\'\'\[\[przykład\|Przykład\]\] \[\[zdanie\|zdania\]\]\.\'\' \→ \[\[tłumaczenie\|Tłumaczenie\]\] \[\[zdanie\|zdania\]\]\.$/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 (this.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(/\[\[Aneks\:Język czeski \- koniugacja ([IV]+[abcde]?)\|[kK]oniugacja [IV]+[abcde]?\]\]/g, "{{koniugacjaCS|$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 = str.replace(/\{\{przykłady\}\}\n: *\(\d+\.\d+\) *\n/g, "{{przykłady" + "}}\n");

	str = this.fixNewlines(str);

	return this.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|group|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);

	// Zamień najprostsze przypadki
	do {
		old = str;
		str = str.replace(/«([^«»]+)»/g, '„$1”');
		str = str.replace(/‹([^‹›]+)›/g, '„$1”');
		str = str.replace(/「([^「」]+)」/g, '„$1”');
		str = str.replace(/『([^『』]+)』/g, '„$1”');
		str = str.replace(/"([^"]+)"/g, '„$1”');
	} while (old!=str);

	// Popraw wielokrotnie zagnieżdżone cudzyłowy „” na «»
	do {
		old = str;
		// („[^”]*)„([^„”«»]*)”
		str = str.replace(/(\u201E[^\u201D]*)\u201E([^\u201E\u201D\u00AB\u00BB]*)\u201D/gm, "$1«$2»");
	} while (old != str);

	// powrót do cudzysłowów w HTML-u
	str = str.replace(new RegExp(TEMP_QUOTE,'g'), '"');

	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;
}


/**
 * Dzieli tekst strony według sekcji
 * @param content Treść strony
 * @returns {array} Tablica obiektów opisujących sekcje
 */
wt_sk.splitSections = function (content) {
	var sectionRegex = /(==(?:[^(]+?\([^{]){0,6}?[^(]*\((?:\{\{[^}]+\}\}|\s*esperanto)\s*\) *==)/g;

	var firstSecIndex = content.search(sectionRegex);
	// najpierw test, czy dzielenie działa dobrze; na IE nie działa
	if (!content.match('{{język jaki}}') && firstSecIndex != -1 && "a b".split(/( )/g).length == 3) {
		var sections = new Array();

		var firstSection = {
			header: null,
			content: content.substring(0, firstSecIndex),
			language: null
		};
		sections.push(firstSection);

		var allSectionsArray = content.substring(firstSecIndex).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) {
				alert('błąd w skrypcie - zły podział na sekcje!' + allSectionsArray);
				return null;
			}

			for (var i = 0; i < allSectionsArray.length; i+=2) {
				// obiekt opisujący sekcję
				var section = {
					header: allSectionsArray[i],
					content: allSectionsArray[i+1],
					language: null
				};

				// określ język dla sekcji
				var matches = section.header.match(/\(\s*\{\{(?:język)? *([^}]+)\}\}/i);
				if (matches) {
					section.language = matches[1];
				}
				else if (section.header.match(/\(\s*esperanto\s*\)/i))
					section.language = "esperanto2";

				// dodaj na listę
				sections.push(section);
			}
		}
		return sections;
	}

	return null;
}

/**
 * Zamienia tablicę obiektów opisujących sekcje na tekst
 * @param first Obiekt opisujący pierwszą sekcję
 * @param sections Tablica obiektów opisujących pozostałe sekcje
 * @returns Tekst
 */
wt_sk.joinSections = function (first, sections) {
	var result = first.content.replace(/[\n\r\f]+$/, "\n");

	for (var i = 0; i < sections.length; i++) {
		// http://dev.opera.com/articles/view/efficient-javascript/?page=2#stringaccumulator
		result += sections[i].header;
		var content = sections[i].content + "\n\n";
		result += content.replace("[\n\r\f]*$", "\n\n");
	}
	return result;
}

/**
 * Porównuje dwie sekcje - nazwy języków, których dotyczą
 * @param a Obiekt opisujący pierwszą sekcję
 * @param b Obiekt opisujący drugą sekcję
 */
function compareSections(a, b) {
	// FIXME
	var priorytetRegExp = new RegExp('^(polski|znak chiński)');

	if (a.language.search(priorytetRegExp) != -1) {
		return -1;
	}
	if (b.language.search(priorytetRegExp) != -1) {
		return 1;
	}
	//return a.language.localeCompare(b.language);
	return wt_sk.porownajNapisy(a.language, b.language);
}

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);

	// Usuwa self-linki z wywołań szablonu {{zobteż}}
	str = str.replace(/(\{\{zobteż\|)([^\}]+?)(\}\})/g, function (dummy, prefix, text, sufix) {
		var links = text.split("|");
		var newLinks = new Array();
		for (var i = 0; i < links.length; i++) {
			if (links[i] != mw.config.get( 'wgPageName' ))
				newLinks.push(links[i]);
		}
		if (!newLinks.length)
			return "";

		return prefix + newLinks.join("|") + sufix;
	});

	str = str.replace(/\n+(\n\{\{zobteż)/gmi, "$1");
	str = str.replace(/(\{\{zobteż[^}\n]+\}\})\n{2,}/gi, "$1\n");
	return str;
}

/**
 * Wykonuje poprawianie sekcji
 * @param section Obiekt opisujący poprawianą sekcję
 */
wt_sk.cleanupSection = function (section) {
	section.content = this.poprawSekcjeOgolnie(section.content);

	var callback = wt_sk.poprawSekcje[section.language];

	if (callback) {
		callback(section);
	}
	else {
		section.content = this.poprawSekcjeObca(section.content);
	}
}

wt_sk.poprawSekcjeOgolnie = function (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|nazwa\ssystematyczna\b[^{}]+\bref=[^{}]+\b)/) != -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");
		}
	}
	return str;
}

wt_sk.poprawSekcje['rosyjski'] = function (section) {
	section.content = wt_sk.poprawSekcjeObca(section.content);
	section.content = wt_sk.poprawAkcentWLinkach(section.content);
}

wt_sk.poprawSekcje['polski'] = function (section) {
	var str = section.content;
	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) {
				//WYŁACZONE - JavaScript już to robi
				/*var matched = lines[i].match(/^\*\s*([^:]+):/)
				if (matched) { // w tłumaczeniach
					var lang = wt_sk.trim(matched[1]);
					if (lang.search(langRegExp) == -1) {
						lang = 'język ' + lang;
					}
					var linkRegexp = new RegExp("\\[\\[" + mw.config.get( 'wgPageName' ) + "\\]\\]");
					while (lines[i].search(linkRegexp) != -1) {
						lines[i] = lines[i].replace(linkRegexp, '[[#'+mw.config.get( 'wgPageName' )+' ('+lang+')|'+mw.config.get( '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;
		}
	}
	section.content = str;
}

wt_sk.poprawSekcjeObca = function (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"
	// WYŁĄCZONE - JavaScript robi to lepiej
	/*str = changeTextBetween(str, '{{znaczenia}}', '{{przykłady}}', function (znacz) {
		var linkRegexp = new RegExp("\\[\\[" + mw.config.get( 'wgPageName' ) + "\\]\\]",'g');
		return znacz.replace(linkRegexp, '[[#'+mw.config.get( 'wgPageName' )+' (język polski)|'+mw.config.get( 'wgPageName' )+']]');
	});*/

	str = changeTextBetween(str, '{{etymologia}}', '{{uwagi}}', poprawCudzyslowy);
	str = changeTextUntil(str, '{{uwagi}}', '{{źródła}}', poprawCudzyslowy);

	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=[
	'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-tarask',
	'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', 'mt', 'mi', 'mr', 'arz', 'mzn', 'cdo', 'mdf',
	'mo', 'mn', 'mus', 'my', 'nah', 'fj', 'nl', 'nds-nl', 'cr', 'ne',
	'new', 'ja', 'nap', 'ce', 'pih', 'no', 'nb', 'nn', 'nrm', 'nov',
	'ii', 'oc', 'or', 'om', 'ng', 'hz', 'uz', 'pa', 'pi', 'pag', 'pap',
	'ps', 'km', 'pms', 'nds', 'pl', 'pnt', 'pt', 'aa', 'kaa', 'crh',
	'ty', 'ksh', 'ro', 'rmy', 'rm', 'qu', 'ru', 'sah', 'se', 'sa', 'sg',
	'sc', 'za', 'sco', 'stq', 'st', 'tn', 'sq', 'scn', 'si', 'simple',
	'sd', 'ss', 'sk', 'sl', 'cu', 'szl', 'so', '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', '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'];

wt_sk.sortujInterwiki = function (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]+":"+mw.config.get( 'wgTitle' ).replace(/’/g, "'")+"]]"))
			{
				if (wt_sk.Jezyki[i] != mw.config.get( 'wgContentLanguage' )) ilink=ilink+" "+f;
				b=false;
			}
			str=str.substring(0,p)+" "+str.substring(p+f.length,str.length);
		}
	}
	str = this.trim(ilink)+"\n"+this.trim(str);
	str = str.replace(/\n{3,}/gm, "\n\n");
	str = str.replace(/ +$/gm, ""); // Usuwanie spacji z końców wierszy
	return this.trim(str);
}

wt_sk.buttonClicked = function () {
	var image = document.getElementById(this.buttonId);
	this.icon = image.src;
	if (image) {
		image.src = this.waitIcon;
	}
	setTimeout('wt_sk.internalWiktSk();', 1);
}

wt_sk.internalWiktSk = function () {
	var $textbox = $( '#wpTextbox1' );
	var oldContent = $textbox.textSelection( 'getContents' );
	var newContent = oldContent;

	newContent = this.linkfixer(newContent, false);
	newContent = wt_sk.imagefixer(newContent);
	for (var i = 0; i < wt_sk.userFunctions.length; i++) {
		var callback = wt_sk.userFunctions[i];
		newContent = callback(newContent);
	}
	newContent = wt_sk.rozne(newContent);
	newContent = wt_sk.wiktionary(newContent);
	newContent = wt_sk.linksimplifyer(newContent);
	if (mw.config.get( 'wgNamespaceNumber' ) == 0) {
		newContent = this.sortujInterwiki(newContent);
	}
	newContent = this.trim(newContent);
	if (newContent != this.trim(oldContent)) {
		wt_sk.dodajOpis();
	}
	$textbox.textSelection( 'setContents', newContent );
	wt_sk.verify();
	// FIXME: po co to?
	setTimeout('document.getElementById(wt_sk.buttonId).src = wt_sk.icon;',150);
}

wt_sk.userFunctions = [];

wt_sk.addUserFunction = function (callback) {
	this.userFunctions.push(callback);
}

wt_sk.addFormatButton = function () {
	var that = this;
	var button = {
		oldIcon: '//upload.wikimedia.org/wikipedia/commons/2/2e/Button_broom.png',
		newIcon: '//commons.wikimedia.org/w/thumb.php?f=Broom%20icon.svg&w=22',
		alt: 'Formatuj',
		id: this.buttonId,
		title: 'Porządkowanie kodu (wersja ' + this.version + ')'
	};

	if ( this.buttonIsActive() ) {
		button.onclick = function () {
			that.buttonClicked()
		};
	} else {
		button.title = 'Nie możesz wykonać sprzątania kodu na tej stronie (wersja ' + this.version + ')';
	}
	
	mw.libs.toolbarGadget.addButton( button );
	
	this.jezykBezJezyk = mw.libs.langData.shortLangs.join( '|' );

	this.waitIcon = '//upload.wikimedia.org/wikipedia/commons/c/cc/Bouton_Vandale2.png';
	this.inactiveIcon = '//upload.wikimedia.org/wikipedia/commons/f/f3/Button_broom2.png';

	this.preloadedWaitIcon.src = this.waitIcon;
}

mw.libs.langData = require( 'ext.gadget.langdata' );

// Dodaje przycisk do paska narzędziowego
$( function () {
	wt_sk.addFormatButton();
} );