Benutzer:Antonsusi/Spielwiese/Modul:Artikelfolge

aus Wikipedia, der freien Enzyklopädie

-- Benutzer:Antonsusi/Spielwiese/Artikelfolge/Schablone
-- Benutzer:Antonsusi/Spielwiese/Artikelfolge/Vorlage
-- Spezial:Vorlagen Expandieren
-- V-Spielwiese

--

local LuaWiki = require( "Module:LuaWiki" )

local function split_newlines(s,nobreak)
	local ts = {}
	local posa = 1
	while 1 do
		local pos, chars = s:match('()([\r\n].?)', posa)
		if pos then
			if chars == '\r\n' then pos = pos + 1 end
			local line = s:sub(posa, pos)
			if nobreak then
				line = line:sub(1,#line - 1)
			end
			ts[#ts+1] = line
			posa = pos + 1
		else
			local line = s:sub(posa)
			if line ~= '' then ts[#ts+1] = line end
			break
		end
	end
	return ts
end

local function splitaline(str)
	local Data = {}
	local pos = 0
	Data.Linkziel="";
	Data.Linktext="";
	Data.Extra1="";  -- enthaelt die Extraangabe in der Mitte, bei Personen oft eine Zeitspanne
	Data.Extra2="";
	Data.Extra3="";
	Data.Extra4="";
	Data.Extra5="";
	-- Der String soll die Form  "Linkziel[=Linktext=Extra1=Extra2=Extra3=Extra4=Extra5]" haben.
	-- Teile ab Linktext sind optional und bleiben ggf leer. Fehlende Abgaben kann man mit "" ueberspringen.
	-- Lange Form ohne For-Schleife
	-- Mindestlaenge sind zwei Zeichen z. B. "Ei", und es darf kein Code am Anfang sein ( "<", "{" oder "[" ).
	if mw.ustring.len(str)      < 2   then return false, Data; end 
	if mw.ustring.sub(str,1,1) == '<' then return false, Data; end 
	if mw.ustring.sub(str,1,1) == '[' then return false, Data; end 
	if mw.ustring.sub(str,1,1) == '{' then return false, Data; end 
	-- Ergaenze ein "=", um den letzten Teil leichter zu finden.
	str = str .. "=" ;
	-- Feld 1
	pos = mw.ustring.find(str,'=',1,true);
	if pos == 1 then -- Gleichheitszeichen am Anfang - Fehler
		return false, Data;
	end
	if not pos then -- Bereits am Stringende - Nur ein Linkziel
		Data.Linkziel = str;
		return true, Data;
	end
	Data.Linkziel = mw.ustring.sub(str,1,pos-1);
	-- Feld 2
	str = mw.ustring.sub(str,pos+1,   -1); -- kuerzen 
	pos = mw.ustring.find(str,'=',1,true); 
	if not pos then -- Kein weiteres "=", der Rest ist leer
		return true, Data;
	end
	-- Bei pos = 1 ist Feld 2 leer ("=="), einfach ueberspringen
	if pos  > 1 then --  Feld 2 nicht leer
		Data.Linktext = mw.ustring.sub(str,1,pos-1); 
	end
	-- Feld 3
	str = mw.ustring.sub(str,pos+1,   -1); -- kuerzen 
	pos = mw.ustring.find(str,'=',1,true);            
	if not pos then -- Kein weiteres "=", der Rest ist leer.
		return true, Data;
	end
	-- Bei pos = 1 ist Feld 3 leer ("=="), einfach ueberspringen
	if pos  > 1 then --  Feld 3 nicht leer
		Data.Extra1 = mw.ustring.sub(str,1,pos-1); 
	end
	-- Feld 4
	str = mw.ustring.sub(str,pos+1,   -1); -- kuerzen 
	pos = mw.ustring.find(str,'=',1,true); 
	if not pos then -- kein weiteres "=", der Rest ist leer.
		return true, Data;
	end
	-- Bei pos = 1 ist Feld 4 leer("=="), einfach ueberspringen
	if pos  > 1 then --  Feld 4 nicht leer
		Data.Extra2 = mw.ustring.sub(str,1,pos-1); 
	end
	-- Feld 5
	str = mw.ustring.sub(str,pos+1,   -1); -- kuerzen 
	pos = mw.ustring.find(str,'=',1,true); 
	if not pos then -- kein weiteres "=", der Rest ist leer.
		return true, Data;
	end
	-- Bei pos = 1 ist Feld 5 leer("=="), einfach ueberspringen
	if pos  > 1 then --  Feld 5 nicht leer
		Data.Extra3 = mw.ustring.sub(str,1,pos-1); 
	end
	-- Feld 6
	str = mw.ustring.sub(str,pos+1,   -1); -- kuerzen 
	pos = mw.ustring.find(str,'=',1,true); 
	if not pos then -- kein weiteres "=", der Rest ist leer.
		return true, Data;
	end
	-- Bei pos = 1 ist Feld 6 leer("=="), einfach ueberspringen
	if pos  > 1 then --  Feld 6 nicht leer
		Data.Extra4 = mw.ustring.sub(str,1,pos-1); 
	end
	-- Feld 7
	str = mw.ustring.sub(str,pos+1,   -1); -- kuerzen 
	pos = mw.ustring.find(str,'=',1,true); 
	if not pos then -- kein weiteres "=", der Rest ist leer.
		return true, Data;
	end
	-- Bei pos = 1 ist Feld 7 leer("=="), einfach ueberspringen
	if pos  > 1 then --  Feld 7 nicht leer
		Data.Extra5 = mw.ustring.sub(str,1,pos-1); 
	end
	return true, Data;
end

local p = {} 

function p.Run(frame)
	local FR = frame:getParent()
	local tbl = {};
	local isOk = true;
	local Daten = {}; -- nimmt die Teile einer Zeile auf
	local Lemma = {};
	local Link  = {};
	local Extra1 = {}; 
	local Extra2 = {}; 
	local Extra3 = {}; 
	local Extra4 = {}; 
	local Extra5 = {}; 
	local Tabelle = LuaWiki.transclude("Vorlage:Artikelfolge/Schablone" )
	local KopfL = FR.args['KopfL'] or "";
	local KopfR = FR.args['KopfR'] or "";
	local Titel = FR.args['Titel'] or "";
	local Seite = mw.title.getCurrentTitle();
	local Artikel = Seite.text;
	Tabelle=mw.ustring.gsub(Tabelle,"{Kopf_L}", KopfL);
	Tabelle=mw.ustring.gsub(Tabelle,"{Kopf_R}", KopfR);
	Tabelle=mw.ustring.gsub(Tabelle,"{Titel}", Titel);

	local pagename =FR.args['Liste'];
	if not pagename then return "FEHLER!" end
	local page = mw.title.new(pagename);
	local Prev = "";
	local Next = "";
	local Current = "";
	local Text = page:getContent();
	
	local a, b = mw.ustring.find(Text,'<onlyinclude>')
	if b then
		Text  =  mw.ustring.sub(Text,b+1);
	end
	a, b = mw.ustring.find(Text,'</onlyinclude>')
	if b then
		Text = mw.ustring.sub(Text,1,a-1);
	end
	tbl = split_newlines(Text,true);
	local idx = 0  -- korrekte Zeilen
	for i,Zeile in ipairs(tbl) do
		isOk, Daten  = splitaline(Zeile)

		Lemma[idx] = Daten.Linkziel;
		if  Daten.Linkziel ==  Daten.Linktext or Daten.Linktext=="" then
			Link[idx] = "[[" .. Daten.Linkziel .. "]]";
		else
			Link[idx] = "[[" .. Daten.Linkziel .."|" .. Daten.Linktext .."]]";
		end
		Extra1[idx] = Daten.Extra1;
		Extra2[idx] = Daten.Extra2;
		Extra3[idx] = Daten.Extra3;
		Extra4[idx] = Daten.Extra4;
		Extra5[idx] = Daten.Extra5;
		idx=idx+1 ;
	end
	local found = false;
	for idx, txt in ipairs(Lemma) do
		if txt == Artikel then
			Tabelle=mw.ustring.gsub(Tabelle,"{Extra1}", Extra1[idx]);
			Tabelle=mw.ustring.gsub(Tabelle,"{Extra2}", Extra2[idx]);
			Tabelle=mw.ustring.gsub(Tabelle,"{Extra3}", Extra3[idx]);
			Tabelle=mw.ustring.gsub(Tabelle,"{Extra4}", Extra4[idx]);
			Tabelle=mw.ustring.gsub(Tabelle,"{Extra5}", Extra5[idx]);
		    if idx > 1 then
		    	Prev =  Link[idx-1];
		    else
		    	Prev =  "";
		    end
			Current = Link[idx] or "";
		    if idx < #Link-1 then
		    	Next =  Link[idx+1];
		    else
		    	Next =  "";
		    end
			Tabelle=mw.ustring.gsub(Tabelle,'{Prev}', Prev);
			Tabelle=mw.ustring.gsub(Tabelle,'{Current}', Current);
			Tabelle=mw.ustring.gsub(Tabelle,'{Next}', Next);
			found = true;
		end
	end
	if found then
		return Tabelle;
	else 
		return '<span class="error">[[Vorlage:Artikelfolge]]: Lemma nicht auf der Liste!</span>'
	end
end

return p
--