Moduł:Ramka

Z Wikibooks, biblioteki wolnych podręczników.
Przejdź do nawigacji Przejdź do wyszukiwania
Template-info.png Dokumentacja modułu [stwórz] [odśwież]
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,
		};
		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 ramka_modul=require("Module:Ramka");
		local parametry_modul=require("Module:Parametry");
		local techniczne_modul=require("Module:Techniczne");
		local tabela_bez_argumentow=ramka_modul.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 ramka_modul.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;
    	end;
		if(czy_przekazac_parametry_rodzica)then
			if(z_dodatkowymi_sprawdzeniami)then
				local str=ramka_modul.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"]=PakujArgumentyRamki(frame.args);
		    argumenty_szablonu_modulu_lub_parsera["nazwa szablonu rodzica"]=pf.args["nazwa szablonu rodzica"] or techniczne_modul.NazwaSzablonu(pf:getTitle());
		else
			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"]=PakujArgumentyRamki(frame.args);
		    			argumenty_szablonu_modulu_lub_parsera["nazwa szablonu rodzica"]=pf.args["nazwa szablonu rodzica"] or techniczne_modul.NazwaSzablonu(pf:getTitle());
			    	end;
				end;
			end;
			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 techniczne_modul.NazwaSzablonu(pf:getTitle());
			end;
		end;
		
		local czy_bez_argomentow_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 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])))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_argomentow_nienazwanych_rodzica)or((czy_bez_argomentow_nienazwanych_rodzica)and(not tonumber(nazwa_parametru)))
			     ))then
			        local czy_dodac_do_parametrow;
			    	if czy_parametry_pudelka then
			        	local czy_dodac_do_parametrow=(mw.ustring.match(nazwa_parametru,"^nazwa przestrzeni nazw %d+$") 
			        		                                     and wartosc_parametru
			        		                                     and not pudelko_modul.CzyNiepoprawnaNazwa(wartosc_parametru))
			        	                           or (mw.ustring.match(nazwa_parametru,"^nazwa przestrzeni nazw$") 
			        		                                     and wartosc_parametru
			        	                           	             and not pudelko_modul.CzyNiepoprawnaNazwa(wartosc_parametru))
			        	                           or (mw.ustring.match(nazwa_parametru,"^nazwa jednostki %d+$")
			        		                                     and wartosc_parametru
			        	                           	             and wartosc_parametru~="" 
			        	                           	             and not pudelko_modul.CzyNiepoprawnaNazwa(wartosc_parametru)) 
			        	                           or (mw.ustring.match(nazwa_parametru,"^nazwa jednostki$")
			        		                                     and wartosc_parametru
			        	                           	             and wartosc_parametru~="" 
			        	                           	             and not pudelko_modul.CzyNiepoprawnaNazwa(wartosc_parametru))
			        	                           or (mw.ustring.match(nazwa_parametru,"^typ jednostki %d+$")
			        		                                     and wartosc_parametru
			        	                           	             and wartosc_parametru~="" 
			        	                           	             and not pudelko_modul.CzyNiepoprawnaNazwa(wartosc_parametru))
			        	                           or (mw.ustring.match(nazwa_parametru,"^typ jednostki$")
			        		                                     and wartosc_parametru
			        	                           	             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
    	local ramka_modul=require("Module:Ramka")
    	return ramka_modul.InstrukcjeWarunkowe(lancuch_znakow,true);
    else
		return lancuch_znakow;
	end;
end;
return {
	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 s;
		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;
	 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;
    PakujParametry = function(args)
    	return mw.text.jsonEncode(args,mw.text.JSON_PRESERVE_KEYS);
    end;
    RozpakujParametry = function (zmienna_z_parametrami)
		return  mw.text.jsonDecode(zmienna_z_parametrami,mw.text.JSON_PRESERVE_KEYS);
    end;
	["Rozwiń"] = function(frame)
		return frame:getParent():preprocess(frame.args[1]);
	end,
	["Log"] = function(frame)
	    local wikitekst=frame.args[1];
	    mw.log(wikitekst);
	    return wikitekst;
	end;
    ["Szablon"] = function(frame)
		return SzablonModulParserWywolanie(frame,0);
	end,
	["Moduł"] = function(frame)
		return SzablonModulParserWywolanie(frame, 1);
	end,
    ["Parser"] = function(frame)
		return SzablonModulParserWywolanie(frame, 2);
	end,
	["OpakujKategorie"] = function(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:css('margin-left','0.3em')
		ulramka:css('display','inline');
		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((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:css('display','inline');
            	liramka:css('white-space','normal');
            	if(pionowa)then 
            		liramka:css('border-left','1px solid #a2a9b1');
            		liramka:css('margin-left','0.4em')
            		liramka:css('padding-left','0.4em')
            		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:css('width', 'auto' );
		divramka:css('min-height', 'auto');
		divramka:css('font-size','1em');
		divramka:css('border','1px solid #a2a9b1');
		divramka:css('background-color','#f8f9fa');
		divramka:css('text-align','left');
		divramka:css('padding','5px')
		divramka:css('margin-top','0.5em');
		divramka:css('margin-bottom','0.5em');
		divramka:css('display','flex');
		divramka:css('flex-direction','row')
		divramka:css('clear','both');
		local divramka2=mw.html.create('div');
		divramka2:wikitext(kategorie);
		divramka2:node(ulramka);
		divramka:node(divramka2);
		return wikikod..'\n'..tostring(divramka:allDone());
	end,
	["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;
		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
					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;
			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 (mw.ustring.match(tekst_do_analizy,"{{%s*".._i.."%s*}}")and(not zmienna_numerowana_wikikodu))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,
["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,
["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,
["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 ramka_modul=require("Module:Ramka");
	local liczba_list=ramka_modul["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;
["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,
}