Moduł:Szablonowe/Potrzebne

Z Wikibooks, biblioteki wolnych podręczników.
 Dokumentacja modułu [stwórz] [odśwież]
local p={};
function p.KodowanieSzablonowegoTekstuZObiektamiWikikodu(self,tekst_artykulu,nazwa_modulu,tablica_analizy_obiektow_strony_dany_modul,__FUNKCJA,__FUNKCJA2,__FUNKCJA3,__FUNKCJA_poczatek,__FUNKCJA_koniec)
	local numer_szablonu;
	local html_modul=require("Module:Html");
	local szablonowe_dane_modul=mw.loadData("Module:Szablonowe/dane");
	local szablonowe_modul=require("Module:Szablonowe");
	local tab_wiki_znacznik=szablonowe_dane_modul.tablica_wiki_znaczniki;
	local function InicjujNumeryPoczatkoweObiektowSzablonow()
		if(not __FUNKCJA3)then
			numer_szablonu={};
			--numer_szablonu["ŹRÓDŁO"]=1;
			--numer_szablonu["GALERIA"]=1;
			--numer_szablonu["MAPAOBRAZU"]=1;
			numer_szablonu["SZABLON"]=1;
			numer_szablonu["LINKW"]=1;
			numer_szablonu["LINKZ"]=1;
			numer_szablonu["ZMIENNA"]=1;
			--numer_szablonu["NOWIKI"]=1;
			--numer_szablonu["MATH"]=1;
			--numer_szablonu["PRE"]=1;
			numer_szablonu["INNEPRE"]=1;
			numer_szablonu["ZNACZNIK"]=1;
			numer_szablonu["WIKITABELA"]=1;
			numer_szablonu["STARE"]=1;
			for obiekt,_ in pairs(szablonowe_dane_modul.tablica_kodowa_obiektowa_typowo_mechanizmu_mediawiki)do
				numer_szablonu[obiekt]=1;
			end;
		else
			numer_szablonu=__FUNKCJA3(tekst_artykulu,nazwa_modulu,tablica_analizy_obiektow_strony_dany_modul);
		end;
	end;
	local PREWSTAWIAJACA=nil;local NiedokonczoneElementyWikikodu=nil;local czy_wynik=true;
	local function ZamienObiektSzablonuKodem(self,szablon,tablica_analizy_obiektow_strony_dany_modul,co)
		if(__FUNKCJA2)then 
			local wynik=__FUNKCJA2(szablon,co,numer_szablonu[co or  "SZABLON"],tekst_artykulu,tablica_analizy_obiektow_strony_dany_modul,numer_szablonu);
			if(wynik)then
				numer_szablonu[co or  "SZABLON"]=numer_szablonu[co or  "SZABLON"]+1;
				wynik=(czy_wynik and PREWSTAWIAJACA) and PREWSTAWIAJACA(wynik) or wynik;
				return wynik,false;
			end;
		end;
		if(__FUNKCJA)then szablon=__FUNKCJA(szablon,co,numer_szablonu[co or  "SZABLON"]) or szablon; end;
		local kod=szablonowe_modul.NormaKoduKodowaniaTekstu(co,numer_szablonu[co or  "SZABLON"]);

		---
    	local tab_co=tablica_analizy_obiektow_strony_dany_modul[co or  "SZABLON"];
    	local __metatablica=getmetatable(tab_co);
    	if(not __metatablica)then
    		__metatablica={};
    		local tablica={};
    		__metatablica.tablica=function()
    			return tablica;
    		end;
    		__metatablica.__len=function(t)
    			return #tablica;
    		end;
    		__metatablica.__index=function(t,klucz)
    			local tab=tablica[klucz];
    			if(tab==nil)then return nil;end;
    			return tab[1];
    		end;
    		__metatablica.__newindex=function(t,klucz,wartosc)
    			if(wartosc~=nil)then
    				tablica[klucz]={wartosc,true,};
    			else
    				tablica[klucz]=nil;
    			end;
    		end;
    		__metatablica.__pairs=function(t)
    			return next,tablica,nil;
    		end;
    		local function iter(a,i)
    			i=i+1;
    			local v = a[i];
    			if v then
        			return i, v;
    			end
    		end
    		__metatablica.__ipairs=function(t)
    			return iter,tablica,0;
    		end;
    		setmetatable(tab_co,__metatablica);
    	end;
    	local tablica_co=__metatablica.tablica();
    	tablica_co[numer_szablonu[co or  "SZABLON"]]={szablon,false,};
    	---
    	numer_szablonu[co or  "SZABLON"]=numer_szablonu[co or  "SZABLON"]+1;
    	return kod,true;
	end;
	local function AnalizaObiektowSzablonowegoTekstu(tekst_artykulu)
    	
    	local ile_znacznik_niedomykajacy_1;local ile_znacznik_niedomykajacy_2;
    	
    	local czy_pierwszy_raz=nil;
    	local html_modul=require("Module:Html");
    	local techniczne_modul=require("Module:Techniczne");
    	local tab_licznik_poczatek={};
    	local tab_licznik_koniec={};
    	local tab_element={};
    	local ObiektFun=function(nazwa)
			return szablonowe_dane_modul.tablica_znaczniki_typowo_mechanizmu_mediawiki[nazwa] or "ZNACZNIK";
    	end;
    	local INNEPRE=function(tekst_artykulu,czy_poczt,czy_szablon)
    		local function INNEPREROZ(poczatek,koniec)
    			repeat
    				local ile;local ile2=0;
    		    	tekst_artykulu,ile=mw.ustring.gsub(tekst_artykulu,(poczatek and "\n" or "^").."([^%S\n]+)([^\n]*)"..(koniec and "\n" or "$"),function(spacje,kod)
    					if((not czy_szablon)or((czy_szablon)and((not mw.ustring.match(kod,"[|=]"))and((koniec)and true or (not mw.ustring.match(kod,"^[^%S\n]*$"))))))then
        					kod=NiedokonczoneElementyWikikodu(kod);
        					local szablon=spacje..kod;
        					return (poczatek and "\n" or "")..ZamienObiektSzablonuKodem(self,szablon,tablica_analizy_obiektow_strony_dany_modul,"INNEPRE")..(koniec and "\n" or "");
        				else
        					ile2=ile2+1;
        				end;
        			end);
        			ile=ile-ile2;
        		until (ile==0);
    		end;
    		if(not czy_poczt)then
    			INNEPREROZ(false,true);
    			INNEPREROZ(false,false);
    		end;
    		INNEPREROZ(true,true);
    		INNEPREROZ(true,false);
        	return tekst_artykulu;
        end;
        local tab_znaczniki={};
    	local tab_numerki={};
    	local function PreprocesorSzablonow(tekst_artykulu)
    		local function ATRYBUTY(szablon1,szablon2,szablon3,cudzyslow)
    		    local _, ile=mw.ustring.gsub(szablon2,"("..cudzyslow..")",function(s)return nil;end);
    		    local function ROZWAZANIA_SZABLONOWE_ATRYBUTY(szablon)
    		    	if(not tab_element["ATRYBUTY"])then tab_element["ATRYBUTY"]={};end;
    				tab_element["ATRYBUTY"][#tab_element["ATRYBUTY"]+1]=szablon;
    				local ile=#tab_element["ATRYBUTY"];
    				local szablon_kod=szablonowe_modul.NormaKoduKodowaniaTekstu("ATRYBUTY",ile);
    				return szablon_kod; 
    		    end;
    			if(math.mod(ile,2)==0)then
    				szablon2=ROZWAZANIA_SZABLONOWE_ATRYBUTY(szablon2);
    				return szablon1..szablon2..szablon3,true;
    			else
    				szablon3=ROZWAZANIA_SZABLONOWE_ATRYBUTY(szablon3);
    				return szablon1..szablon2..szablon3,false;
    			end;
    		end;
    		repeat
    			local ile_naprawy_znacznikow_1=nil;
    			local ile_naprawy_znacznikow_odejmnoc_1=0;
    			tekst_artykulu,ile_naprawy_znacznikow_1=mw.ustring.gsub(tekst_artykulu,"(</?%a+%s+)([^<>\"]-\".-\"[^<>\"]-)(/?>)",function(szablon1,szablon2,szablon3)
    				local szablon,tak=ATRYBUTY(szablon1,szablon2,szablon3,"\"");
    				if(tak)then ile_naprawy_znacznikow_odejmnoc_1=ile_naprawy_znacznikow_odejmnoc_1+1;end;
    				return szablon;
    			end);
    			ile_naprawy_znacznikow_1=ile_naprawy_znacznikow_1-ile_naprawy_znacznikow_odejmnoc_1;
    		until(ile_naprawy_znacznikow_1==0);
    		repeat
    			local ile_naprawy_znacznikow_2=nil;
    			local  ile_naprawy_znacznikow_odejmnoc_2=0;
    			tekst_artykulu,ile_naprawy_znacznikow_2=mw.ustring.gsub(tekst_artykulu,"(</?%a+%s+)([^<>']-'.-'[^<>']-)(/?>)",function(szablon1,szablon2,szablon3)
    				local szablon,tak=ATRYBUTY(szablon1,szablon2,szablon3,"'");
    				if(tak)then ile_naprawy_znacznikow_odejmnoc_2=ile_naprawy_znacznikow_odejmnoc_2+1;end;
    				return szablon;
    			end);
    			ile_naprawy_znacznikow_2=ile_naprawy_znacznikow_2-ile_naprawy_znacznikow_odejmnoc_2;
    		until (ile_naprawy_znacznikow_2==0);
    		--tekst_artykulu,ile_naprawy_znacznikow_4=mw.ustring.gsub(tekst_artykulu,"(</?)(%a+)(%s*[^<>]-%s*/?%s*>)",function(szablon1,szablon2,szablon3)
    		--	szablon2=mw.ustring.lower(szablon2);
    		--	return szablon1..szablon2..szablon3;
    		--end);
    		tekst_artykulu,ile_naprawy_znacznikow_1=mw.ustring.gsub(tekst_artykulu,"(<(/?)([^<>]*)>)",function(szablon,koniec,tekst)
    			if((not mw.ustring.match(tekst,"^%a+%s*/?$"))and(not mw.ustring.match(tekst,"^%a+%s+.*$")))then
    				if(not tab_element)then tab_element={};end;
    				if(not tab_element["INNE"])then tab_element["INNE"]={};end;
    				table.insert(tab_element["INNE"],"<"..koniec);
    				local ile1=#tab_element["INNE"];
    				table.insert(tab_element["INNE"],">");
    				local ile2=#tab_element["INNE"];
    				return szablonowe_modul.NormaKoduKodowaniaTekstu("INNE",ile1)..tekst..szablonowe_modul.NormaKoduKodowaniaTekstu("INNE",ile2);
    			end;
    		end);
    		local function ZnacznikiWiki(tekst_artykulu,czy_zawsze,czy_inne)
    			tekst_artykulu,ile_naprawy_znacznikow_2=mw.ustring.gsub(tekst_artykulu,"<(/?)(%a+)([^<>]-%s*)>",function(koniec,nazwa,tekst)
    				-----
    				if(koniec=="")then
    					local nazwa=mw.ustring.lower(nazwa);
    					table.insert(tab_znaczniki,nazwa);
    					local koniec_samozamykajacy=mw.ustring.match(tekst,"^(.-)%s*(/?)%s*$");
    					if(koniec_samozamykajacy=="/")then
    						tab_licznik_koniec[nazwa]=(tab_licznik_koniec[nazwa] or 0)+1;
    					end;
	    				tab_licznik_poczatek[nazwa]=(tab_licznik_poczatek[nazwa] or 0)+1;
    					if(not tab_numerki[nazwa])then tab_numerki[nazwa]={};end;
    					table.insert(tab_numerki[nazwa],tab_licznik_poczatek[nazwa]);
    					local licznik=tab_licznik_poczatek[nazwa];
    					local szablon=nazwa..tekst;
    					if(not tab_element)then tab_element={};end;
    					local typ=ObiektFun(nazwa);
    					---
    					local czy_znacznik=(typ=="ZNACZNIK");
    					local jak=(((czy_zawsze)or(czy_inne))and(not czy_znacznik))and "innebegin" or (((czy_zawsze)or(not czy_inne))and(czy_znacznik)and(tab_wiki_znacznik[nazwa]) and "begin" or nil);
    					if(not jak)then return;end;
    					----
    					if(not tab_element[nazwa..jak])then tab_element[nazwa..jak]={};end;
    					tab_element[nazwa..jak][licznik]=szablon;
    					return "<"..szablonowe_modul.NormaKoduKodowaniaTekstu(nazwa..jak,licznik)..">";
    				else
    					local nazwa=mw.ustring.lower(nazwa);
    					tab_licznik_koniec[nazwa]=(tab_licznik_koniec[nazwa] or 0)+1;
    					local licznik;
    					if(#tab_znaczniki>0)then
    						if(tab_znaczniki[#tab_znaczniki]~=nazwa)then
    							local koniec=0;
    							for i=#tab_znaczniki-1,1,-1 do
    								if(tab_znaczniki[i]==nazwa)then
    									koniec=i;
    									break;
    								end;
    							end;
								if(koniec>0)then
    								licznik=tab_numerki[nazwa][#tab_numerki[nazwa]];
    								for i=koniec+1,#tab_znaczniki,1 do
    									tab_licznik_koniec[tab_znaczniki[i]]=(tab_licznik_koniec[tab_znaczniki[i]] or 0)+1;
    								end;
    								for i=koniec,#tab_znaczniki,1 do
    									table.remove(tab_numerki[tab_znaczniki[i]]);
    								end;
    								for i=#tab_znaczniki,koniec,-1 do
    									table.remove(tab_znaczniki);
    								end;
    							else
    								tab_licznik_poczatek[nazwa]=(tab_licznik_poczatek[nazwa] or 0)+1;
    								licznik=tab_licznik_poczatek[nazwa];
    							end;
    						else
    							licznik=tab_numerki[nazwa][#tab_numerki[nazwa]];
    							table.remove(tab_numerki[nazwa]);
    							table.remove(tab_znaczniki);
    						end;
    					else
    						tab_licznik_poczatek[nazwa]=(tab_licznik_poczatek[nazwa] or 0)+1;
    						licznik=tab_licznik_koniec[nazwa];
    					end;
    					local szablon=nazwa..tekst;
    					if(not tab_element)then tab_element={};end;
    					local typ=ObiektFun(nazwa);
    					---
    					local czy_znacznik=(typ=="ZNACZNIK");
    					local jak=(((czy_zawsze)or(czy_inne))and(not czy_znacznik))and "inneend" or (((czy_zawsze)or(not czy_inne))and(czy_znacznik)and(tab_wiki_znacznik[nazwa]) and "end" or nil);
    					if(not jak)then return;end;
    					---
    					if(not tab_element[nazwa..jak])then tab_element[nazwa..jak]={};end;
    					tab_element[nazwa..jak][licznik]=szablon;
    					return "</"..szablonowe_modul.NormaKoduKodowaniaTekstu(nazwa..jak,licznik)..">";
    				end;
    			end);
    			return tekst_artykulu;
    		end;
    		tekst_artykulu=ZnacznikiWiki(tekst_artykulu,false,true);
    		local function ZnacznikiWikiLinia(tekst_artykulu,wzor,left,right)
    			tekst_artykulu=mw.ustring.gsub(tekst_artykulu,wzor,function(a,b)
    				if(b)then
    					b=ZnacznikiWiki(b,false,false);
    					return left..a..b..right;	
    				else
    					a=ZnacznikiWiki(a,false,false);
    					return left..a..right;	
    				end;
    			end);
    			return tekst_artykulu;
    		end;
    		----
    		tekst_artykulu=ZnacznikiWikiLinia(tekst_artykulu,"^(=[^\n]*[^%s=][^\n]*=)[^%S\n]*$","","");
    		tekst_artykulu=ZnacznikiWikiLinia(tekst_artykulu,"\n(=[^\n]*[^%s=][^\n]*=)[^%S\n]*$","\n","");
    		tekst_artykulu=ZnacznikiWikiLinia(tekst_artykulu,"^(=[^\n]*[^%s=][^\n]*=)[^%S\n]*\n","","\n");
    		tekst_artykulu=ZnacznikiWikiLinia(tekst_artykulu,"\n(=[^\n]*[^%s=][^\n]*=)[^%S\n]*\n","\n","\n");
    		----
    		tekst_artykulu=ZnacznikiWikiLinia(tekst_artykulu,"^([%*#;:]+)([^\n]+)$","","");
    		tekst_artykulu=ZnacznikiWikiLinia(tekst_artykulu,"\n([%*#;:]+)([^\n]+)$","\n","");
    		tekst_artykulu=ZnacznikiWikiLinia(tekst_artykulu,"^([%*#;:]+)([^\n]+)\n","","\n");
    		tekst_artykulu=ZnacznikiWikiLinia(tekst_artykulu,"\n([%*#;:]+)([^\n]+)\n","\n","\n");
    		tekst_artykulu=ZnacznikiWiki(tekst_artykulu,false,false);
    		----
    		function AnalizujDomykajace(tekst_artykulu,jak,co)
    			local tekst_artykulu,ile_znacznik_domykajacy=mw.ustring.gsub(tekst_artykulu,"<(/?)("..szablonowe_modul.NormaWzoruKodowaniaTekstu("(%a+)"..jak..co,"(%d+)")..")>",function(poczatek,nazwa_przed_nieodkodowane,obiekt,kod) 
        			local nazwa_przed=szablonowe_modul.KompletowanieSzablonoweZakodowanegoTekstu(self,nazwa_przed_nieodkodowane,nil,tab_element);
        			local nazwa,odstepy,atrybuty,koniec=mw.ustring.match(nazwa_przed,"^(%a+)(%s*)(.-)%s*(/?)%s*$");
        			nazwa=mw.ustring.lower(nazwa);
    				if((koniec=="/")or(nazwa=="br")or(nazwa=="hr")or(nazwa=="templatestyles"))then
    					local szablon="<"..poczatek..nazwa_przed..">";
    					return ZamienObiektSzablonuKodem(self,szablon,tablica_analizy_obiektow_strony_dany_modul,ObiektFun(nazwa));
    				end;
    				return nil;
    			end);
    			return tekst_artykulu;
    		end;
    		tekst_artykulu=AnalizujDomykajace(tekst_artykulu,"inne","begin");
    		tekst_artykulu=AnalizujDomykajace(tekst_artykulu,"","begin");
    		tekst_artykulu=AnalizujDomykajace(tekst_artykulu,"inne","end");
    		tekst_artykulu=AnalizujDomykajace(tekst_artykulu,"","end");
			----    			
    		return tekst_artykulu;
    	end;
    	tekst_artykulu=PreprocesorSzablonow(tekst_artykulu);
    	
        local function Kompilacja(tekst_artykulu)
    		----
    		local ZamianaLINKWNaLINKZ=function(zawartosc)
    			 local czy_url=html_modul["SprawdźURL"](zawartosc);
    			 if(czy_url)then
    			    	local szablon="["..zawartosc.."]";
    			    	return "["..ZamienObiektSzablonuKodem(self,szablon,tablica_analizy_obiektow_strony_dany_modul,"LINKZ").."]"
    			 else
    			 		local szablon="[["..zawartosc.."]]";
    			    	return ZamienObiektSzablonuKodem(self,szablon,tablica_analizy_obiektow_strony_dany_modul,"LINKW")
    			 end;
    		end;
    		local function InneElementyWikikodu(tekst_artykulu)
    			local ile_linkw;local ile_linkz;local ile_var;local ile_template;local ile_wikitabela;
    			local function Szablon(szablon,obiekt,czy_linkw)
    			    szablon=szablonowe_modul.KompletowanieSzablonoweZakodowanegoTekstu(self,szablon,nil,tab_element);
    			    if(czy_linkw)then
    			    	local zawartosc=mw.ustring.match(szablon,"^%[%[(.+)%]%]$");
    			    	return ZamianaLINKWNaLINKZ(zawartosc);
    			    else
    					return ZamienObiektSzablonuKodem(self,szablon,tablica_analizy_obiektow_strony_dany_modul,obiekt)
    				end;
    			end;
    			repeat
    				tekst_artykulu,ile_linkw=mw.ustring.gsub(tekst_artykulu,"(%[%[[^%[%]{}<>]+%]%])",function(szablon) return Szablon(szablon,"LINKW",true);end);
    				tekst_artykulu,ile_linkz=mw.ustring.gsub(tekst_artykulu,"(%[[^%[%]{}<>]+%])",function(szablon) return Szablon(szablon,"LINKZ");end);
    				repeat
        				tekst_artykulu,ile_var=mw.ustring.gsub(tekst_artykulu,"({{{[^%[%]{}<>]-}}})",function(szablon) return Szablon(szablon,"ZMIENNA");end);
        			until (ile_var==0);
        			tekst_artykulu,ile_template=mw.ustring.gsub(tekst_artykulu,"({{[^%[%]{}<>]-}})",function(szablon) return Szablon(szablon,"SZABLON");end);
        			tekst_artykulu,ile_wikitabela=mw.ustring.gsub(tekst_artykulu,"({|[^%[%]{}<>]-|})",function(szablon) return Szablon(szablon,"WIKITABELA");end);
        		until ((ile_linkw==0)and(ile_linkz==0)and(ile_template==0)and(ile_wikitabela==0));
        		return tekst_artykulu;
    		end;
    		NiedokonczoneElementyWikikodu=function(tekst_artykulu)    			
    			local function DomykajaceIOdtwierajace(tekst_artykulu,jak)
    				repeat
    					local ile_znacznik_niedomykajacy;
    					tekst_artykulu,ile_znacznik_niedomykajacy=mw.ustring.gsub(tekst_artykulu,"<("..szablonowe_modul.NormaWzoruKodowaniaTekstu("(%a+)"..jak.."begin","(%d+)")..")>(.*)$",function(nazwa_przed_nieodkodowane,obiekt,kod,zawartosc) 
        					local nazwa_przed=szablonowe_modul.KompletowanieSzablonoweZakodowanegoTekstu(self,nazwa_przed_nieodkodowane,nil,tab_element);
        					zawartosc=INNEPRE(zawartosc,true);
        					zawartosc=NiedokonczoneElementyWikikodu(zawartosc);
        					zawartosc=szablonowe_modul.KompletowanieSzablonoweZakodowanegoTekstu(self,zawartosc,nil,tab_element);
        					local nazwa,odstepy,atrybuty=mw.ustring.match(nazwa_przed,"^(%a+)(%s*)(.-)%s*$");
        					local szablon="<"..nazwa_przed..">"..zawartosc..((mw.ustring.match(zawartosc,"\n=[^\n]*[^%s=][^\n]*=[^%S\n]*$")
        						                                                     or mw.ustring.match(zawartosc,"\n[%*#:;][^\n]*$")
        						                                             ) and "\n" or "").."</"..nazwa..">";
        					return ZamienObiektSzablonuKodem(self,szablon,tablica_analizy_obiektow_strony_dany_modul,"ZNACZNIK");
    					end);
    				until (ile_znacznik_niedomykajacy==0);
    				repeat
    					local ile_znacznik_nieotwierajacy;
    					tekst_artykulu,ile_znacznik_nieotwierajacy=mw.ustring.gsub(tekst_artykulu,"^(.*)</("..szablonowe_modul.NormaWzoruKodowaniaTekstu("(%a+)"..jak.."end","(%d+)")..")>",function(zawartosc,nazwa_po_nieodkodowane,obiekt,kod) 
	        				local nazwa_po=szablonowe_modul.KompletowanieSzablonoweZakodowanegoTekstu(self,nazwa_po_nieodkodowane,nil,tab_element);
	    	    			zawartosc=INNEPRE(zawartosc);
	    	    			zawartosc=NiedokonczoneElementyWikikodu(zawartosc);
    		    			zawartosc=szablonowe_modul.KompletowanieSzablonoweZakodowanegoTekstu(self,zawartosc,nil,tab_element);
	        				local nazwa,odstepy,atrybuty=mw.ustring.match(nazwa_po,"^(%a+)(%s*)(.-)%s*$");
        					local szablon="<"..nazwa..">"..((mw.ustring.match(zawartosc,"^=[^\n]*[^%s=][^\n]*=[^%S\n]*\n")
        						                                                     or mw.ustring.match(zawartosc,"^[%*#:;][^\n]*\n")
        						                                             ) and "\n" or "")..zawartosc.."</"..nazwa_po..">";
        					return ZamienObiektSzablonuKodem(self,szablon,tablica_analizy_obiektow_strony_dany_modul,"ZNACZNIK");
    					end);
    				until (ile_znacznik_nieotwierajacy==0);
    				return tekst_artykulu;
    			end;
    			local function DomykajaceIOdtwierajaceWikiTabelka(tekst_artykulu)
    				repeat
    					local ile_wikitabela_1;
        				tekst_artykulu,ile_wikitabela_1=mw.ustring.gsub(tekst_artykulu,"({|)(.-)$",function(poczatek,szablon) 
        					szablon=INNEPRE(szablon,true);
        					szablon=NiedokonczoneElementyWikikodu(szablon);
        					szablon=szablonowe_modul.KompletowanieSzablonoweZakodowanegoTekstu(self,szablon,nil,tab_element);
        					return ZamienObiektSzablonuKodem(self,poczatek..szablon..((mw.ustring.match(szablon,"\n=[^\n]*[^%s=][^\n]*=[^%S\n]*$") 
        						                                                             or mw.ustring.match(szablon,"\n[%*#:;][^\n]*$")
        						                                                          )and "\n" or "").."|}",tablica_analizy_obiektow_strony_dany_modul,"WIKITABELA");
        				end);
    				until (ile_wikitabela_1==0);
    				repeat
    					local ile_wikitabela_2;
        				tekst_artykulu,ile_wikitabela_2=mw.ustring.gsub(tekst_artykulu,"^(.-)(|})",function(szablon,koniec) 
        					szablon=INNEPRE(szablon);
        					szablon=NiedokonczoneElementyWikikodu(szablon);
        					szablon=szablonowe_modul.KompletowanieSzablonoweZakodowanegoTekstu(self,szablon,nil,tab_element);
        					return ZamienObiektSzablonuKodem(self,"{|"..((mw.ustring.match(szablon,"^=[^\n]*[^%s=][^\n]*=[^%S\n]*\n") 
        						                                                             or mw.ustring.match(szablon,"^[%*#:;][^\n]*\n")
        						                                         )and "\n" or "")..szablon..koniec,tablica_analizy_obiektow_strony_dany_modul,"WIKITABELA");
        				end);
    				until (ile_wikitabela_2==0);
    				return tekst_artykulu;
    			end;
    			local function DomykajaceIOdtwierajaceLinia(tekst_artykulu,wzor,left,right)
    				tekst_artykulu=mw.ustring.gsub(tekst_artykulu,wzor,function(a,b)
    					if(b)then
    						b=DomykajaceIOdtwierajaceWikiTabelka(b);
    						b=DomykajaceIOdtwierajace(b,"");
    						return left..a..b..right;
    					else
    						a=DomykajaceIOdtwierajaceWikiTabelka(a);
    						a=DomykajaceIOdtwierajace(a,"");
    						return left..a..right;
    					end;
    				end);
    				return tekst_artykulu;
    			end;
    			---
    			tekst_artykulu=DomykajaceIOdtwierajace(tekst_artykulu,"inne");
    			-----
    			tekst_artykulu=DomykajaceIOdtwierajaceLinia(tekst_artykulu,"^(=[^\n]*[^%s=][^\n]*=)[^%S\n]*$","","");
    			tekst_artykulu=DomykajaceIOdtwierajaceLinia(tekst_artykulu,"\n(=[^\n]*[^%s=][^\n]*=)[^%S\n]*$","\n","");
    			tekst_artykulu=DomykajaceIOdtwierajaceLinia(tekst_artykulu,"^(=[^\n]*[^%s=][^\n]*=)[^%S\n]*\n","","\n");
    			tekst_artykulu=DomykajaceIOdtwierajaceLinia(tekst_artykulu,"\n(=[^\n]*[^%s=][^\n]*=)[^%S\n]*\n","\n","\n");
    			----
    			tekst_artykulu=DomykajaceIOdtwierajaceLinia(tekst_artykulu,"^([%*#;:]+)([^\n]+)$","","");
    			tekst_artykulu=DomykajaceIOdtwierajaceLinia(tekst_artykulu,"\n([%*#;:]+)([^\n]+)$","\n","");
    			tekst_artykulu=DomykajaceIOdtwierajaceLinia(tekst_artykulu,"^([%*#;:]+)([^\n]+)\n","","\n");
    			tekst_artykulu=DomykajaceIOdtwierajaceLinia(tekst_artykulu,"\n([%*#;:]+)([^\n]+)\n","\n","\n");
    			-----
    			---
    			--tekst_artykulu=DomykajaceIOdtwierajace(tekst_artykulu,"inne");
    			tekst_artykulu=DomykajaceIOdtwierajace(tekst_artykulu,"");
    			tekst_artykulu=DomykajaceIOdtwierajaceWikiTabelka(tekst_artykulu);
        		return tekst_artykulu;
    		end;
    		local function ZnieklasyfikowaneZnaki(tekst_artykulu)
    		   local ile_naprawy_znacznikow_1;local ile_naprawy_znacznikow_2;local ile_naprawy_znacznikow_3;local ile_naprawy_znacznikow_4;local ile_naprawy_znacznikow_5;local ile_naprawy_znacznikow_6;local ile_naprawy_znacznikow_7;local ile_naprawy_znacznikow_8;local ile_naprawy_znacznikow_9;local ile_naprawy_znacznikow_10;local ile_naprawy_znacznikow_11;
    		   repeat
    		   	    tekst_artykulu,ile_naprawy_znacznikow_1=mw.ustring.gsub(tekst_artykulu,"^(%[+%]+)",function(tekst)
       					if(not tab_element)then tab_element={};end;
    					if(not tab_element["INNE"])then tab_element["INNE"]={};end;
    					table.insert(tab_element["INNE"],tekst);
    					local ile=#tab_element["INNE"];
    					return szablonowe_modul.NormaKoduKodowaniaTekstu("INNE",ile);
    				end);
    		       	tekst_artykulu,ile_naprawy_znacznikow_2=mw.ustring.gsub(tekst_artykulu,"(<)([^>]*<)",function(tekst1,tekst2) 
    					if(not tab_element)then tab_element={};end;
    					if(not tab_element["INNE"])then tab_element["INNE"]={};end;
	    				table.insert(tab_element["INNE"],tekst1);
    					local ile=#tab_element["INNE"];
    					return szablonowe_modul.NormaKoduKodowaniaTekstu("INNE",ile)..tekst2;
    				end);
					tekst_artykulu,ile_naprawy_znacznikow_3=mw.ustring.gsub(tekst_artykulu,"(>[^<]*)(>)",function(tekst1,tekst2) 
    					if(not tab_element)then tab_element={};end;
    					if(not tab_element["INNE"])then tab_element["INNE"]={};end;
	    				table.insert(tab_element["INNE"],tekst2);
    					local ile=#tab_element["INNE"];
    					return tekst1..szablonowe_modul.NormaKoduKodowaniaTekstu("INNE",ile);
					end);
		    		tekst_artykulu,ile_naprawy_znacznikow_4=mw.ustring.gsub(tekst_artykulu,"(<)([^>]*)$",function(tekst1,tekst2) 
    					if(not tab_element)then tab_element={};end;
    					if(not tab_element["INNE"])then tab_element["INNE"]={};end;
	    				table.insert(tab_element["INNE"],tekst1);
    					local ile=#tab_element["INNE"];
    					return szablonowe_modul.NormaKoduKodowaniaTekstu("INNE",ile)..tekst2;
    				end);
					tekst_artykulu,ile_naprawy_znacznikow_5=mw.ustring.gsub(tekst_artykulu,"^([^<]*)(>)",function(tekst1,tekst2) 
    					if(not tab_element)then tab_element={};end;
    					if(not tab_element["INNE"])then tab_element["INNE"]={};end;
	    				table.insert(tab_element["INNE"],tekst2);
    					local ile=#tab_element["INNE"];
    					return tekst1..szablonowe_modul.NormaKoduKodowaniaTekstu("INNE",ile);
					end);
    				tekst_artykulu,ile_naprawy_znacznikow_6=mw.ustring.gsub(tekst_artykulu,"([^{])({)([^|{])",function(tekst1,tekst2,tekst3)
    					if(not tab_element)then tab_element={};end;
    					if(not tab_element["INNE"])then tab_element["INNE"]={};end;
    					table.insert(tab_element["INNE"],tekst2);
    					local ile=#tab_element["INNE"];
    					return tekst1..szablonowe_modul.NormaKoduKodowaniaTekstu("INNE",ile)..tekst3;
    				end);
    				tekst_artykulu,ile_naprawy_znacznikow_7=mw.ustring.gsub(tekst_artykulu,"([^|}])(})([^}])",function(tekst1,tekst2,tekst3)
       					if(not tab_element)then tab_element={};end;
    					if(not tab_element["INNE"])then tab_element["INNE"]={};end;
    					table.insert(tab_element["INNE"],tekst2);
    					local ile=#tab_element["INNE"];
    					return tekst1..szablonowe_modul.NormaKoduKodowaniaTekstu("INNE",ile)..tekst3;
    				end);
    				tekst_artykulu,ile_naprawy_znacznikow_8=mw.ustring.gsub(tekst_artykulu,"^({)([^|{])",function(tekst1,tekst2)
    					if(not tab_element)then tab_element={};end;
    					if(not tab_element["INNE"])then tab_element["INNE"]={};end;
    					table.insert(tab_element["INNE"],tekst1);
    					local ile=#tab_element["INNE"];
    					return szablonowe_modul.NormaKoduKodowaniaTekstu("INNE",ile)..tekst2;
    				end);
    				tekst_artykulu,ile_naprawy_znacznikow_9=mw.ustring.gsub(tekst_artykulu,"([^|}])(})$",function(tekst1,tekst2)
       					if(not tab_element)then tab_element={};end;
    					if(not tab_element["INNE"])then tab_element["INNE"]={};end;
    					table.insert(tab_element["INNE"],tekst2);
    					local ile=#tab_element["INNE"];
    					return tekst1..szablonowe_modul.NormaKoduKodowaniaTekstu("INNE",ile);
    				end);
    				tekst_artykulu,ile_naprawy_znacznikow_10=mw.ustring.gsub(tekst_artykulu,"(%[)([^%]]*)$",function(tekst1,tekst2)
    					if(not tab_element)then tab_element={};end;
    					if(not tab_element["INNE"])then tab_element["INNE"]={};end;
    					table.insert(tab_element["INNE"],tekst1);
    					local ile=#tab_element["INNE"];
    					return szablonowe_modul.NormaKoduKodowaniaTekstu("INNE",ile)..tekst2;
    				end);
    				tekst_artykulu,ile_naprawy_znacznikow_11=mw.ustring.gsub(tekst_artykulu,"^([^%[]*)(%])",function(tekst1,tekst2)
       					if(not tab_element)then tab_element={};end;
    					if(not tab_element["INNE"])then tab_element["INNE"]={};end;
    					table.insert(tab_element["INNE"],tekst2);
    					local ile=#tab_element["INNE"];
    					return tekst1..szablonowe_modul.NormaKoduKodowaniaTekstu("INNE",ile);
    				end);
    				tekst_artykulu,ile_naprawy_znacznikow_12=mw.ustring.gsub(tekst_artykulu,"^([^%[%]]*)(%[+)([^%[%]]+%[)",function(tekst1,tekst2,tekst3)
       					if(not tab_element)then tab_element={};end;
    					if(not tab_element["INNE"])then tab_element["INNE"]={};end;
    					table.insert(tab_element["INNE"],tekst2);
    					local ile=#tab_element["INNE"];
    					return tekst1..szablonowe_modul.NormaKoduKodowaniaTekstu("INNE",ile)..tekst3;
    				end);
    				tekst_artykulu,ile_naprawy_znacznikow_13=mw.ustring.gsub(tekst_artykulu,"(%][^%[%]]+)(%]+)([^%[%]]*)$",function(tekst1,tekst2,tekst3)
       					if(not tab_element)then tab_element={};end;
    					if(not tab_element["INNE"])then tab_element["INNE"]={};end;
    					table.insert(tab_element["INNE"],tekst2);
    					local ile=#tab_element["INNE"];
    					return tekst1..szablonowe_modul.NormaKoduKodowaniaTekstu("INNE",ile)..tekst3;
    				end);
    			until ((ile_naprawy_znacznikow_1==0)and(ile_naprawy_znacznikow_2==0)and(ile_naprawy_znacznikow_3==0)and(ile_naprawy_znacznikow_4==0)and(ile_naprawy_znacznikow_5==0)and(ile_naprawy_znacznikow_6==0)and(ile_naprawy_znacznikow_7==0)and(ile_naprawy_znacznikow_8==0)and(ile_naprawy_znacznikow_9==0)and(ile_naprawy_znacznikow_10==0)and(ile_naprawy_znacznikow_11==0)and(ile_naprawy_znacznikow_12==0)and(ile_naprawy_znacznikow_13==0));
    			return tekst_artykulu;
    		end;
    		local function ZNACZNIKI(tekst_artykulu,jak)
    			local ile_odjac_znacznik_niedomykajacy=0;
        		local tekst_artykulu,ile_znacznik_niedomykajacy=mw.ustring.gsub(tekst_artykulu,"<("..szablonowe_modul.NormaWzoruKodowaniaTekstu("(%a+)"..jak.."begin","(%d+)")..")>(.-)</("..szablonowe_modul.NormaWzoruKodowaniaTekstu("(%2)"..jak.."end","(%3)")..")>",function(nazwa_przed_nieodkodowane,obiekt,kod,zawartosc,nazwa_po_nieodkodowane,obiekt2,kod2)
        			local nazwa_przed=szablonowe_modul.KompletowanieSzablonoweZakodowanegoTekstu(self,nazwa_przed_nieodkodowane,nil,tab_element);
        			local nazwa,odstepy,atrybuty=mw.ustring.match(nazwa_przed,"^(%a+)(%s*)(.-)%s*$");
        			nazwa=mw.ustring.lower(nazwa);
        			local function TenZnacznik()
        				  local nazwa_po=szablonowe_modul.KompletowanieSzablonoweZakodowanegoTekstu(self,nazwa_po_nieodkodowane,nil,tab_element);
        				  zawartosc=szablonowe_modul.KompletowanieSzablonoweZakodowanegoTekstu(self,zawartosc,nil,tab_element);
        				  if(jak=="")then
        				  		zawartosc=INNEPRE(zawartosc,true);
        				  end;
        				  local szablon="<"..nazwa_przed..">"..zawartosc.."</"..nazwa_po..">";
        				  return ZamienObiektSzablonuKodem(self,szablon,tablica_analizy_obiektow_strony_dany_modul,ObiektFun(nazwa));
        			end;
        			if(not mw.ustring.match(atrybuty,"^%s*$"))then
        				if(odstepy~="")then
        					if((jak~="")or(not mw.ustring.match(zawartosc,"[<>{}]")))then
        						return TenZnacznik();
        					end;
        				end;
        			else
        				if((jak~="")or(not mw.ustring.match(zawartosc,"[<>{}]")))then
        					return TenZnacznik();
        				end;
        			end;
        			----
        			local ile_zastapione;local ile_pominiete;
        			zawartosc,ile_zastapione,ile_pominiete=ZNACZNIKI(zawartosc,jak);
        			zawartosc=ZnieklasyfikowaneZnaki(zawartosc);
        			zawartosc=InneElementyWikikodu(zawartosc);
        			zawartosc=INNEPRE(zawartosc,true);
        			zawartosc=NiedokonczoneElementyWikikodu(zawartosc);
        			
        			if(not mw.ustring.match(zawartosc,"[<>{}]"))then
        				return TenZnacznik();
        			else
        				ile_odjac_znacznik_niedomykajacy=ile_odjac_znacznik_niedomykajacy+1;
        				local szablon="<"..nazwa_przed_nieodkodowane..">"..zawartosc.."</"..nazwa_po_nieodkodowane..">";
        				return szablon;
        			end;
        		end);
        		return tekst_artykulu,ile_znacznik_niedomykajacy,ile_odjac_znacznik_niedomykajacy;
    		end;
    		----
    		local function PracePrzygotowywujace(tekst_artykulu)
    			local ile_linkw;local ile_linkz;local ile_var;local ile_template;local ile_wikitabela;
    			local function Szablon(zawartosc,przed,po,obiekt,czy_linkw)
    				  zawartosc=ZnieklasyfikowaneZnaki(zawartosc);
        			  local ile_znacznik_niedomykajacy,ile_odjac_znacznik_niedomykajacy;
        			  zawartosc,ile_znacznik_niedomykajacy,ile_odjac_znacznik_niedomykajacy=ZNACZNIKI(zawartosc,"");
        			  zawartosc=InneElementyWikikodu(zawartosc);
        			  zawartosc=INNEPRE(zawartosc,true,(obiekt=="SZABLON"));
        			  zawartosc=NiedokonczoneElementyWikikodu(zawartosc);
        			  zawartosc=szablonowe_modul.KompletowanieSzablonoweZakodowanegoTekstu(self,zawartosc,nil,tab_element);
        			  if(czy_linkw)then
        			  		return ZamianaLINKWNaLINKZ(zawartosc);
        			  else
        					local szablon=przed..zawartosc..po;
    						return ZamienObiektSzablonuKodem(self,szablon,tablica_analizy_obiektow_strony_dany_modul,obiekt);
    				  end;
    			end;
    			repeat
    				tekst_artykulu,ile_linkw=mw.ustring.gsub(tekst_artykulu,"%[%[([^%[%]]+)%]%]",function(szablon) 
    					return Szablon(szablon,"[[","]]","LINKW",true);
    				end);
    				tekst_artykulu,ile_linkz=mw.ustring.gsub(tekst_artykulu,"%[([^%[%]]+)%]",function(szablon) 
    					return Szablon(szablon,"[","]","LINKZ");
    				end);
    				repeat
        				tekst_artykulu,ile_var=mw.ustring.gsub(tekst_artykulu,"{{{([^{}]-)}}}",function(szablon) 
        					return Szablon(szablon,"{{{","}}}","ZMIENNA");
        				end);
        			until (ile_var==0);
        			tekst_artykulu,ile_template=mw.ustring.gsub(tekst_artykulu,"{{([^{}]-)}}",function(szablon) 
        				return Szablon(szablon,"{{","}}","SZABLON");
        			end);
        			tekst_artykulu,ile_wikitabela=mw.ustring.gsub(tekst_artykulu,"{|([^{}]-)|}",function(szablon) 
        				return Szablon(szablon,"{|","|}","WIKITABELA");
        			end);
    			until ((ile_linkw==0)and(ile_linkz==0)and(ile_var==0)and(ile_template==0)and(ile_wikitabela==0));
    			return tekst_artykulu;
    		end;
    		----
    		tekst_artykulu=ZnieklasyfikowaneZnaki(tekst_artykulu);
    		local ile_odjac_znacznik_niedomykajacy_1;
    		tekst_artykulu,ile_znacznik_niedomykajacy_1,ile_odjac_znacznik_niedomykajacy_1=ZNACZNIKI(tekst_artykulu,"inne");
    		ile_znacznik_niedomykajacy_1=ile_znacznik_niedomykajacy_1-ile_odjac_znacznik_niedomykajacy_1;
    		tekst_artykulu=PracePrzygotowywujace(tekst_artykulu);
        	----
        	local ile_odjac_znacznik_niedomykajacy_2;
        	tekst_artykulu,ile_znacznik_niedomykajacy_2,ile_odjac_znacznik_niedomykajacy_2=ZNACZNIKI(tekst_artykulu,"");
        	return tekst_artykulu;
        end;
        PREWSTAWIAJACA=function(tekst_artykulu)
        	czy_wynik=nil;
        	tekst_artykulu=PreprocesorSzablonow(tekst_artykulu);
        	tekst_artykulu=Kompilacja(tekst_artykulu);
        	czy_wynik=true;
        	return tekst_artykulu;
        end;
        tekst_artykulu=Kompilacja(tekst_artykulu)
        local function PoczatekKoniecTekst(tekst_artykulu)
        	local tekst_poczatek=(__FUNKCJA_poczatek and __FUNKCJA_poczatek(tekst_artykulu,nazwa_modulu,tablica_analizy_obiektow_strony_dany_modul) or nil);
        	local tekst_koniec=(__FUNKCJA_koniec and __FUNKCJA_koniec(tekst_artykulu,nazwa_modulu,tablica_analizy_obiektow_strony_dany_modul) or nil);
        	if(((tekst_poczatek)and(not mw.ustring.match(tekst_poczatek,"^%s*$")))or((tekst_koniec)and(not mw.ustring.match(tekst_koniec,"^%s*$"))))then
        		tekst_poczatek=tekst_poczatek and PREWSTAWIAJACA(tekst_poczatek) or tekst_poczatek;
        		tekst_koniec=tekst_koniec and PREWSTAWIAJACA(tekst_koniec) or tekst_koniec;
        		tekst_artykulu=(tekst_poczatek or "")..tekst_artykulu..(tekst_koniec or "");
        	end;
        	return tekst_artykulu;
        end;
        tekst_artykulu=PoczatekKoniecTekst(tekst_artykulu);
        local function PraceKoncowe(tekst_artykulu)
    		tekst_artykulu=NiedokonczoneElementyWikikodu(tekst_artykulu);
    		return tekst_artykulu;
        end;
	    tekst_artykulu=PraceKoncowe(tekst_artykulu);
	    tekst_artykulu=szablonowe_modul.KompletowanieSzablonoweZakodowanegoTekstu(self,tekst_artykulu,nil,tab_element);
	    tekst_artykulu=INNEPRE(tekst_artykulu);
	    tekst_artykulu=szablonowe_modul.OdkodowanieZakodowanychNormKodowychNieschematycznychRzeczy(self,tekst_artykulu,nil,tablica_analizy_obiektow_strony_dany_modul);
    	return tekst_artykulu;
    end;
	function UstawieniaPoczatkoweObiektowSzablonow()
		if(not tablica_analizy_obiektow_strony_dany_modul)then
    		if(not self.tablica_analizy_obiektow_strony_dany_modul)then self.tablica_analizy_obiektow_strony_dany_modul={};end;
    		if(not self.tablica_analizy_obiektow_strony_dany_modul[nazwa_modulu])then self.tablica_analizy_obiektow_strony_dany_modul[nazwa_modulu]={};end;
    		---
    		tablica_analizy_obiektow_strony_dany_modul=self.tablica_analizy_obiektow_strony_dany_modul[nazwa_modulu];
		end;
    	InicjujNumeryPoczatkoweObiektowSzablonow();
    	if(not __FUNKCJA3)then
    		--tablica_analizy_obiektow_strony_dany_modul["ŹRÓDŁO"]={};
    		--tablica_analizy_obiektow_strony_dany_modul["GALERIA"]={};
    		--tablica_analizy_obiektow_strony_dany_modul["MAPAOBRAZU"]={};
    		tablica_analizy_obiektow_strony_dany_modul["SZABLON"]={};
    		tablica_analizy_obiektow_strony_dany_modul["LINKW"]={};
    		tablica_analizy_obiektow_strony_dany_modul["LINKZ"]={};
    		tablica_analizy_obiektow_strony_dany_modul["ZMIENNA"]={};
    		tablica_analizy_obiektow_strony_dany_modul["WIKITABELA"]={};
    		--tablica_analizy_obiektow_strony_dany_modul["NOWIKI"]={};
    		--tablica_analizy_obiektow_strony_dany_modul["MATH"]={};
    		--tablica_analizy_obiektow_strony_dany_modul["PRE"]={};
    		tablica_analizy_obiektow_strony_dany_modul["INNEPRE"]={};
    		tablica_analizy_obiektow_strony_dany_modul["ZNACZNIK"]={};
    		tablica_analizy_obiektow_strony_dany_modul["STARE"]={};
    		for obiekt,_ in pairs(szablonowe_dane_modul.tablica_kodowa_obiektowa_typowo_mechanizmu_mediawiki)do
    			tablica_analizy_obiektow_strony_dany_modul[obiekt]={};
    		end;
    	end;
	end;
	----
	UstawieniaPoczatkoweObiektowSzablonow();
    ---
    local szablonowe_modul=require("Module:Szablonowe");
    tekst_artykulu,_=mw.ustring.gsub(tekst_artykulu,"("..szablonowe_modul.NormaWzoruKodowaniaTekstu()..")",function(szablon,obiekt,kod)
		return ZamienObiektSzablonuKodem(self,szablon,tablica_analizy_obiektow_strony_dany_modul,"STARE");
    end);
    tekst_artykulu=AnalizaObiektowSzablonowegoTekstu(tekst_artykulu);
    return tekst_artykulu;
end;
return p;