Moduł:StronicowyParser/Rozdziały
Przejdź do nawigacji
Przejdź do wyszukiwania
Zobacz podstrony tego modułu.
|
local p={}
function p.PodajRozdzial(linia)
local liczba_rowna_sie=1;
local naglowek="";
while true do
local przetwarzany_naglowek=mw.ustring.match(linia,"^\n?"..mw.ustring.rep("=",liczba_rowna_sie).."%s*([^\n]+)%s*"..mw.ustring.rep("=",liczba_rowna_sie).."%s*\n?$");
if(mw.ustring.match(przetwarzany_naglowek,"^=([^\n]+)=$")~=nil)then
liczba_rowna_sie=liczba_rowna_sie+1;
else
local parametry_modul=require("Module:Parametry");
naglowek=parametry_modul["Odstępy"]{[1]=przetwarzany_naglowek,[2]="tak",};
return naglowek,liczba_rowna_sie;
end;
end;
end;
function p.PodajRozdzialHNumer(linia)
local liczba1,zawrtosc,liczba2=mw.ustring.match(linia,"<[Hh](%d+)[^<>]*>(.*)</[Hh](%d+)>");
if(liczba1==liczba2)then
return zawartosc,liczba1;
end;
return nil;
end;
function p.SprawdzCzyNaglowek(wiersz)
local czy_naglowek=mw.ustring.match(wiersz,"^(=+[^=]*=+)%s*$");
if(czy_naglowek)then return true,true;end;
czy_naglowek=mw.ustring.match(wiersz,"<[Hh]%d+[^<>]*>(.+)</[Hh]%d+>");
return czy_naglowek,false;
end;
function p.WierszHNumer(tekst)
local iter_h=mw.ustring.gmatch(tekst,"(<[Hh]%d+[^<>]*>.*</[Hh]%d+>)");
local techniczne_modul=require("Module:techniczne");
for wiersz_h in iter_h do
local wiersz_h_start=wiersz_h;
wiersz_h,_=mw.ustring.gsub(wiersz_h,"\n"," ");
wiersz_h="\n"..wiersz_h.."\n";
wiersz_h_start=techniczne_modul["PrzekształćWzórDoCzystegoTekstu"](wiersz_h_start);
wiersz_h=techniczne_modul["TekstBezOdwołańDoParametrówWeWzorze"](wiersz_h);
tekst,_=mw.ustring.gsub(tekst,wiersz_h_start,wiersz_h);
end;
return tekst;
end;
function p.ParserPodajRozdzialTekstowy()
local zacznij;local wprowadzenie;local i=0;
local stronicowyparser_obiekty_modul=mw.loadData('Module:StronicowyParser/obiekty');
local parametry_modul=require("Module:Parametry");
local tab_dozwolonych_szablonow_z_elementami_spisu_artykulow=stronicowyparser_obiekty_modul.tab_dozwolonych_szablonow_z_elementami_spisu_artykulow;
local szablony={};
return function(linia,nazwa_przestrzeni_nazw,nazwa_ksiazki,okladka)
if(not zacznij)then
if(mw.ustring.match(linia,"^[^#:%*;%d%.].*[%.,:]%s*$"))then
wprowadzenie=true;
elseif((not wprowadzenie)and(mw.ustring.match(linia,"^[#:%*;%d%.]")))then
wprowadzenie=false;
elseif((wprowadzenie)and(mw.ustring.match(linia,"^%s*$")))then
zacznij=true;
wprowadzenie=false;
end;
elseif(mw.ustring.match(linia,"[^#:%*;%d%.].*[%.,:]%s*$"))then
zacznij=false;
wprowadzenie=true;
end;
local szablon=mw.ustring.match(linia,"^.*{{([^|{}]+)|[^{}]*$");
if(szablon)then
szablon=parametry_modul["Odstępy"](szablon,"tak");
szablon=mw.getContentLanguage():ucfirst(szablon);
if(not tab_dozwolonych_szablonow_z_elementami_spisu_artykulow[szablon])then
table.insert(szablony,szablon);
end;
end;
if((szablon)and(#szablony>0)and(not tab_dozwolonych_szablonow_z_elementami_spisu_artykulow[szablony[#szablony]]))then
i=i+1;
end;
if((not wprowadzenie)and(i<=0))then
local poczatek, rozdzial=mw.ustring.match(linia,"^%s*([#:%*;%d%.]+[#:%*;%d%.%s]-)%s*([^{}%[%]]-)%s*$");
if(not poczatek or not rozdzial)then
if(not mw.ustring.match(linia,"^.*[,%.]%s*$"))then
rozdzial=mw.ustring.match(linia,"^%s*'+%s*([^{}%[%]']*[^:{}%[%]'])%s*'+%s*$");
if(rozdzial)then
return rozdzial,0,nil,true;
end;
end;
else
if(not mw.ustring.match(linia,"^.*[,%.]%s*$"))then
return rozdzial,(#poczatek*(-1)),poczatek,true;
end;
end;
end;
if((#szablony>0)and(not tab_dozwolonych_szablonow_z_elementami_spisu_artykulow[szablony[#szablony]])and(mw.ustring.match(linia,"^[^{}]*}}.*$")))then
i=i-1;
if(i<0)then i=0;end;
table.remove(szablony,#szablony);
end;
return nil,nil,nil,((i<=0) and true or false);
end;
end;
function p.TekstRozdzialuStrony(frame)
local strona=frame.args[1];
local id_rozdzialu1=frame.args[2] or "";
local id_rozdzialu2=frame.args[3] or "";
local title=mw.title.makeTitle('',strona);
if((not title)or(not title.exists))then
return nil;
end;
local tekst=title:getContent();
return p.TekstRozdzialu(tekst,id_rozdzialu1,id_rozdzialu2);
end;
function p.ZwrocSekcjeNaglowkaStrony(frame)
local strona=frame.args[1];
local id_rozdzialu=frame.args[2] or "";
id_rozdzialu,_=mw.ustring.gsub(id_rozdzialu,"<[^<>]+>","");
id_rozdzialu,_=mw.ustring.gsub(id_rozdzialu,"'+","");
id_rozdzialu,_=mw.ustring.gsub(id_rozdzialu,"^[%s_]+","");
id_rozdzialu,_=mw.ustring.gsub(id_rozdzialu,"[%s_]+$","");
id_rozdzialu,_=mw.ustring.gsub(id_rozdzialu,"[%s_]+","_");
local title=mw.title.makeTitle('',strona);
if((not title)or(not title.exists))then
return nil;
end;
local tekst=title:getContent();
tekst,_=mw.ustring.gsub(tekst,"<[Nn][Oo][Ii][Nn][Cc][Ll][Uu][Dd][Ee]>(.-)</[Nn][Oo][Ii][Nn][Cc][Ll][Uu][Dd][Ee]>","");
tekst,_=mw.ustring.gsub(tekst,"<[Ii][Nn][Cc][Ll][Uu][Dd][Ee][Oo][Nn][Ll][Yy]>(.-)</[Ii][Nn][Cc][Ll][Uu][Dd][Ee][Oo][Nn][Ll][Yy]>","%1");
tekst,_=mw.ustring.gsub(tekst,"\n\n","\n \n");
tekst=p.WierszHNumer(tekst);
local iter=mw.ustring.gmatch(tekst,"([^\n]+)");
local tab_rozdzialy={};
local linki=require("Module:Linki");
for wiersz in iter do
local czy_naglowek,czy_naglowek_wiki=p.SprawdzCzyNaglowek(wiersz);
if(czy_naglowek)then
local nazwa_rozdzialu,poziom_rozdzialu;
if(czy_naglowek_wiki)then
nazwa_rozdzialu,poziom_rozdzialu=p.PodajRozdzial(wiersz);
else
nazwa_rozdzialu,poziom_rozdzialu=p.PodajRozdzialHNumer(wiersz);
end;
nazwa_rozdzialu=frame:preprocess(nazwa_rozdzialu);
local nazwa_rozdzialu_aktualna=nazwa_rozdzialu;
nazwa_rozdzialu=linki["UsuńKategorie"](nazwa_rozdzialu);
nazwa_rozdzialu=linki["UsuńZnaczniki"](nazwa_rozdzialu);
nazwa_rozdzialu=linki["UsuńSzablonStylów"](nazwa_rozdzialu);
nazwa_rozdzialu=linki["UsuńWywołaniaPlików"](nazwa_rozdzialu);
nazwa_rozdzialu=linki["UsuńInterwiki"](nazwa_rozdzialu);
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"<[^<>]+>","");
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"'+","");
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"^[%s_]+","");
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"[%s_]+$","");
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"[%s_]+","_");
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"%[%[:?([^%[%]|]+)%]%]","%1");
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"%[%[:?([^%[%]|]+)|([^%[%]|]*)(.*)%]%]","%2");
local c=1;
for i=1,#tab_rozdzialy,1 do
if(tab_rozdzialy[i]==nazwa_rozdzialu)then
c=c+1;
end;
end;
if(c>1)then
nazwa_rozdzialu=nazwa_rozdzialu.."_"..c;
end;
if(id_rozdzialu==nazwa_rozdzialu)then
return frame:preprocess(nazwa_rozdzialu_aktualna);
end;
end;
end;
return nil;
end;
function p.KtoraSekcjaStrony(frame)
local strona=frame.args[1];
local id_rozdzialu=frame.args[2] or "";
id_rozdzialu,_=mw.ustring.gsub(id_rozdzialu,"<[^<>]+>","");
id_rozdzialu,_=mw.ustring.gsub(id_rozdzialu,"'+","");
id_rozdzialu,_=mw.ustring.gsub(id_rozdzialu,"^[%s_]+","");
id_rozdzialu,_=mw.ustring.gsub(id_rozdzialu,"[%s_]+$","");
id_rozdzialu,_=mw.ustring.gsub(id_rozdzialu,"[%s_]+","_");
local title=mw.title.makeTitle('',strona);
if((not title)or(not title.exists))then
return nil;
end;
local tekst=title:getContent();
tekst,_=mw.ustring.gsub(tekst,"<[Nn][Oo][Ii][Nn][Cc][Ll][Uu][Dd][Ee]>(.-)</[Nn][Oo][Ii][Nn][Cc][Ll][Uu][Dd][Ee]>","");
tekst,_=mw.ustring.gsub(tekst,"<[Ii][Nn][Cc][Ll][Uu][Dd][Ee][Oo][Nn][Ll][Yy]>(.-)</[Ii][Nn][Cc][Ll][Uu][Dd][Ee][Oo][Nn][Ll][Yy]>","%1");
tekst,_=mw.ustring.gsub(tekst,"\n\n","\n \n");
tekst=p.WierszHNumer(tekst);
local iter=mw.ustring.gmatch(tekst,"([^\n]+)");
local tab_rozdzialy={};
local ile=1;
local linki=require("Module:Linki");
for wiersz in iter do
local czy_naglowek,czy_naglowek_wiki=p.SprawdzCzyNaglowek(wiersz);
if(czy_naglowek)then
local nazwa_rozdzialu,poziom_rozdzialu;
if(czy_naglowek_wiki)then
nazwa_rozdzialu,poziom_rozdzialu=p.PodajRozdzial(wiersz);
else
nazwa_rozdzialu,poziom_rozdzialu=p.PodajRozdzialHNumer(wiersz);
end;
nazwa_rozdzialu=frame:preprocess(nazwa_rozdzialu);
nazwa_rozdzialu=linki["UsuńKategorie"](nazwa_rozdzialu);
nazwa_rozdzialu=linki["UsuńZnaczniki"](nazwa_rozdzialu);
nazwa_rozdzialu=linki["UsuńSzablonStylów"](nazwa_rozdzialu);
nazwa_rozdzialu=linki["UsuńWywołaniaPlików"](nazwa_rozdzialu);
nazwa_rozdzialu=linki["UsuńInterwiki"](nazwa_rozdzialu);
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"<[^<>]+>","");
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"'+","");
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"^[%s_]+","");
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"[%s_]+$","");
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"[%s_]+","_");
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"%[%[:?([^%[%]|]+)%]%]","%1");
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"%[%[:?([^%[%]|]+)|([^%[%]|]*)(.*)%]%]","%2");
local c=1;
for i=1,#tab_rozdzialy,1 do
if(tab_rozdzialy[i]==nazwa_rozdzialu)then
c=c+1;
end;
end;
if(c>1)then
nazwa_rozdzialu=nazwa_rozdzialu.."_"..c;
end;
table.insert(tab_rozdzialy,nazwa_rozdzialu);
if(id_rozdzialu==nazwa_rozdzialu)then
return ile;
end;
ile=ile+1;
end
end;
return nil;
end;
function p.TekstRozdzialu(tekst,id_rozdzialu1,id_rozdzialu2)
id_rozdzialu1,_=mw.ustring.gsub(id_rozdzialu1,"<[^<>]+>","");
id_rozdzialu1,_=mw.ustring.gsub(id_rozdzialu1,"'+","");
id_rozdzialu1,_=mw.ustring.gsub(id_rozdzialu1,"^[%s_]+","");
id_rozdzialu1,_=mw.ustring.gsub(id_rozdzialu1,"[%s_]+$","");
id_rozdzialu1,_=mw.ustring.gsub(id_rozdzialu1,"[%s_]+","_");
id_rozdzialu2,_=mw.ustring.gsub(id_rozdzialu2,"<[^<>]+>","");
id_rozdzialu2,_=mw.ustring.gsub(id_rozdzialu2,"'+","");
id_rozdzialu2,_=mw.ustring.gsub(id_rozdzialu2,"^[%s_]+","");
id_rozdzialu2,_=mw.ustring.gsub(id_rozdzialu2,"[%s_]+$","");
id_rozdzialu2,_=mw.ustring.gsub(id_rozdzialu2,"[%s_]+","_");
tekst,_=mw.ustring.gsub(tekst,"<[Nn][Oo][Ii][Nn][Cc][Ll][Uu][Dd][Ee]>(.-)</[Nn][Oo][Ii][Nn][Cc][Ll][Uu][Dd][Ee]>","");
tekst,_=mw.ustring.gsub(tekst,"<[Ii][Nn][Cc][Ll][Uu][Dd][Ee][Oo][Nn][Ll][Yy]>(.-)</[Ii][Nn][Cc][Ll][Uu][Dd][Ee][Oo][Nn][Ll][Yy]>","%1");
tekst,_=mw.ustring.gsub(tekst,"\n\n","\n \n");
tekst=p.WierszHNumer(tekst);
local iter=mw.ustring.gmatch(tekst,"([^\n]+)");
local tab_rozdzialy={};
local str=""
local nazwa_rozdzialu_aktualna;
local poziom_rozdzialu_aktualny;
for wiersz in iter do
local czy_naglowek,czy_naglowek_wiki=p.SprawdzCzyNaglowek(wiersz);
if(czy_naglowek)then
local nazwa_rozdzialu,poziom_rozdzialu;
if(czy_naglowek_wiki)then
nazwa_rozdzialu,poziom_rozdzialu=p.PodajRozdzial(wiersz);
else
nazwa_rozdzialu,poziom_rozdzialu=p.PodajRozdzialHNumer(wiersz);
end;
nazwa_rozdzialu=mw.getCurrentFrame():preprocess(nazwa_rozdzialu);
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"<[^<>]+>","");
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"'+","");
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"^[%s_]+","");
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"[%s_]+$","");
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"[%s_]+","_");
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"%[%[:?([^%[%]|]+)%]%]","%1");
nazwa_rozdzialu,_=mw.ustring.gsub(nazwa_rozdzialu,"%[%[:?([^%[%]|]+)|([^%[%]|]*)(.*)%]%]","%2");
local c=1;
for i=1,#tab_rozdzialy,1 do
if(tab_rozdzialy[i]==nazwa_rozdzialu)then
c=c+1;
end;
end;
if(c>1)then
nazwa_rozdzialu=nazwa_rozdzialu.."_"..c;
end;
table.insert(tab_rozdzialy,nazwa_rozdzialu);
if(((nazwa_rozdzialu_aktualna)and(nazwa_rozdzialu_aktualna==id_rozdzialu1))
and((((id_rozdzialu2=="")or(not id_rozdzialu2))and(poziom_rozdzialu<=poziom_rozdzialu_aktualny))or(nazwa_rozdzialu==id_rozdzialu2)))then
return str;
end;
if((id_rozdzialu1~="")and(nazwa_rozdzialu==id_rozdzialu1))then
nazwa_rozdzialu_aktualna=nazwa_rozdzialu;
poziom_rozdzialu_aktualny=poziom_rozdzialu;
str="";
elseif(id_rozdzialu1=="")then
nazwa_rozdzialu_aktualna="";
poziom_rozdzialu_aktualny=0;
if(id_rozdzialu2=="")then
return str;
elseif(nazwa_rozdzialu==id_rozdzialu2)then
return str;
else
str=(str~="")and (str.."\n"..wiersz) or wiersz;
end;
else
str=(str~="")and (str.."\n"..wiersz) or wiersz;
end;
else
str=(str~="")and (str.."\n"..wiersz) or wiersz;
end;
end;
if((id_rozdzialu1)and(id_rozdzialu1==""))then
return str;
elseif((nazwa_rozdzialu_aktualna)and(nazwa_rozdzialu_aktualna==id_rozdzialu1))then
return str;
end;
return "";
end;
p.kompletnosc={
["Kompletność"]=true,
["Kompletność junior"]=true,
["Kompletność krótka"]=true,
["Książka"]=true,
}
function p.IterTekst(tekst_rozwiniety_calego_artykulu,nazwa_przestrzeni,nazwa_ksiazki, czy_rozdzialy_analizowac)
local tekst=tekst_rozwiniety_calego_artykulu;
tekst,_=mw.ustring.gsub(tekst,"\n\n","\n \n");
local iter=mw.ustring.gmatch(tekst,"([^\n]+)");
local naglowek_aktualnego_rozdzialu;
local poziom_aktualnego_rozdzialu;
local poczatek_aktualnego_rozdzialu;
local czy_koniec=false;
local zaczynaj=nil;
local stronicowyparser_rozdzialy_modul=require("Module:StronicowyParser/Rozdziały");
local stronicowyparser_potrzebne_modul=require("Module:StronicowyParser/Potrzebne")
return function()
local str="";
local linia;
local czy_dalej=true;
local parser=p.ParserPodajRozdzialTekstowy();
for linia in iter do
local nazwa_rozdzialu;local poziom_rozdzialu;local poczatek_rozdzialu;
if(czy_rozdzialy_analizowac)then
nazwa_rozdzialu,poziom_rozdzialu,poczatek_rozdzialu,czy_dalej=parser(linia,nazwa_przestrzeni,nazwa_ksiazki);
else
nazwa_rozdzialu=nil;
end;
if((not nazwa_rozdzialu)and(czy_dalej))then
nazwa_rozdzialu=mw.ustring.match(linia,"^(=[^\n]+=)%s*$");
if(not nazwa_rozdzialu)then
if(not zaczynaj)then
function Wystepowanie(linia)
function RozwazajLinie(wystepowanie_linkow)
if(wystepowanie_linkow)then
local stronicowyparser_dalszefunkcje_modul=require("Module:StronicowyParser/DalszeFunkcje");
function __FUNKCJA(parametry)
local nazwa_szablonu=parametry[0];
local tab_kom=p.kompletnosc;
return tab_kom[nazwa_szablonu];
end;
local artykul,nazwa,link_szablon,id,kom=stronicowyparser_potrzebne_modul.AnalizujLinkSzablonyOrazLinki(wystepowanie_linkow,nazwa_przestrzeni,nazwa_ksiazki,__FUNKCJA);
if(not kom)then
if((artykul)and(not mw.ustring.match(artykul,"[Oo]kładka")))then
return 1;
end;
else
return 0;
end;
end;
end;
local function RozwazajObiekty(wystepowanie_linkow)
if(wystepowanie_linkow)then
local wystepowanie_linku_lub_szablonu=mw.ustring.match(wystepowanie_linkow,"^%s*(%[%[[^%[%]]+%]%])") or mw.ustring.match(wystepowanie_linkow,"^%s*{{[^{}]+}}")
if(not wystepowanie_linku_lub_szablonu)then return;end;
local tak=nil;
local iter=mw.ustring.gmatch(wystepowanie_linkow,"(%[%[([^%[%]]+)%]%])");
for poz in iter do
local wartosc=RozwazajLinie(poz);
if(not wartosc)then return;end;
tak=tak or (wartosc==1);
end;
local iter=mw.ustring.gmatch(wystepowanie_linkow,"({{[^{}]+}})")
for poz in iter do
local wartosc=RozwazajLinie(poz);
if(not wartosc)then return;end;
tak=tak or (wartosc==1);
end;
return tak;
end;
end;
local wystepowanie_linkow=mw.ustring.match(linia,"^[#:%*;%d%.]*%s*'*%s*(.+)$")
local tak=RozwazajObiekty(wystepowanie_linkow,pozostale);
if(tak)then
nazwa_rozdzialu="Spis treści";
poziom_rozdzialu=0;
str=((str~="")and (str.."\n"..linia) or linia);
zaczynaj=true;
else
nazwa_rozdzialu=nil;
end;
end;
Wystepowanie(linia);
end;
else
nazwa_rozdzialu,poziom_rozdzialu=p.PodajRozdzial(nazwa_rozdzialu);
zaczynaj=true;
end;
else
zaczynaj=true;
end;
if(nazwa_rozdzialu)then
if(not naglowek_aktualnego_rozdzialu)then
naglowek_aktualnego_rozdzialu=nazwa_rozdzialu;
poziom_aktualnego_rozdzialu=poziom_rozdzialu;
poczatek_aktualnego_rozdzialu=poczatek_rozdzialu;
else
----------------------------------------------
local naglowek_posredni_aktualnego_rozdzialu=naglowek_aktualnego_rozdzialu;
local poziom_posredni_aktualnego_rozdzialu=poziom_aktualnego_rozdzialu;
local poczatek_posredni_aktualnego_rozdzialu=poczatek_aktualnego_rozdzialu;
----------------------------------------------
naglowek_aktualnego_rozdzialu=nazwa_rozdzialu;
poziom_aktualnego_rozdzialu=poziom_rozdzialu;
poczatek_aktualnego_rozdzialu=poczatek_rozdzialu;
return naglowek_posredni_aktualnego_rozdzialu,str,poziom_posredni_aktualnego_rozdzialu,poczatek_posredni_aktualnego_rozdzialu;
end;
else
if(naglowek_aktualnego_rozdzialu)then
str=((str~="")and (str.."\n"..linia) or linia);
end;
end;
end;
if(czy_koniec)then return nil;end;
czy_koniec=true;
return naglowek_aktualnego_rozdzialu,str,poziom_aktualnego_rozdzialu,poczatek_aktualnego_rozdzialu;
end;
end;
return p;