Dokumentacja modułu [stwórz] [odśwież]
local p={};
function SzablonModulParserWywolanie(frame, co_ma_wywolac)
	local pf=frame:getParent();
    local nazwa_szablonu_modulu_lub_parsera="Nazwa";
	local szablon_modul_lub_parser=frame.args[nazwa_szablonu_modulu_lub_parsera];
	local argumenty_szablonu_modulu_lub_parsera={};
		
	local tabela_by_sprawdzic_czy_powstarzaja_sie_parametry_dzieci_i_rodzica={};
		
	local bez_parametrow={[nazwa_szablonu_modulu_lub_parsera]=true,
			              ["bez argumentów rodzica"]=true,
			              ["nazwa szablonu rodzica"]=true,
			              ["bez argumentów nienazwanych rodzica"]=true,
			              ["potomek"]=true,
			              ["nie potomek"]=true,
			              ["parametry rodzica"]=true,
			              ["zmienna z parametrami rodzica"]=true,
			              ["zmienna z argumentami ramki"]=true,
			              ["zmienna z nazwą szablonu rodzica"]=true,
			              ["parametry funkcji modułu pudełek"]=true,
			              ["parametry podstawowe funkcji modułu pudełek"]=true,
	};
	if(co_ma_wywolac==1)then bez_parametrow["Funkcja"]=true;end;
		
	for nazwa_parametru,wartosc_parametru in pairs(frame.args) do
		if((type(nazwa_parametru)=="number")or((type(nazwa_parametru)=="string")and(not bez_parametrow[nazwa_parametru])))then
			tabela_by_sprawdzic_czy_powstarzaja_sie_parametry_dzieci_i_rodzica[nazwa_parametru]=nazwa_parametru;
			argumenty_szablonu_modulu_lub_parsera[nazwa_parametru]=wartosc_parametru;
		end;
	end;
		
	local parametry_modul=require("Module:Parametry");
	local szablonowe_modul=require("Module:Szablonowe");
	local tabela_bez_argumentow=p.RozpakujArgumenty(frame.args["bez argumentów rodzica"]);
	local czy_przekazac_parametry_rodzica=parametry_modul.CzyTak(frame.args["zmienna z parametrami rodzica"]);
	local z_dodatkowymi_sprawdzeniami=not(parametry_modul.CzyTak(frame.args["bez dodatkowych sprawdzeń"]) or parametry_modul.CzyTak(pf.args["bez dodatkowych sprawdzeń"]));
		
	local PakujArgumentyRamki = function(args)
		local czy_tylko_ze_zmienna_bez_argumentow_szablonu=args["zmienna z argumentami ramki"];
		if(not parametry_modul.CzyTak(czy_tylko_ze_zmienna_bez_argumentow_szablonu))then return args["bez argumentów szablonu"];end;
    	local tabelka1={};
    	for nazwa_parametru,_ in pairs(args)do
    		if((type(nazwa_parametru)=="number")or((type(nazwa_parametru)=="string")and(not bez_parametrow[nazwa_parametru])))then
				tabelka1[nazwa_parametru]=true;
			end;
    	end;
    	
    	local tabelka2=(args["bez argumentów szablonu"]) and p.RozpakujArgumenty(args["bez argumentów szablonu"]);
    		
    	local tabelka=parametry_modul["ŁączDwieTabele"](tabelka1,tabelka2);
    		
    	local tablica_mikroszablonow={
	         [";"]="{{+}}",
	    };
    	local str="";
    	for name,_ in pairs(tabelka) do
    		str=str..((str~="")and ";" or "")..mw.ustring.gsub(mw.text.trim(name),".",tablica_mikroszablonow);
    	end;
    	return str,tabelka2;
	end;
	local bez_argumentow_szablonu=nil;
	if(czy_przekazac_parametry_rodzica)then
		if(z_dodatkowymi_sprawdzeniami)then
			local str=p.PakujParametry(pf.args);
		    argumenty_szablonu_modulu_lub_parsera["parametry rodzica"]=str;
		end;
		argumenty_szablonu_modulu_lub_parsera["potomek"]="tak";
		argumenty_szablonu_modulu_lub_parsera["bez argumentów szablonu"],bez_argumentow_szablonu=PakujArgumentyRamki(frame.args);
		argumenty_szablonu_modulu_lub_parsera["nazwa szablonu rodzica"]=pf.args["nazwa szablonu rodzica"] or szablonowe_modul.NazwaSzablonu(pf:getTitle());
	else
		local function ZmiennaZNazwaSzablonuRodzica()
			local czy_ze_nazwa_szablonu=frame.args["zmienna z nazwą szablonu rodzica"];
			if(parametry_modul.CzyTak(czy_ze_nazwa_szablonu))then
				argumenty_szablonu_modulu_lub_parsera["nazwa szablonu rodzica"]=pf.args["nazwa szablonu rodzica"] or szablonowe_modul.NazwaSzablonu(pf:getTitle());
			end;
		end;
		local z_argumentami_najwyzszego_rodzica=not parametry_modul.CzyTak(tabela_bez_argumentow["nie potomek"]);
		if(z_argumentami_najwyzszego_rodzica)then
			local potomek=parametry_modul.CzyTak(pf.args["potomek"]);
			if(potomek)then
			    local parametry_rodzic=pf.args["parametry rodzica"];
			    if(parametry_rodzic)then
			    	if(z_dodatkowymi_sprawdzeniami)then
			    		argumenty_szablonu_modulu_lub_parsera["parametry rodzica"]=parametry_rodzic;
			    	end;
		    		argumenty_szablonu_modulu_lub_parsera["potomek"]="tak";
		    		argumenty_szablonu_modulu_lub_parsera["bez argumentów szablonu"],bez_argumentow_szablonu=PakujArgumentyRamki(frame.args);
		    		argumenty_szablonu_modulu_lub_parsera["nazwa szablonu rodzica"]=pf.args["nazwa szablonu rodzica"] or szablonowe_modul.NazwaSzablonu(pf:getTitle());
		    	else
		    		ZmiennaZNazwaSzablonuRodzica();
			    end;
			else
			    ZmiennaZNazwaSzablonuRodzica();
			end;
		else
			ZmiennaZNazwaSzablonuRodzica()
		end;
	end;
		
	local czy_bez_argumentow_nienazwanych_rodzica=parametry_modul.CzyTak(frame.args["bez argumentów nienazwanych rodzica"]);
	local czy_parametry_pudelka=parametry_modul.CzyTak(frame.args["parametry funkcji modułu pudełek"]);
	local czy_parametry_pudelka_podstawowe=parametry_modul.CzyTak(frame.args["parametry podstawowe funkcji modułu pudełek"])
	local pudelko_modul=require("Module:Pudełko");
		
	for nazwa_parametru,wartosc_parametru in pairs(pf.args) do
		if(((type(nazwa_parametru)=="number")or((type(nazwa_parametru)=="string")and(not bez_parametrow[nazwa_parametru])))and((not bez_argumentow_szablonu)or(not bez_argumentow_szablonu[nazwa_parametru])))then
			if((not tabela_by_sprawdzic_czy_powstarzaja_sie_parametry_dzieci_i_rodzica[nazwa_parametru])
				and(not tabela_bez_argumentow[nazwa_parametru])
				and((not czy_bez_argumentow_nienazwanych_rodzica)or((czy_bez_argumentow_nienazwanych_rodzica)and(not tonumber(nazwa_parametru)))
			))then
			    local czy_dodac_do_parametrow;
			    if czy_parametry_pudelka or czy_parametry_pudelka_podstawowe then
			        local czy_dodac_do_parametrow=((not czy_parametry_pudelka_podstawowe)
			        											 and mw.ustring.match(nazwa_parametru,"^nazwa przestrzeni nazw %d+$")
			        		                                     and not pudelko_modul.CzyNiepoprawnaNazwa(wartosc_parametru))
			        	                           or (mw.ustring.match(nazwa_parametru,"^nazwa przestrzeni nazw$")
			        	                           	             and not pudelko_modul.CzyNiepoprawnaNazwa(wartosc_parametru))
			        	                           or ((not czy_parametry_pudelka_podstawowe)			
			        	                           				 and mw.ustring.match(nazwa_parametru,"^nazwa jednostki %d+$")
			        	                           	             and wartosc_parametru~="" 
			        	                           	             and not pudelko_modul.CzyNiepoprawnaNazwa(wartosc_parametru)) 
			        	                           or (mw.ustring.match(nazwa_parametru,"^nazwa jednostki$")
			        	                           	             and wartosc_parametru~="" 
			        	                           	             and not pudelko_modul.CzyNiepoprawnaNazwa(wartosc_parametru))
			        	                           or ((not czy_parametry_pudelka_podstawowe)
			        	                           				 and mw.ustring.match(nazwa_parametru,"^typ jednostki %d+$")
			        	                           	             and wartosc_parametru~="" 
			        	                           	             and not pudelko_modul.CzyNiepoprawnaNazwa(wartosc_parametru))
			        	                           or (mw.ustring.match(nazwa_parametru,"^typ jednostki$")
			        	                           	             and wartosc_parametru~="" 
			        	                           	             and not pudelko_modul.CzyNiepoprawnaNazwa(wartosc_parametru));
			        if(czy_dodac_do_parametrow)then
			        	argumenty_szablonu_modulu_lub_parsera[nazwa_parametru]=wartosc_parametru;
			        end;
			    else
					argumenty_szablonu_modulu_lub_parsera[nazwa_parametru]=wartosc_parametru;
				end;
			end;
		end;
	end;
	if(co_ma_wywolac==0)then
		return pf:expandTemplate{title=szablon_modul_lub_parser,args=argumenty_szablonu_modulu_lub_parsera};
	elseif(co_ma_wywolac==1)then
	    local frame2=pf:newChild{args=argumenty_szablonu_modulu_lub_parsera};
	    local funkcja=frame.args["Funkcja"];
	    return require("Module:"..szablon_modul_lub_parser)[funkcja](frame2);
	elseif(co_ma_wywolac==2)then
	    return pf:callParserFunction{name=szablon_modul_lub_parser,args=argumenty_szablonu_modulu_lub_parsera};
	else
		return pf:expandTemplate{title=szablon_modul_lub_parser,args=argumenty_szablonu_modulu_lub_parsera};
	end;
end;
local function Skladaj_lancuch(frame,tab_lancuch,minimum,maksimum)
	local parametry_modul=require("Module:Parametry");
	local czy_akapit=parametry_modul.CzyTak(frame.args["akapit"]);
    local akapit=czy_akapit and "\n\n" or "";
	local przecinek=parametry_modul.CzyTak(frame.args["przecinek"]) and ", " or "";
	local czy_nowa_linia=parametry_modul.CzyTak(frame.args["nowa linia"]);
	local nowa_linia=czy_nowa_linia and "\n" or "";
	local wyliczanka=parametry_modul.CzyTak(frame.args["wyliczanka"]);
	local przecinek_na_poczatku=parametry_modul.CzyTak(frame.args["początek"]);
	local myslnik=parametry_modul.CzyTak(frame.args["myślnik"]);
	local warunkowe=parametry_modul.CzyTak(frame.args["warunkowe"]);
	    	
	local lancuch_znakow="";
	local koniec=#tab_lancuch;
	for i=1,koniec,1 do
	    local lancuch=tab_lancuch[i];
	    lancuch,_=mw.ustring.gsub(lancuch,"{{min}}",minimum);
	    lancuch,_=mw.ustring.gsub(lancuch,"{{max}}",maksimum);
	    if(not wyliczanka)then
	         lancuch_znakow=lancuch_znakow..((i~=1)and przecinek or ((przecinek_na_poczatku)and przecinek or ((myslnik)and " - " or "")));
	    else
	         lancuch_znakow=lancuch_znakow..((i==1)and ((przecinek_na_poczatku)and ", " or "") or ((i<koniec)and ", " or " i "));
	    end;
	    lancuch_znakow=lancuch_znakow..((i~=1)and (czy_akapit and akapit or nowa_linia) or "")..lancuch;
	end;
    if(warunkowe)then
    	return p.InstrukcjeWarunkowe(lancuch_znakow,true);
    else
		return lancuch_znakow;
	end;
end;
p.InstrukcjeWarunkowe = function(ciag,derektywy_specjalne)
	local ciag_warunkowe_fun=function(s)
		local function ParserWiki(s,wywolanie)
			local czy_parser=mw.ustring.match(s,wywolanie);
    		if(czy_parser)then
    			return mw.getCurrentFrame():preprocess(s);
    		end;
		end
		return ParserWiki(s,"^({{%s*#if:[^{}]*}})$")
			                or ParserWiki(s,"^({{%s*#ifeq:[^{}]*}})$")
			                   or ParserWiki(s,"^({{%s*#switch:[^{}]*}})$")
			                     or ParserWiki(s,"^({{%s*#ifexpr:[^{}]*}})$")
			                       or ParserWiki(s,"^({{%s*#expr:[^{}]*}})$")
			                        or ParserWiki(s,"^({{%s*#iferror:[^{}]*}})$")
			                          or ParserWiki(s,"^({{%s*#ifexist:[^{}]*}})$")
			                        	or nil;
	end;
    local ciag,_=mw.ustring.gsub(ciag,"{{[^{}]+}}",ciag_warunkowe_fun);
    if(derektywy_specjalne)then
    	local tab_zamieniane={
    			["__!__"]="|",
    			["__!!__"]="||",
    			["__(__"]="{",
    			["__((__"]="{{",
    			["__(((__"]="{{{",
    			["__)__"]="}",
    			["__))__"]="}}",
    			["__)))__"]="}}}",
    			["__!(__"]="[",
    			["__!((__"]="[[",
    			["__)!__"]="]",
    			["__))!__"]="]]",
    	};
    	ciag=mw.ustring.gsub(ciag,"__[^_]+__",tab_zamieniane);
    	return ciag;
    end;
    return ciag;
end;
p.RozpakujArgumenty = function(zmienna_z_argumentami)
	local tablica_mikroszablonow={
	      ["{{+}}"]=";",
	 };
	local tabela_bez_argumentow={};
	local parametry_modul=require("Module:Parametry");
	if(parametry_modul.CzyTak(zmienna_z_argumentami))then
		local iter=mw.text.gsplit(zmienna_z_argumentami,";",true);
		local podlancuch;
		for podlancuch in iter do
			podlancuch=mw.text.trim(podlancuch);
			local liczba=tonumber(podlancuch);
			tabela_bez_argumentow[liczba or mw.ustring.gsub(podlancuch,"{{[^{}]+}}",tablica_mikroszablonow)]=true;
		end;
	end;
	return tabela_bez_argumentow;
end;
p.PakujParametry = function(args)
    return mw.text.jsonEncode(args,mw.text.JSON_PRESERVE_KEYS);
end;
p.RozpakujParametry = function (zmienna_z_parametrami)
	return  mw.text.jsonDecode(zmienna_z_parametrami,mw.text.JSON_PRESERVE_KEYS);
end;
p["Rozwiń"] = function(frame)
	return frame:getParent():preprocess(frame.args[1]);
end;
p["Log"] = function(frame)
	local wikitekst=frame.args[1];
	mw.log(wikitekst);
	return wikitekst;
end;
p["Szablon"] = function(frame)
	return SzablonModulParserWywolanie(frame,0);
end;
p["Moduł"] = function(frame)
	return SzablonModulParserWywolanie(frame, 1);
end;
p["Parser"] = function(frame)
	return SzablonModulParserWywolanie(frame, 2);
end;
p["T"] =function(frame)
	local parametry_modul=require("Module:Parametry");
	local args_szablon=parametry_modul.PobierzArgsParametry(frame);
	local args_ksiazka={};
	for name,value in pairs(args_szablon)do
		if(not parametry_modul.TypeNumber(name))then
			args_ksiazka[name]=value;
		elseif(name>1)then
			args_ksiazka[name-1]=value;
		elseif(name~=1)then
			args_ksiazka[name]=value;
		end;
	end;
	if(parametry_modul.CzyTak(frame.args["wyspecjalizowana"]))then
		args_ksiazka["wyspecjalizowana"]=nil;
	end;
	local szablon=args_szablon[1];
	local szablon_ksiazka=p["N"]{args={[1]=szablon,}};
	local pf=frame:getParent();
	return pf:expandTemplate{title=szablon_ksiazka,args=args_ksiazka,};
end;
p["N"]=function(frame)
	local parametr=frame.args[1];
	local parametry_modul=require("Module:Parametry");
	local parametr_p=tonumber(frame.args["p"]) or 0;
	local parametr_n=parametry_modul.CzyTak(frame.args["n"]);
	local szablon=parametry_modul["CzyTakCiąg"](parametr) and parametr or ((parametr_p==1) and "Nieznany moduł" or ((parametr_p==2) and "Nieznana kategoria" or "Nieznany szablon"));
	szablon=parametry_modul["Odstępy"]{[1]=szablon,[2]="tak",};
	szablon=mw.getContentLanguage():ucfirst(szablon);
	local nazwy_np_modul=mw.loadData("Module:Nazwy/Np");
	local przestrzen=((parametr_p==1) and nazwy_np_modul.Module or ((parametr_p==2) and nazwy_np_modul.Category or nazwy_np_modul.Template));
	local szablon_ksiazka=przestrzen..":Książka:"..szablon;
	local parametr_k=parametry_modul.CzyTak(frame.args["k"]);
	if(not parametr_k)then
		local techniczne_modul=require("Module:Techniczne");
		local liczba_title,tab_title=techniczne_modul.PoliczZbiory{[1]=szablon_ksiazka,};
		szablon_ksiazka=((liczba_title>0)and (szablon_ksiazka) or (przestrzen..":"..szablon));
	end;
	if(parametr_n)then
		local nazwy_modul=require("Module:Nazwy");
		szablon_ksiazka=nazwy_modul["NAZWASTRONY"]{nazwa=szablon_ksiazka,};
	end;
	return szablon_ksiazka;
end;
p["A"]=function(frame)
	local parametr=frame.args[1];
	local parametry_modul=require("Module:Parametry");
	local parametr_p=parametry_modul.CzyTak(frame.args["p"]);
	local przestrzen;
	if(parametr_p)then
		local nazwy_modul=require("Module:Nazwy");
		przestrzen=nazwy_modul["NAZWAPRZESTRZENI"]{nazwa=parametr,};
		local nazwy_np_modul=mw.loadData("Module:Nazwy/Np");
		if((przestrzen~=nazwy_np_modul.Template)and(przestrzen~=nazwy_np_modul.Module)and(przestrzen~=nazwy_np_modul.Category))then 
			return parametr;
		end;
		parametr=nazwy_modul["NAZWASTRONY"]{nazwa=parametr,};
	end;
	parametr=mw.ustring.gsub(parametr,"^[Kk]siążka:","");
	parametr=(parametr_p and ((przestrzen~="") and (przestrzen..":") or "") or "")..parametr;
	return parametr;
end;
p["Powtarzaj"] =  function(frame)
	local pf=frame:getParent();
	local parametry_modul=require("Moduł:Parametry");
	local czy_parametry=parametry_modul.CzyTak(frame.args["parametry"]);
	local tabela={};
	local zacznij_nazwane;
	local parametry_modul=require("Module:Parametry");
	if(czy_parametry)then
		local iter=mw.text.gsplit(mw.text.trim(frame.args["parametry"]),"%s*;%s*",false);
		local czy=true;
		for znaczenia in iter do
			znaczenia=mw.text.trim(znaczenia);
			local czy_omijac=parametry_modul.CzyTak(znaczenia);
			if(czy_omijac)then
				if(czy)then 
					zacznij_nazwane=tonumber(znaczenia);
					czy=false;
					if(not zacznij_nazwane)then 
						local tab1,tab2=mw.ustring.match(znaczenia,"%s*([%w%s]+)%s*=%s*(.*)%s*$");
						if(tab1 and tab2)then
							local parametr_tab=mw.text.split(tab2,"%s*,%s*",false);
							tabela[parametry_modul["Odstępy"]{[1]=tab1,[2]="tak",}]=parametr_tab;
						else
							tabela[parametry_modul["Odstępy"]{[1]=znaczenia,[2]="tak",}]={};
						end;
						zacznij_nazwane=0;
					end;
				else
					local tab1,tab2=mw.ustring.match(znaczenia,"%s*([%w%s]+)%s*=%s*(.*)%s*$");
					if(tab1 and tab2)then
						local parametr_tab=mw.text.split(tab2,"%s*,%s*",false);
						tabela[parametry_modul["Odstępy"]{[1]=tab1,[2]="tak",}]=parametr_tab;
					else
						tabela[parametry_modul["Odstępy"]{[1]=znaczenia,[2]="tak",}]={};
					end;
				end;
			end;
		end;
	end;
	local tabela_dodatkowe={};
	local czy_dodatkowe=parametry_modul.CzyTak(frame.args["dodatkowe"]);
	if(czy_dodatkowe)then
		local iter=mw.text.gsplit(mw.text.trim(frame.args["dodatkowe"]),"%s*;%s*",false);
		for name in iter do
			tabela_dodatkowe[name]=true;
		end;
	end;
	if(not zacznij_nazwane)then zacznij_nazwane=0;end;
	function LiczbaZmiennychOOgolniePodstawieParametru(podstawa_parametru_wyszukiwana)
		local args=pf.args;
		local maksymalna_liczba_nazwy_danego_parametru=0;
		for nazwa_parametru, wartosc_parametru in pairs(args)do
			local czy_jedynka=false;
			if(type(nazwa_parametru)=="string")then
				local nazwa_podstawy_parametru,spacja,liczba=mw.ustring.match(nazwa_parametru,"^([%a%s]*%a)(%s?)(%d+)$");
				if(not nazwa_podstawy_parametru and not spacja and not liczba)then
					nazwa_podstawy_parametru=nazwa_parametru;
					spacja="";
					liczba=1;
					czy_jedynka=true;
				end;
				local subtab=tabela[nazwa_podstawy_parametru];
				if(subtab)then
					local nie_spacja_parametru=parametry_modul.CzyTak(subtab[1]);
					local czy_z_jedynka=parametry_modul.CzyTak(subtab[2]);
					liczba=tonumber(liczba) or 0;
					if((not nie_spacja_parametru and (((spacja==" ")and ((liczba>1)or((not czy_jedynka)and(czy_z_jedynka))or((not czy_z_jedynka)and(not czy_jedynka)))) or(((not czy_z_jedynka)and(czy_jedynka))and(spacja=="" and liczba==1))))
						or (nie_spacja_parametru and (((spacja=="")and ((liczba>1)or((not czy_jedynka)and(czy_z_jedynka))or((not czy_z_jedynka)and(not czy_jedynka)))) or(((not czy_z_jedynka)and(czy_jedynka))and(spacja=="" and liczba==1))))
					)then
						if(((podstawa_parametru_wyszukiwana) and (nazwa_podstawy_parametru==podstawa_parametru_wyszukiwana))or(not podstawa_parametru_wyszukiwana))then
							maksymalna_liczba_nazwy_danego_parametru=math.max(maksymalna_liczba_nazwy_danego_parametru,liczba);
						end;
					end;
				end;
			end;
		end;
		return maksymalna_liczba_nazwy_danego_parametru;
	end;
	local MaksymalnyLiczonyNumerElementowPodanychPodstawNazwyParametrow=function()
		local maksimum=0;
		for wartosc_parametru,_ in pairs(tabela)do
			if(type(wartosc_parametru)=="string")then
				if(not tabela_dodatkowe[wartosc_parametru])then
					local maksymalna_liczba_nazwy_danego_parametru=LiczbaZmiennychOOgolniePodstawieParametru(wartosc_parametru);
					maksimum=tabela[wartosc_parametru]
							          and math.max(maksimum,maksymalna_liczba_nazwy_danego_parametru-(tonumber(tabela[wartosc_parametru][3]) or 0)) 
							              or (tonumber(maksymalna_liczba_nazwy_danego_parametru) or 0);
				end;
			end;
		end;
		maksimum=math.max(maksimum-zacznij_nazwane,0);
		return maksimum;
	end;
	local zacznij_na_poczatku,skoncz_na_koncu;
	local tekst_do_analizy=frame.args[1];
	if(not frame.args[1])then return "(brak parametru do analizy)";end;
	local czy_tekst=parametry_modul.CzyTak(tekst_do_analizy);
	if(not czy_tekst)then return "(parametr do analizy pusty)";end;
	local czy_start=parametry_modul.CzyTak(frame.args["start"]);
	local czy_koniec=parametry_modul.CzyTak(frame.args["koniec"]);
	    
	local zaznacz=frame.args["zaznacz"];
	local tabela_zaznacz={};
	if(zaznacz)then
		local iter=mw.text.gsplit(zaznacz,"%s*;%s*",false)
		for liczba in iter do
			tabela_zaznacz[#tabela_zaznacz+1]=tonumber(liczba) or 0;
		end;
	end;
	local czy_rozne=parametry_modul.CzyTak(frame.args["różne"]);
    local czy_ma_nazwane;
    local function Wylicz_skoncz_na_koncu()
        czy_ma_nazwane=parametry_modul["CzySąElementyNazwaneTablicy"](tabela);
        if(czy_ma_nazwane)then
        	if(czy_rozne)then
        		local maks_numer=parametry_modul.CzyTak(frame.args["maksimum numeracyjne"]);
        		if(not maks_numer)then
        			return math.max(MaksymalnyLiczonyNumerElementowPodanychPodstawNazwyParametrow(),parametry_modul.MaksymalnaLiczbaParametruNienazwanegoTablicy(pf.args));
        		else
        			return parametry_modul.MaksymalnaLiczbaParametruNienazwanegoTablicy(pf.args);
        		end;
        	else
        		return MaksymalnyLiczonyNumerElementowPodanychPodstawNazwyParametrow();
        	end;
        else
        	return parametry_modul.MaksymalnaLiczbaParametruNienazwanegoTablicy(pf.args);
        end;
    end;
    local skoncz_na_koncu_wyliczona=Wylicz_skoncz_na_koncu();
    if(not czy_koniec)then 
        skoncz_na_koncu=skoncz_na_koncu_wyliczona;
    else 
        skoncz_na_koncu=math.min(skoncz_na_koncu_wyliczona, tonumber(frame.args["koniec"]) or 0);
    end;
	zacznij_na_poczatku=tonumber(frame.args["start"]) or 1;
	if(zacznij_na_poczatku==0)then return "(początek jest ustawiony na zero)";end;
	for name, tab_par in pairs(tabela)do
		local _4=tonumber(tab_par[4]);local _5=tonumber(tab_par[5]);
		if(_4)then zacznij_na_poczatku=math.min(zacznij_na_poczatku,_4 or 0);end;
		if(_5)then skoncz_na_koncu=math.max(skoncz_na_koncu,_5 or 0);end;
	end;
		
	local lancuch_znakow="";
	local gdy_nic=parametry_modul.CzyTak(frame.args["nic"])and frame.args["nic"] or "";
	if(zacznij_na_poczatku>skoncz_na_koncu)then return gdy_nic;end;
	local pokolei=parametry_modul.CzyTak(frame.args["po kolei"]);
	local wytnij=parametry_modul.CzyTak(frame.args["wytnij"]);
	local wytnij_puste=parametry_modul.CzyTak(frame.args["wytnij puste"]);
	local nie_wytnij_nazwane=parametry_modul.CzyTak(frame.args["nie wytnij nazwane"]);
	local _i=parametry_modul.CzyTak(frame.args["znacznik"])and frame.args["znacznik"] or "_";
    local czy_parametry_ze_spacja_i_jedynka=function(nazwa_parametru)
        local value=tabela[nazwa_parametru];
        if(value)then
        	return not parametry_modul.CzyTak(value[1]),parametry_modul.CzyTak(value[2]);
        end;
        return true,false;
    end;
	if(not czy_rozne)then
		if(czy_ma_nazwane)then
			local function Analizuj_dla_bez_rozne(tabela_wszystkich_parametrow)
				local tab_lancuch={};
				local maksimum=0;
				local minimum;
				for licznik=zacznij_na_poczatku,skoncz_na_koncu,1 do
					local lancuch=tekst_do_analizy;
					local czy=nil;
					for zmienne_parametrowe,_ in pairs(tabela_wszystkich_parametrow)do
						if(zmienne_parametrowe)then
							local ze_spacja,czy_z_jedynka=czy_parametry_ze_spacja_i_jedynka(zmienne_parametrowe);
							local element=pf.args[zmienne_parametrowe..((ze_spacja)and " " or "")..licznik];
							local czy_jedynka=(licznik==1)and ((element and(not wytnij)) or((wytnij)and (parametry_modul.CzyTak(element))));
								
							local wartosc_elementu=((czy_z_jedynka) and element or ((not czy_z_jedynka)and((licznik>1)and element or ((licznik==1)and(czy_jedynka and element or pf.args[zmienne_parametrowe])))));
								
							czy=czy or (((wartosc_elementu) and ((not wytnij)and(not wytnij_puste))) 
									    or ((wytnij)and (parametry_modul["CzyTakCiąg"](wartosc_elementu)))
									        or ((wytnij_puste and not wytnij)and (parametry_modul.CzyTak(wartosc_elementu))));
							local tabelka_szablonow={
								["{{".._i.."}}"]=licznik,
								["{{".._i.._i.."}}"]=(czy_z_jedynka and licznik or ((licznik>1) and licznik or (czy_jedynka and 1 or ""))),
							};
							local function fun_tabelka_szablonow(ciag)
							    local ciag_strip=mw.ustring.gsub(ciag,"{{%s*(%S+)%s*}}","{{%1}}");
							    return tabelka_szablonow[ciag_strip] or ciag;
							end;
							lancuch=mw.ustring.gsub(lancuch,"{{%s*".._i.."+%s*}}",fun_tabelka_szablonow);
						end;
					end;
					local czy_jest=parametry_modul.CzyJestTakiElementNumerowanyTabeli(tabela_zaznacz,licznik);
					if((pokolei and (not czy_jest)) or czy or ((not pokolei)and(czy_jest))) then
						tab_lancuch[#tab_lancuch+1]=lancuch;
						maksimum=math.max(maksimum,licznik);
						minimum=math.min(minimum or licznik,licznik);
					end;
				end
				lancuch_znakow=Skladaj_lancuch(frame,tab_lancuch,minimum or 0,maksimum);
			end;
			Analizuj_dla_bez_rozne(tabela);
		else
			local tab_lancuch={};
			local maksimum=0;
			local minimum;
			for licznik=zacznij_na_poczatku,skoncz_na_koncu,1 do
				local element=pf.args[licznik]
				local czy=(((element)and ((not wytnij)and(not wytnij_puste)))
						    or((wytnij)and(parametry_modul["CzyTakCiąg"](element)))
						       or((wytnij_puste and not wytnij)and(parametry_modul.CzyTak(element))));
				local czy_jest=parametry_modul.CzyJestTakiElementNumerowanyTabeli(tabela_zaznacz,licznik);
				if((pokolei and (not czy_jest)) or czy or ((not pokolei)and(czy_jest)))then
					tab_lancuch[#tab_lancuch+1]=mw.ustring.gsub(tekst_do_analizy,"{{%s*".._i.."+%s*}}",licznik);
						maksimum=math.max(maksimum,licznik);
						minimum=math.min(minimum or licznik,licznik);
				end;
			end;
			lancuch_znakow=Skladaj_lancuch(frame, tab_lancuch,minimum or 0,maksimum);
		end;
	else
		local function Analizuj_z_rozne(tabela_wszystkich_parametrow)
			local tab_lancuch={};
			local maksimum=0;
			local minimum;
			for licznik=zacznij_na_poczatku,skoncz_na_koncu,1 do
				local czy=false;
				local czy_niepuste=false;
				local wytnij_ujemne=false;
				local function Analiza_zmiennej_parametrowej(zmienne_parametrowe,licznik,czy_ze_spacja,czy_z_jedynka)
					local wartosc,klucz;
					if(zmienne_parametrowe)then
						local function Niewspomniane_w_rozne(zmienne_parametrowe,liczba_przesuniecia)
							local liczba=licznik+liczba_przesuniecia+zacznij_nazwane;
							if(liczba<1)then wytnij_ujemne=true;end;
							if(liczba>0)then
								local element=pf.args[zmienne_parametrowe..((czy_ze_spacja)and " " or "")..liczba];
								local czy_jedynka=(liczba==1)and element;
								local wartosc_elementu=((czy_z_jedynka) and element or ((not czy_z_jedynka)and((liczba>1)and element or ((liczba==1)and(czy_jedynka and element or pf.args[zmienne_parametrowe])))));
								czy_niepuste=czy_niepuste 
									             or ((not nie_wytnij_nazwane)and((wytnij and parametry_modul["CzyTakCiąg"](wartosc_elementu)) 
									                or (wytnij_puste and not wytnij and parametry_modul.CzyTak(wartosc_elementu))) or (nie_wytnij_nazwane and wartosc_elementu));
								czy=czy or wartosc_elementu;
								wartosc="{{{"..zmienne_parametrowe..(czy_z_jedynka and (((czy_ze_spacja)and " " or "")..liczba) or ((liczba>1) and (((czy_ze_spacja)and " " or "")..liczba) or (czy_jedynka and (((czy_ze_spacja)and " " or "")..1) or "")));
								klucz="{{{%s*"..zmienne_parametrowe..((czy_ze_spacja)and "%s+" or "").."{{%s*".._i.._i.."+%s*}}"; 
							end;
						end;
						local subtab=tabela[zmienne_parametrowe];
						local czy_w_tabeli=subtab and tonumber(subtab[3]);
						local liczba_przesuniecia=(czy_w_tabeli)and czy_w_tabeli or 0;
        	        	Niewspomniane_w_rozne(zmienne_parametrowe,liczba_przesuniecia);
					end;
					return klucz,wartosc;
				end;
				local function Tekst_do_analizy(tekst_do_analizy_przetwarzany,klucz,wartosc)
                	if((wartosc)and(klucz))then
                		local przetwarzane,_=mw.ustring.gsub(tekst_do_analizy_przetwarzany,klucz,wartosc);
                		return przetwarzane;
                	end;
                	return "";
				end;
				local lancuch_zaanalizowany=tekst_do_analizy;
				for zmienne_parametrowe,_ in pairs(tabela_wszystkich_parametrow)do
					local lokalizacja=mw.ustring.match(tekst_do_analizy,"{{{%s*"..zmienne_parametrowe.."%s*{{%s*".._i.._i.."+%s*}}");
					if(lokalizacja)then
		    	    	zmienne_parametrowe=mw.text.trim(zmienne_parametrowe);
		    	    	local czy_ze_spacja,czy_z_jedynka=czy_parametry_ze_spacja_i_jedynka(zmienne_parametrowe);
                		local klucz,wartosc=Analiza_zmiennej_parametrowej(zmienne_parametrowe,licznik,czy_ze_spacja,czy_z_jedynka);
                		if(wytnij_ujemne)then break;end;
                		lancuch_zaanalizowany=Tekst_do_analizy(lancuch_zaanalizowany,klucz,wartosc);
					end;
				end;
				if(not wytnij_ujemne)then
					local zmienna_numerowana_wikikodu=mw.ustring.match(tekst_do_analizy,"{{{%s*{{%s*".._i.."+%s*}}");
                    czy=czy or ((not zmienna_numerowana_wikikodu)and(mw.ustring.match(tekst_do_analizy,"{{%s*".._i.."%s*}}")))or((zmienna_numerowana_wikikodu)and(pf.args[licznik]));
        	        local klucz="{{%s*".._i.."%s*}}";
        	        local wartosc=licznik;
        	        lancuch_zaanalizowany=Tekst_do_analizy(lancuch_zaanalizowany,klucz,wartosc);
        	        czy_niepuste=czy_niepuste 
        	        	              or (wytnij and parametry_modul["CzyTakCiąg"](pf.args[licznik])) 
        	        	                 or (wytnij_puste and not wytnij and parametry_modul.CzyTak(pf.args[licznik]));
        	        local czy_jest=parametry_modul.CzyJestTakiElementNumerowanyTabeli(tabela_zaznacz,licznik);
        	        if((pokolei and (not czy_jest)) or (czy and (not wytnij)and(not wytnij_puste)) or (((wytnij)or(wytnij_puste))and(czy_niepuste)) or ((not pokolei)and(czy_jest)))then 						
        	        	tab_lancuch[#tab_lancuch+1]=lancuch_zaanalizowany;
        	        	maksimum=math.max(maksimum,licznik);
						minimum=math.min(minimum or licznik,licznik);
        	        end;
        	    end;
			end;  
			lancuch_znakow=Skladaj_lancuch(frame,tab_lancuch,minimum or 0,maksimum);
		end;
		Analizuj_z_rozne(tabela);
	end;
	if(#lancuch_znakow==0)then return gdy_nic;end;
	local przetworzony_wikikod=not parametry_modul.CzyTak(frame.args["nie rozwiń"]) and pf:preprocess(lancuch_znakow) or lancuch_znakow;
	return przetworzony_wikikod;
end;
p["PowtarzajOdDo"]=function(frame)
	local start=tonumber(frame.args["start"]);
	local koniec=tonumber(frame.args["koniec"]);
	local krok=tonumber(frame.args["krok"]) or 1;
	local parametry_modul=require("Module:Parametry")
	local lacznik=frame.args["łącznik"] or (parametry_modul.CzyTak(frame.args["nowa linia"]) and "\n" or "");
	if((not start)or(not koniec))then return "";end;
	if(krok==0)then return "";end;
	if(((start>koniec)and(krok>0))or((start<koniec)and(krok<0)))then return "";end;
	local kod=frame.args[1];
	
	tabela_mikroszablonow={
		["{{start}}"]=start,
		["{{koniec}}"]=koniec,
		["{{krok}}"]=krok,
	}
	kod=mw.ustring.gsub(kod,"{{[^{}]+}}",tabela_mikroszablonow);
	local lancuch="";
	local licznik=start;
	local kodprzeskok=frame.args["przeskok"];
	local pf=frame:getParent();
	while licznik<=koniec do
		local przeskok;
		if(kodprzeskok)then 
			local _;
			przeskok,_=mw.ustring.gsub(kodprzeskok,"{{_}}",licznik);
			przeskok=pf:preprocess(przeskok);
		end;
		local kod2,_=mw.ustring.gsub(kod,"{{_}}",licznik);
		lancuch=lancuch..((lancuch~="")and lacznik or "")..kod2;
		licznik=licznik+krok+(tonumber(przeskok) or 0);
	end;
	local przetworzony_wikikod=not parametry_modul.CzyTak(frame.args["nie rozwiń"]) and pf:preprocess(lancuch) or lancuch;
	return przetworzony_wikikod;
end;
p["PrzetwarzajIterującCiąg"]=function(frame)
	local poziom=frame.args["ciąg"];
	poziom=mw.text.trim(poziom);
	local tab_poziom=mw.text.split(poziom,"%s*;%s*",false);
	local len_tab_poziom=#tab_poziom;
	local start=1;local koniec=len_tab_poziom;local krok=1;
	tabela_mikroszablonow={
		["{{start}}"]=start,
		["{{koniec}}"]=koniec,
		["{{krok}}"]=krok,
	}
	local parametry_modul=require("Module:Parametry");
	local lacznik=frame.args["łącznik"] or (parametry_modul.CzyTak(frame.args["nowa linia"]) and "\n" or "");
	local kod=frame.args[1];
	kod=mw.ustring.gsub(kod,"{{[^{}]+}}",tabela_mikroszablonow);
	local lancuch="";
	local licznik=start;
	local kodprzeskok=frame.args["przeskok"];
	local pf=frame:getParent();
	while licznik<=koniec do
		local przeskok;
		if(kodprzeskok)then 
			local _;
			przeskok,_=mw.ustring.gsub(kodprzeskok,"{{_}}",licznik);
			przeskok=pf:preprocess(przeskok);
		end;
		local tabela_microszablonow2={
			["{{_}}"]=licznik,
			["{{ciąg}}"]=tab_poziom[licznik];
		};
		local kod2,_=mw.ustring.gsub(kod,"{{[^{}]+}}",tabela_microszablonow2);
		lancuch=lancuch..((lancuch~="")and lacznik or "")..kod2;
		licznik=licznik+krok+(tonumber(przeskok) or 0);
	end;
	local przetworzony_wikikod=not parametry_modul.CzyTak(frame.args["nie rozwiń"]) and pf:preprocess(lancuch) or lancuch;
	return przetworzony_wikikod;
end;
p["PowtarzajWedług"] = function(frame)
	local wybrany_wzor=frame.args["wzór"];
	local parametry_modul=require("Module:Parametry")
	local czy_link=parametry_modul.CzyTak(frame.args["link"]);
	local liczba_list=p["MaksymalnaLiczbaNumerowanychIstniejącychStronWedługWzoru"]{args={["wzór"]=wybrany_wzor,}};
	local lancuch="";
	local linki_modul=require("Module:S");
	for i=1,liczba_list,1 do
	    local wybrany_link_lub_bez;
		local wybrany_link_lub_bez=mw.ustring.gsub(wybrany_wzor,"{{_}}",tostring(i));
		if czy_link then
			wybrany_link_lub_bez=linki_modul["S"]{[1]=wybrany_link_lub_bez};
		end;
		lancuch=(lancuch~="")and (lancuch..((i<liczba_list) and ", " or " i ")..wybrany_link_lub_bez) or wybrany_link_lub_bez;
	end;
	return lancuch;
end;
p["LiczbaPrawychUkośników"] = function(frame)
	local nazwa=frame.args[1];
	local _,ile=mw.ustring.gsub(nazwa,"/",function(s)return nil;end);
	return ile;
end;
p["MaksymalnaLiczbaNumerowanychIstniejącychStronWedługWzoru"] = function(frame)
	local start=tonumber(frame.args["start"]) or 1;
	licznik=start;
	local strona=frame.args["wzór"];
	while true do
		local strona2,_=mw.ustring.gsub(strona,"{{_}}",licznik);
		local title=mw.title.makeTitle('',strona2);
		if((not title) or (not title.exists))then
			return licznik-1;
		end;
		licznik=licznik+1;
	end;
end;
p["MinimalnyNumerSpośródNieodpowiednikowychZmiennych"]=function(frame)
	local parametry_modul=require("Module:Parametry");
	local techniczne_modul=require("Module:Techniczne");
	local pf=frame:getParent();
	local parametr=frame.args["zmienna"];
	local odpowiednik=frame.args["odpowiednik"];
	parametr=techniczne_modul["PrzekształćWzórDoCzystegoTekstu"](parametr);
	local czy_odpowiednik=parametry_modul.CzyTak(odpowiednik);
	
	local numer=nil;
	for name,value in pairs(pf.args)do
		local __name=tostring(name);
		local __numer=mw.ustring.match(__name,"^"..parametr.."(%d*)$");
		__numer=tonumber(__numer) or (((__numer)and(__numer=="")) and 1 or nil);
		if((__numer)or((czy_odpowiednik)and(parametry_modul.TypeNumber(name))))then
			if(numer)then
				numer=math.min(__numer or name,numer);
			else
				numer=__numer or name;
			end;
		end;
	end;
	return numer;
end;
p["IleJestTakichNieodpowiednikowychZmiennych"]=function(frame)
	local parametry_modul=require("Module:Parametry");
	local techniczne_modul=require("Module:Techniczne");
	local pf=frame:getParent();
	local parametr=frame.args["zmienna"];
	local odpowiednik=frame.args["odpowiednik"];
	parametr=techniczne_modul["PrzekształćWzórDoCzystegoTekstu"](parametr);
	local czy_odpowiednik=parametry_modul.CzyTak(odpowiednik);
	local numer=0;
	local tab={};
	for name,value in pairs(pf.args)do
		local __name=tostring(name);
		local __numer=mw.ustring.match(__name,"^"..parametr.."(%d*)$");
		if((not tab[name])and((__numer)or((czy_odpowiednik)and(parametry_modul.TypeNumber(name)))))then 
			numer=numer+1;
			tab[tonumber(__numer) or(((__numer)and(__numer==""))and 1 or nil) or name]=true;
		end;
	end;
	return numer;
end;
p["Parametr w tablicy nazw"]=function(frame)
	local zmienna_z_argumentami=frame.args["parametry"];
	if(not zmienna_z_argumentami)then return;end;
	local jedna_pozycja=frame.args["pozycja"];
	if(not jedna_pozycja)then return;end;
	local parametry_modul=require("Module:Parametry");
	jedna_pozycja=parametry_modul["Odstępy"]{[1]=jedna_pozycja,[2]="tak"};
	if(jedna_pozycja=="")then return;end;
	local od_duzej=paramwetry_modul.CzyTak(frame.args["od dużej"]);
	jedna_pozycja=od_duzej and mw.getContentLanguage():ucfirst(jedna_pozycja) or jedna_pozycja;
	local iter=mw.text.gsplit(zmienna_z_argumentami,";",true);
	local tablica={};
	for pozycja in iter do
		pozycja=parametry_modul["Odstępy"]{[1]=pozycja,[2]="tak"};
		if(pozycja~="")then
			tablica[od_duzej and mw.getContentLanguage():ucfirst(pozycja) or pozycja]=true;
		end;
	end;
	return (tablica[jedna_pozycja] and "tak" or nil);
end;
return p;