Dokumentacja modułu [stwórz] [odśwież]
local p={};
function PoliczLiczbeStronWPodkategoriach(z_kategoriami_bledow,parametry_modul,argumenty_szablonu,zebrane_kategorie,bledy,czy_korzystana_kategoria)
	local parametry_modul=require("Module:Parametry");
	local techniczne_modul=require("Module:Techniczne");
	local szablonowe_modul=require("Module:Szablonowe");
	local specjalne_modul=require("Module:Specjalne");
	local nazwy_np_modul=mw.loadData("Module:Nazwy/Np");
	local Category=nazwy_np_modul.Category;
	local liczba_stron_w_kategoriach=0;
	for numer_argumentu_szablonu, nazwa_kategorii in ipairs(argumenty_szablonu) do
		if(numer_argumentu_szablonu~=0)then
			local nazwa_kategorii_naprawiona=parametry_modul["Odstępy"]{[1]=nazwa_kategorii,[2]="tak",};
			local liczba_stron_istniejacych,tabela_uchwytow_stron=techniczne_modul.PoliczZbiory(Category..":"..nazwa_kategorii_naprawiona);
			if(liczba_stron_istniejacych==0)then
				if(z_kategoriami_bledow)then
					if(tabela_uchwytow_stron[1][1])then
		        		parametry_modul.DodajElementDoZbioru(bledy,"Szablon rekurencyjna łączna liczba stron w kategoriach - nieistniejące kategorie");
		        	else
		        		parametry_modul.DodajElementDoZbioru(bledy,"Szablon rekurencyjna łączna liczba stron w kategoriach - niepoprawne kategorie");
		        	end;
            	end;
		    else    
				local zawartosc_strony=tabela_uchwytow_stron[1][2];
				zawartosc_strony=specjalne_modul["UsuńKomentarze"](zawartosc_strony);
				local tablica_obiektow_strony_dany_modul={};
				local tekst=szablonowe_modul:KodowanieSzablonowegoTekstuZObiektamiWikikodu(zawartosc_strony,nil,tablica_obiektow_strony_dany_modul,function(szablon,obiekt,kod)
					if(obiekt=="SZABLON")then
						local nazwa_szablonu,tabela_modyfikatorow,czy_z_parametrami=szablonowe_modul["NazwaSzablonuWywołania"](szablon);
						if(szablonowe_modul.CzyModyfikatoryZElementamiSzablonowymiNormalnymiSzablonowe(tabela_modyfikatorow,nazwa_szablonu,czy_z_parametrami))then
							if(nazwa_szablonu=="Łączna liczba stron w kategoriach")then
								local niepowtarzajace_sie_kategorie=true;
								if(zebrane_kategorie[nazwa_kategorii_naprawiona])then
	    							if(z_kategoriami_bledow)then
	    								if(not czy_korzystana_kategoria)then
	    									parametry_modul.DodajElementDoZbioru(bledy,"Szablon rekurencyjna łączna liczba stron w kategoriach - powtarzające się kategorie");
		    							else
	    									parametry_modul.DodajElementDoZbioru(bledy,"Szablon rekurencyjna łączna liczba stron w kategoriach - powtarzające się parametry");
	    								end;
	    							end;
	    							niepowtarzajace_sie_kategorie=false;
	    						end;
	    						if(niepowtarzajace_sie_kategorie)then
	    		    				zebrane_kategorie[nazwa_kategorii_naprawiona]=true;
	    	        				local tablica_argumentow_szablonu,nazwa_szablonu_wywolania,modyfikatory_wywolania=szablonowe_modul["ParsowanieWywołaniaSzablonu"](szablon);
	    	        				local liczba_stron_w_kategorii=0;
	    	        				for licznik,elementy_nieponumerowane_argumentow_szablonu in pairs(tablica_argumentow_szablonu)do
	    	        					if((type(licznik)=="number")and(licznik>0))then
	    	        						 local elementy_nieponumerowane_argumentow_szablonu2=parametry_modul["Odstępy"]{[1]=elementy_nieponumerowane_argumentow_szablonu,[2]="tak",};
	    	        	    				liczba_stron_w_kategorii=liczba_stron_w_kategorii+mw.site.stats.pagesInCategory(elementy_nieponumerowane_argumentow_szablonu2,"all");
	    	        					end;
	    	        				end;
	    	        				liczba_stron_w_kategoriach=liczba_stron_w_kategoriach+liczba_stron_w_kategorii;
	    	        			end;
	    					elseif(nazwa_szablonu=="Rekurencyjna łączna liczba stron w kategoriach")then
	    						local tablica_argumentow_szablonu,nazwa_szablonu_wywolania,modyfikatory_wywolania=szablonowe_modul["ParsowanieWywołaniaSzablonu"](szablon);
	    						for licznik,wartosc_argumentu in pairs(tablica_argumentow_szablonu) do
	    							wartosc_argumentu=parametry_modul["Odstępy"]{[1]=wartosc_argumentu,[2]="tak",};
	    							if((type(licznik)=="number")and(wartosc_argumentu~=""))then
	    								tablica_argumentow_szablonu[licznik]=wartosc_argumentu
	    							end;
	    						end;
	    						local niepowtarzajace_sie_kategorie=true
	    						if(zebrane_kategorie[nazwa_kategorii_naprawiona])then
	    							if(z_kategoriami_bledow)then
	    								if(not czy_korzystana_kategoria)then
	    									parametry_modul.DodajElementDoZbioru(bledy,"Szablon rekurencyjna łączna liczba stron w kategoriach - powtarzające się kategorie");
		    							else
	    									parametry_modul.DodajElementDoZbioru(bledy,"Szablon rekurencyjna łączna liczba stron w kategoriach - powtarzające się parametry");
	    								end;
	    							end;
	    							niepowtarzajace_sie_kategorie=false;
	    						end;
	    						zebrane_kategorie[nazwa_kategorii_naprawiona]=true;
	    						if(niepowtarzajace_sie_kategorie)then 
	    							liczba_stron_w_kategoriach=liczba_stron_w_kategoriach+PoliczLiczbeStronWPodkategoriach(z_kategoriami_bledow,parametry_modul,tablica_argumentow_szablonu,zebrane_kategorie,bledy,false);
	    						end;
	    					end;
	    				end;
	    			end;
				end);
			end;
		end;
	end;
	return liczba_stron_w_kategoriach;
end;
p["Rekurencyjna łączna liczba stron w kategoriach"]=function(frame)
	local parametry_modul=require("Module:Parametry");
	local args=parametry_modul.PobierzArgsParametry(frame,true);
	
	local bledy={};
	local nazwy_modul=require("Module:Nazwy");
	local nazwa_kategorii=(args["aktualna kategoria"])and (Category..':'..args["aktualna kategoria"]) or nil;
	local nazwa_strony_aktualnej=nazwy_modul["NAZWASTRONY"](nazwa_kategorii);
	local nazwa_przestrzeni=nazwy_modul["NAZWAPRZESTRZENI"](nazwa_kategorii);
	local zebrane_kategorie={};
	local nazwy_np_modul=mw.loadData("Module:Nazwy/Np");
	if(nazwa_przestrzeni==nazwy_np_modul.Category)then
		zebrane_kategorie[nazwa_strony_aktualnej]=true;
	end;
	local nazwy_np_modul=mw.loadData("Module:Nazwy/Np");
	local Category=nazwy_np_modul.Category;
	local parametry_modul=require("Module:Parametry");
	local z_kategoriami_bledow=not parametry_modul.CzyTak(args["bez kategorii"]);
	local liczba_argumentow_ponumerowanych_w_argumentach_szablonu=parametry_modul["MaksymalnaLiczbaParametruNienazwanegoTablicy"](args,"tak");
	if(liczba_argumentow_ponumerowanych_w_argumentach_szablonu==0)then 
		if(z_kategoriami_bledow)then
			local tab_parametrow={};
			tab_parametrow[1]="Szablon rekurencyjna łączna liczba stron w kategoriach - brak kategorii";
			local str_kategoria=p.Kategoria{args=tab_parametrow,};
			return "0"..str_kategoria;
		else
			return "0";
		end;
    end;
    for licznik,wartosc_argumentu in pairs(args) do
    	local wartosc_argumentu=parametry_modul["Odstępy"]{[1]=wartosc_argumentu,[2]="tak",};
    	if((type(licznik)=="number")and(wartosc_argumentu~=""))then
	    	args[licznik]=wartosc_argumentu;
	    end;
	end;
	local liczba_stron_w_kategortiach=PoliczLiczbeStronWPodkategoriach(z_kategoriami_bledow,parametry_modul,args,zebrane_kategorie,bledy,true);
	if((z_kategoriami_bledow)and(not parametry_modul["CzySąElementyNienazwaneTablicy"](bledy,"tak")))then
		if(nazwa_przestrzeni==nazwy_np_modul.Category)then
			local args2=parametry_modul["KopiujTabelęŁańcuchów"]{tabela=args,przedrostek='Category:'};
			local techniczne_modul=require("Module:Techniczne");
			local liczba_istniejacych_kategorii_w_aktualnej_kategorii,_=techniczne_modul.PoliczZbiory(args2);
			if(liczba_argumentow_ponumerowanych_w_argumentach_szablonu~=mw.site.stats.pagesInCategory(nazwa_strony_aktualnej,"subcats")
				or(liczba_argumentow_ponumerowanych_w_argumentach_szablonu~=liczba_istniejacych_kategorii_w_aktualnej_kategorii)
			)then
				parametry_modul.DodajElementDoZbioru(bledy,"Szablon rekurencyjna łączna liczba stron w kategoriach - niezgodność kategorii");
			end;
		end;
	end;
	local str_kategorie;
	if(parametry_modul["CzySąElementyNumerowaneTablicy"](bledy))then
		str_kategorie=p.Kategorie{args=bledy}
	else
		str_kategorie="";
	end;

	return liczba_stron_w_kategortiach..str_kategorie;
end;
p["Łączna liczba stron w kategoriach"] = function(frame)
	local parametry_modul=require("Module:Parametry");
	local args=parametry_modul.PobierzArgsParametry(frame,true);
	
	local parametry_modul=require("Module:Parametry");
	local z_kategoriami_bledow=not parametry_modul.CzyTak(args["bez kategorii"]);
	local liczba_argumentow_ponumerowanych_w_argumentach_szablonu=parametry_modul["MaksymalnaLiczbaParametruNienazwanegoTablicy"](args,"tak");
	if(liczba_argumentow_ponumerowanych_w_argumentach_szablonu==0)then 
		if(z_kategoriami_bledow)then
			local tab_parametrow={};
			tab_parametrow[1]="Szablon łączna liczba stron w kategoriach - brak kategorii";
			local str_kategoria=p.Kategoria{args=tab_parametrow,};
			return "0"..str_kategoria;
		else
			return "0";
		end;
	end;
	local tabela_kategorii={};
	for licznik=1,liczba_argumentow_ponumerowanych_w_argumentach_szablonu,1 do args[licznik]=parametry_modul["Odstępy"]{[1]=args[licznik],[2]="tak",};end;
	local liczba_stron_w_kategorii=0;
	local liczba_kategorii_w_korzystanej_kategorii=0;
	local czy_ma_liczyc_zgodnosc_kategorii=true;
	local nazwy_np_modul=mw.loadData("Module:Nazwy/Np");
	local Category=nazwy_np_modul.Category;
	local techniczne_modul=require("Module:Techniczne");
	for licznik,wartosc_argumentu in pairs(args)do
		if((type(licznik)=="number")and(mw.text.trim(wartosc_argumentu)~=""))then
			local liczba_istniejacych_kategorii,tabela_uchwytow_stron=techniczne_modul.PoliczZbiory("Category:"..args[licznik]);
			if(liczba_istniejacych_kategorii==0)then
				if(z_kategoriami_bledow)then
					if(tabela_uchwytow_stron[1][1])then
						parametry_modul.DodajElementDoZbioru(tabela_kategorii,"Szablon łączna liczba stron w kategoriach - nieistniejące kategorie");
					else
						parametry_modul.DodajElementDoZbioru(tabela_kategorii,"Szablon łączna liczba stron w kategoriach - niepoprawne kategorie");
					end;
				end;
				czy_ma_liczyc_zgodnosc_kategorii=false;
			else
		    	local czy_niepowtarzajace_kategorie=true;  
    	    	for licznik2=licznik+1,liczba_argumentow_ponumerowanych_w_argumentach_szablonu,1 do
    	    		if(args[licznik]==args[licznik2])then
    	    			if(z_kategoriami_bledow)then
    	    				parametry_modul.DodajElementDoZbioru(tabela_kategorii,"Szablon łączna liczba stron w kategoriach - powtarzające się parametry");
    	    			end;
    	    			czy_niepowtarzajace_kategorie=false;
    	    			czy_ma_liczyc_zgodnosc_kategorii=false;
                    	break;
    	    		end;
    	    	end;
    	    	if(czy_niepowtarzajace_kategorie)then 
    	    		liczba_kategorii_w_korzystanej_kategorii=liczba_kategorii_w_korzystanej_kategorii+1;
    	    		liczba_stron_w_kategorii=liczba_stron_w_kategorii+mw.site.stats.pagesInCategory(args[licznik],"all");
    	    	end;
			end;
		end;
	end;
	if(z_kategoriami_bledow)then
		if(czy_ma_liczyc_zgodnosc_kategorii)then
			local nazwy_modul=require("Module:Nazwy");
			local nazwa_kategorii=(args["aktualna kategoria"])and ('Category:'..args["aktualna kategoria"]) or nil;
			local nazwa_strony_aktualnej=nazwy_modul["NAZWASTRONY"](nazwa_kategorii);
	        local nazwa_przestrzeni=nazwy_modul["NAZWAPRZESTRZENI"](nazwa_kategorii);
	        local nazwy_np_modul=mw.loadData("Module:Nazwy/Np");
	        if(nazwa_przestrzeni==nazwy_np_modul.Category)then
        		local liczba_kategorii_w_kategorii_aktualnej=mw.site.stats.pagesInCategory(nazwa_strony_aktualnej,"subcats")+(((args["kategoria alternatywna jako podkategoria"])and(args["kategoria alternatywna jako podkategoria"]~="")) and -1 or 0);
        		local liczba_kategorii_w_kategorii_alternatywnej=0;
        		if(args["kategoria alternatywna"])then
        			local iter=mw.text.gsplit(args["kategoria alternatywna"], "|", true );
        			for kategoria in iter do
        				liczba_kategorii_w_kategorii_alternatywnej=liczba_kategorii_w_kategorii_alternatywnej+mw.site.stats.pagesInCategory(mw.text.trim(kategoria),"subcats");
        			end;
        		end;
				if(liczba_kategorii_w_korzystanej_kategorii~=liczba_kategorii_w_kategorii_aktualnej+liczba_kategorii_w_kategorii_alternatywnej)then
					parametry_modul.DodajElementDoZbioru(tabela_kategorii,"Szablon łączna liczba stron w kategoriach - niezgodność kategorii");
				end;	
			end;
		end;
	end;
	local str_kategorie;
	if(parametry_modul["CzySąElementyNumerowaneTablicy"](tabela_kategorii))then
		str_kategorie=p.Kategorie{args=tabela_kategorii,};
	else
		str_kategorie="";
	end;
	
	return liczba_stron_w_kategorii..str_kategorie;
end;
function p.DomniemanaNazwaSortowaniaStrony(frame)
	return p:DomniemanaNazwaSortowania(frame);
end;
function p.DomniemanaNazwaSortowania(self,frame)
	if(self.nazwa_sortowania)then return self.nazwa_sortowania;end;
	local pudelko_modul=require("Module:Pudełko");
	local nazwa_sortowania=pudelko_modul["Nazwa jednostki 2"](frame);
	local nazwa_przestrzeni_nazw=pudelko_modul["Nazwa przestrzeni nazw 2"](frame);
	local nazwy_np_modul=mw.loadData("Module:Nazwy/Np");
	local category=nazwy_np_modul.Category;
	if(nazwa_przestrzeni_nazw==category)then nazwa_sortowania,_=mw.ustring.gsub(nazwa_sortowania,"^Książka:(.*)$","%1");end;
	local koncowka=mw.ustring.match(nazwa_sortowania,"%.([^/%.]+)$");
	local inne_niz_mediawiki=((nazwa_przestrzeni_nazw==nazwy_np_modul.Template)or(nazwa_przestrzeni_nazw==nazwy_np_modul.Module));
	if((inne_niz_mediawiki)or(nazwa_przestrzeni_nazw==nazwy_np_modul.MediaWiki))then
		nazwa_sortowania=inne_niz_mediawiki and mw.ustring.gsub(nazwa_sortowania,"^Książka:","") or nazwa_sortowania;
		local koncowka=mw.ustring.match(nazwa_sortowania,"%.([^/%.]+)$");
		if(koncowka)then
			koncowka=mw.getContentLanguage():lc(koncowka);
			if((koncowka=="css")or((not inne_niz_mediawiki)and(koncowka=="js")))then
				nazwa_sortowania=mw.ustring.gsub(nazwa_sortowania,"(/[^/]*%.[^/%.]+)$","");
			end;
		end;
	end;
	nazwa_sortowania=mw.ustring.gsub(nazwa_sortowania,"[/%s_]+$","");
	nazwa_sortowania=mw.ustring.gsub(nazwa_sortowania,"^.*/([^/]+)$","%1");
	self.nazwa_sortowania=nazwa_sortowania;
    return nazwa_sortowania;
end;
function p.CzyKategoriaDlaKategorii(frame)
	local pudelko_modul=require("Module:Pudełko");
	local nazwa_przestrzeni=pudelko_modul["Nazwa przestrzeni nazw 2"](frame);
	local nazwy_np_modul=mw.loadData("Module:Nazwy/Np");
	if(nazwa_przestrzeni==nazwy_np_modul.Category)then
		local nazwa_strony=pudelko_modul["Nazwa jednostki 2"](frame);
		local kategorie_dla_kategorii="Kategorie dla kategorii";
		if(nazwa_strony==kategorie_dla_kategorii)then return nil;end;
		local techniczne_modul=require("Module:Techniczne");
		local liczba_stron_istniejacych,tabela_uchwytow_stron=techniczne_modul.PoliczZbiory("Category:"..kategorie_dla_kategorii);
		if(liczba_stron_istniejacych==0)then return nil;end;
		local liczba_stron_w_kategorii_aktualnej=mw.site.stats.pagesInCategory(nazwa_strony,"pages");
		local liczba_podkategorii_w_kategorii_aktualnej=mw.site.stats.pagesInCategory(nazwa_strony,"subcats");
		local liczba_plikow_w_kategorii_aktualnej=mw.site.stats.pagesInCategory(nazwa_strony,"files");
		if((liczba_stron_w_kategorii_aktualnej>0)or (liczba_plikow_w_kategorii_aktualnej>0)or(liczba_podkategorii_w_kategorii_aktualnej==0))then return nil;end;
		return "tak";
	end;
	return nil;
end;
function p.KategoriaDlaKategorii(frame)
    local czy_kategoria_dla_kategorii=p.CzyKategoriaDlaKategorii(frame)
    if(czy_kategoria_dla_kategorii)then
		local nazwa_sortowania=p:DomniemanaNazwaSortowania(frame);
		local nazwy_np_modul=mw.loadData("Module:Nazwy/Np");
		local Category=nazwy_np_modul.Category;
		return "[["..Category..":Kategorie dla kategorii|"..nazwa_sortowania.."]]";
	end;
	return "";
end;
function p.Kategoria(frame)
	local parametry_modul=require("Module:Parametry");
	local m=parametry_modul.PobierzFrameEwentualnieParent(frame);
	local args=parametry_modul.PobierzArgsParametry(frame,true);
	
	local nazwy_np_modul=mw.loadData("Module:Nazwy/Np");
	local Category=nazwy_np_modul.Category;
	local parametry_modul=require("Module:Parametry");
	local z_kategoriami_bledow=not parametry_modul.CzyTak(args["bez kategorii"]);
	local kategoria2=args[1] and parametry_modul["Odstępy"]{[1]=args[1],[2]="tak",};
	local kategoria=parametry_modul.CzyTak(kategoria2) and mw.getContentLanguage():ucfirst(kategoria2) or nil;
	local nazwa_sortowania=args[2] and parametry_modul["Odstępy"]{[1]=args[2],[2]="tak",};
	local czy_nazwa_sortowania_aut=parametry_modul.CzyTak(args["nie sortuj nazwą"] or args["n"]);
	local czy_nie_kategorie_dla_kategorii=parametry_modul.CzyTak(args["nie kategorie dla kategorii"] or args["nk"]);
	local kategorie_dla_kategorii="Kategorie dla kategorii";
	local function DodawanieKategorii()
		local sortuj=args["sortuj spacją"] or args["s"];
		local techniczne_modul=require("Module:Techniczne");
		local liczba_istniejacych_stron,tabela_uchwytow_stron=techniczne_modul.PoliczZbiory(Category..":"..kategoria);
		local dotatkowekategorie="";
		local nazwa_sortowania_aut;
		if(z_kategoriami_bledow)then
			if(liczba_istniejacych_stron==0)then
	            nazwa_sortowania_aut=p:DomniemanaNazwaSortowania(frame);
				if(tabela_uchwytow_stron[1][1])then
					dotatkowekategorie="[["..Category..":Szablon kategoria - nieistniejąca kategoria|"..nazwa_sortowania_aut.."]]";
				else
					dotatkowekategorie="[["..Category..":Szablon kategoria - niepoprawna kategoria|"..nazwa_sortowania_aut.."]]";
				end;
			end;
		end;
		if(parametry_modul.CzyTak(nazwa_sortowania))then
			return ((tabela_uchwytow_stron[1][1])and "[["..Category..":"..kategoria..((not czy_nazwa_sortowania_aut) and ("|"..((parametry_modul.CzyTak(sortuj))and " " or nazwa_sortowania)) or "").."]]" or "")..dotatkowekategorie..((czy_nie_kategorie_dla_kategorii or (kategoria==kategorie_dla_kategorii)) and "" or p.KategoriaDlaKategorii(frame));
		else
			if(parametry_modul.CzyTak(sortuj))then
				return ((tabela_uchwytow_stron[1][1])and "[["..Category..":"..kategoria.."| ]]" or "")..dotatkowekategorie..((czy_nie_kategorie_dla_kategorii or (kategoria==kategorie_dla_kategorii)) and "" or p.KategoriaDlaKategorii(frame));
			else
				nazwa_sortowania_aut=p:DomniemanaNazwaSortowania(frame);
				return ((tabela_uchwytow_stron[1][1])and "[["..Category..":"..kategoria..(((not czy_nazwa_sortowania_aut) and (not nazwa_sortowania)) and ("|"..nazwa_sortowania_aut) or "").."]]" or "")..dotatkowekategorie..((czy_nie_kategorie_dla_kategorii or (kategoria==kategorie_dla_kategorii)) and "" or p.KategoriaDlaKategorii(frame));
			end;
		end;
	end;
	if(parametry_modul.CzyTak(kategoria))then
		return DodawanieKategorii();
	end;
	local title=mw.title.getCurrentTitle();
	local nazwy_np_modul=mw.loadData("Module:Nazwy/Np")
	local category=nazwy_np_modul.Category;
	if(title.nsText==category)then nazwa_sortowania,_=mw.ustring.gsub(title.text,"^Książka:(.*)$","%1");else nazwa_sortowania=title.text;end;
	--nazwa_sortowania,_=mw.ustring.gsub(nazwa_sortowania,"^.*/([^/]+)$","%1");
	local nazwa_sortowania_aut=p:DomniemanaNazwaSortowania(frame);
	return "[["..Category..":Szablon kategoria - nazwa kategorii pusta lub niepodana|"..nazwa_sortowania_aut.."]]"..((czy_nie_kategorie_dla_kategorii or (kategoria==kategorie_dla_kategorii)) and "" or p.KategoriaDlaKategorii(frame));
end;
function p.Kategorie(frame)
	local parametry_modul=require("Module:Parametry");
	local m=parametry_modul.PobierzFrameEwentualnieParent(frame);
	local args=parametry_modul.PobierzArgsParametry(frame,true);
	
	local tablica_kategorii_bledow={};
	local tablica_kategorii={};
	local tablica_czy_kategorie_sie_powtarzaja={};
	local nazwy_np_modul=mw.loadData("Module:Nazwy/Np");
	local Category=nazwy_np_modul.Category;
	local parametry_modul=require("Module:Parametry");
	local z_kategoriami_bledow=not parametry_modul.CzyTak(args["bez kategorii"]);
	local czy_sa_argumenty_ponumerowane=parametry_modul["CzySąElementyNienazwaneTablicy"](args);
	if(not czy_sa_argumenty_ponumerowane)then 
		if(z_kategoriami_bledow)then
			local nazwa_sortowania_aut=p:DomniemanaNazwaSortowania(frame);
			return "[["..Category..":Szablon kategorie - nie podano nazw kategorii|"..nazwa_sortowania_aut.."]]"..(czy_nie_kategorie_dla_kategorii and "" or p.KategoriaDlaKategorii(frame));
		else
			return (czy_nie_kategorie_dla_kategorii and "" or p.KategoriaDlaKategorii(frame));
		end;
	end;
	local klucz_sortowania=args["klucz sortowania"] or args["k"];
	local czy_klucz_sortowania=parametry_modul.CzyTak(klucz_sortowania);
	local czy_nie_kategorie_dla_kategorii=parametry_modul.CzyTak(args["nie kategorie dla kategorii"] or args["nk"]);
	local kategorie_dla_kategorii="Kategorie dla kategorii";
	local techniczne_modul=require("Module:Techniczne");
	local nazwa_sortowania_aut;
	for licznik,wartosc_argumentu in pairs(args)do
		if(type(licznik)=="number")then
	   		local kategoria=wartosc_argumentu and parametry_modul["Odstępy"]{[1]=wartosc_argumentu,[2]="tak",};
	   		if((kategoria)and(kategoria~=""))then
	   			local _i=args["_"..licznik] or args["_i"];
				local nazwa_sortowania=_i and parametry_modul["Odstępy"]{[1]=_i,[2]="tak",};
				local sortuj=(not czy_klucz_sortowania) and (parametry_modul.CzyTak(args["sortuj spacją "..licznik] or args["s"..licznik] or args["sortuj spacją"] or args["s"])) or nil;
				local czy_nazwa_sortowania_aut=parametry_modul.CzyTak(args["nie sortuj nazwą "..licznik] or args["n"..licznik] or args["nie sortuj nazwą"] or args["n"]);
				local function DodawanieKategorii()
					local liczba_istniejacych_stron,tabela_uchwytow_stron=techniczne_modul.PoliczZbiory(Category..":"..kategoria);
					if(z_kategoriami_bledow)then
						if(liczba_istniejacych_stron==0)then
							nazwa_sortowania_aut=p:DomniemanaNazwaSortowania(frame);
							if(tabela_uchwytow_stron[1][1])then
			    				parametry_modul.DodajElementDoZbioru(tablica_kategorii_bledow,"[["..Category..":Szablon kategorie - nieistniejące kategorie|"..nazwa_sortowania_aut.."]]");
			    			else
			    				parametry_modul.DodajElementDoZbioru(tablica_kategorii_bledow,"[["..Category..":Szablon kategorie - niepoprawne kategorie|"..nazwa_sortowania_aut.."]]");
			    			end;
			    		end;
					end;
					local czy_sie_nie_powtarza=true;
					kategoria=mw.getContentLanguage():ucfirst(kategoria);
					if(tablica_czy_kategorie_sie_powtarzaja[kategoria])then
				    	if(z_kategoriami_bledow)then	
							nazwa_sortowania_aut=p:DomniemanaNazwaSortowania(frame);
							parametry_modul.DodajElementDoZbioru(tablica_kategorii_bledow,"[["..Category..":Szablon kategorie - powtarzające się kategorie|"..nazwa_sortowania_aut.."]]");
						end;
						czy_sie_nie_powtarza=false;
					end;
					if((czy_sie_nie_powtarza)and (tabela_uchwytow_stron[1][1]))then 
						if(parametry_modul.CzyTak(nazwa_sortowania))then
							tablica_kategorii[#tablica_kategorii+1]="[["..Category..":"..kategoria..((not czy_klucz_sortowania)and("|"..((parametry_modul.CzyTak(sortuj))and " " or nazwa_sortowania)) or "").."]]";
						else
							if(parametry_modul.CzyTak(sortuj))then
								tablica_kategorii[#tablica_kategorii+1]="[["..Category..":"..kategoria.."| ]]";
							else
								nazwa_sortowania_aut=p:DomniemanaNazwaSortowania(frame);
								tablica_kategorii[#tablica_kategorii+1]="[["..Category..":"..kategoria..(((not czy_nazwa_sortowania_aut) and (not czy_klucz_sortowania)) and ("|"..nazwa_sortowania_aut) or "").."]]";
							end;
						end;
					end;
					tablica_czy_kategorie_sie_powtarzaja[kategoria]=true;
				end;
				DodawanieKategorii();
	   		elseif((kategoria)and(kategoria==""))then
				nazwa_sortowania_aut=p:DomniemanaNazwaSortowania(frame);
				parametry_modul.DodajElementDoZbioru(tablica_kategorii_bledow,"[["..Category..":Szablon kategorie - puste kategorie|"..nazwa_sortowania_aut.."]]");
			end;
		end;
	end;
	local lancuch_kategorii=table.concat(tablica_kategorii,"")..table.concat(tablica_kategorii_bledow);
	if(lancuch_kategorii~="")then
		if(czy_klucz_sortowania)then
			klucz_sortowania=parametry_modul["Odstępy"]{[1]=klucz_sortowania,[2]="tak",};
			lancuch_kategorii=m:callParserFunction("DEFAULTSORT",klucz_sortowania)..lancuch_kategorii;
		end;
	end;
	return lancuch_kategorii..((czy_nie_kategorie_dla_kategorii or (tablica_czy_kategorie_sie_powtarzaja[kategorie_dla_kategorii])) and "" or p.KategoriaDlaKategorii(frame));
end;
function p.OpakujKategorie(frame)
	local pf=frame:getParent();
	local wikikod=frame.args[1] or pf.args[1];
	local _;
	wikikod,_=mw.ustring.gsub(wikikod,"__NOINDEX__","")
	local bez_kategorii=frame.args["bez kategorii wikikodu"] or pf.args["bez kategorii wikikodu"];
	local z_nazwa_sortowania=frame.args["z nazwą sortowania"] or pf.args["z nazwą sortowania"];
	local category;
	local tablica_category={};
	local iterator1=mw.ustring.gmatch(wikikod,"%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:%s*[^%[%]]+%s*%]%]");
	local iterator2=mw.ustring.gmatch(wikikod,"%[%[%s*[Kk][Aa][Tt][Ee][Gg][Oo][Rr][Ii][Aa]%s*:%s*[^%[%]]+%s*%]%]");
		
	local parametry_modul=require("Module:Parametry");
	local function Nazwa_kategorii(category)
		local nazwa=mw.ustring.match(category,"^%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:%s*([^|]*)")
		if(nazwa)then
			return parametry_modul["Odstępy"]{[1]=nazwa,[2]="tak",};
		else	
			nazwa=mw.ustring.match(category,"^%[%[%s*[Kk][Aa][Tt][Ee][Gg][Oo][Rr][Ii][Aa]%s*:%s*([^|]*)");
			if(nazwa)then
				return parametry_modul["Odstępy"]{[1]=nazwa,[2]="tak",};
			end;
		end;
		return nil;
	end;
		
	local sprawdz_modul=require("Module:Sprawdź");
	local nazwa_sprawdzania_parametrow_szablonu=sprawdz_modul["NazwaKategoriiSprawdzaniaParametrówSzablonu"]();
		
	for category in iterator1 do 
		local nazwa=Nazwa_kategorii(category);
		if((nazwa)and(nazwa~=nazwa_sprawdzania_parametrow_szablonu))then
			tablica_category[category]="";
		end;
	end;
	for category in iterator2 do 
		local nazwa=Nazwa_kategorii(category);
		if((nazwa)and(nazwa~=nazwa_sprawdzania_parametrow_szablonu))then
			tablica_category[category]="";
		end;
	end;
	local parametry_modul=require("Module:Parametry");
	if(not parametry_modul["CzySąElementyTablicy"](tablica_category))then return wikikod;end;
	wikikod=mw.ustring.gsub(wikikod,"(%[%[%s*[^%[%]]+%s*%]%])",tablica_category);
	if(parametry_modul.CzyTak(bez_kategorii))then return wikikod;end;
	local czy_z_nazwa_sortowania=parametry_modul.CzyTak(z_nazwa_sortowania);
	local ulramka=mw.html.create('ul');
	ulramka:addClass('okul');
	local pionowa=false;
	local kategorie_istnieja=frame.args["kategorie istnieją"] or pf.args["kategorie istnieją"];
	local czy_kategorie_istnieja=parametry_modul.CzyTak(kategorie_istnieja);
	local parametry_modul=require("Module:Parametry")
	local i=1;
	for nazwa,wartosc in pairs(tablica_category) do
		local nazwa2;
		local kategoria_istnieje=mw.ustring.match(nazwa,"%[%[%s*[Kk][Aa][Tt][Ee][Gg][Oo][Rr][Ii][Aa]%s*:%s*([^|%[%]]+)%s*%]%]");
			
		if(kategoria_istnieje)then 
			nazwa2="[[:Category:"..kategoria_istnieje.."|"..kategoria_istnieje.."]]";
		else
			kategoria_istnieje=mw.ustring.match(nazwa,"%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:%s*([^|%[%]]+)%s*%]%]");
			if(kategoria_istnieje)then 
				nazwa2="[[:Category:"..kategoria_istnieje.."|"..kategoria_istnieje.."]]";
			else
				function tag(nazwa)
					local czy_tag=mw.ustring.match(nazwa,"<[^/][^<>]->([^<>]*)<%s*/[^<>]+>");
					while czy_tag do
						nazwa=mw.ustring.gsub(nazwa,"<[^/][^<>]->([^<>]*)<%s*/[^<>]+>","%1");
						czy_tag=mw.ustring.match(nazwa,"<[^/][^<>]->([^<>]*)<%s*/[^<>]+>");
					end;
					return nazwa;
				end;
				kategoria_istnieje,nazwa_sortowania_kategorii_istniejacej=mw.ustring.match(nazwa,"%[%[%s*[Kk][Aa][Tt][Ee][Gg][Oo][Rr][Ii][Aa]%s*:%s*([^|%[%]]+)%s*|%s*([^%[%]]*)%s*%]%]");
				if(kategoria_istnieje)then 
					nazwa_sortowania_kategorii_istniejacej,_=tag(nazwa_sortowania_kategorii_istniejacej)
					nazwa2="[[:Category:"..kategoria_istnieje.."|"..kategoria_istnieje.."]]"..((czy_z_nazwa_sortowania)and ("<sup title=\""..nazwa_sortowania_kategorii_istniejacej.."\">["..i.."]</sup>") or "");i=i+1;
				else
					local kategoria_istnieje,nazwa_sortowania_kategorii_istniejacej=mw.ustring.match(nazwa,"%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:%s*([^|%[%]]+)%s*|%s*([^%[%]]*)%s*%]%]");
					if(kategoria_istnieje)then 
						nazwa_sortowania_kategorii_istniejacej,_=tag(nazwa_sortowania_kategorii_istniejacej);
						nazwa2="[[:Category:"..kategoria_istnieje.."|"..kategoria_istnieje.."]]"..((czy_z_nazwa_sortowania)and ("<sup title=\""..nazwa_sortowania_kategorii_istniejacej.."\">["..i.."]</sup>") or "");i=i+1;
					end;
				end;
			end;
		end;
		if(((not czy_kategorie_istnieja)or((czy_kategorie_istnieja)and((not kategoria_istnieje)or((kategoria_istnieje~="Szablon kategoria - nieistniejąca kategoria")and(kategoria_istnieje~="Szablon kategorie - nieistniejące kategorie")))))
			and((not kategoria_istnieje)or(kategoria_istnieje~=nazwa_sprawdzania_parametrow_szablonu))
		)then
			nazwa2=parametry_modul["Odstępy"]{[1]=nazwa2,[2]="tak",};
			local liramka=mw.html.create('li');
			liramka:addClass('okli');
            if(pionowa)then 
            	liramka:addClass('oklilo');
            	pionowa=true;
            else
            	pionowa=true;
            end;
			liramka:wikitext(nazwa2);
			ulramka:node(liramka);
		end;
	end;
	local kategorie="[[Specjalna:Kategorie|Kategorie]]:"
	local divramka=mw.html.create('div');
	divramka:addClass('oks');
	divramka:wikitext(kategorie);
	divramka:node(ulramka);
	divcalosc=mw.html.create('div');
	divcalosc:addClass('ocwkzks');
	local divwikikod=mw.html.create('div');
	divwikikod:addClass('obkwk');
	divwikikod:wikitext(parametry_modul["CzyTakCiąg"](wikikod) and (wikikod) or "");
	divcalosc:node(divwikikod);
	divcalosc:node(divramka)
	return tostring(divcalosc:allDone());
end;
return p;