Modul:Vorlog:Artikelfolge

Aus Wikipedia

Die Dokumentation für dieses Modul kann unter Modul:Vorlog:Artikelfolge/Doku erstellt werden

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

-- splitaline: Auftrennen einer Textzeile an den Stellen mit einem '=' 
local function splitaline(str)
	local Data = {}
	local pos = 0
	Data.Linkziel="";
	Data.Linktext="";
	Data.Extra1="";  -- enthaelt die erste Extraangabe in der Mitte, bei Personen oft eine Zeitspanne
	Data.Extra2="";  -- enthaelt die zweite Extraangabe in der Mitte, bei Personen oft eine Zeitspanne
	Data.Extra3="";  -- noch nicht implementiert
	Data.Extra4="";  -- noch nicht implementiert
	Data.Extra5="";  -- noch nicht implementiert
	-- 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 der in Bearbeitung befindlichen Zeile auf
	local Lemma = {}; -- nimmt alle Lemmata der Liste auf
	local Link  = {}; -- nimmt alle Linktexte der Liste auf.
	local Extra1 = {}; -- nimmt alle "Extra1" der Liste auf.
	local Extra2 = {}; -- nimmt alle "Extra2" der Liste auf.
	local Extra3 = {}; -- nimmt alle "Extra3" der Liste auf.
	local Extra4 = {}; -- nimmt alle "Extra4" der Liste auf.
	local Extra5 = {}; -- nimmt alle "Extra5" der Liste auf.
	local Schablone = FR.args['Schabone'] or "";  -- die Quelltextvorlage der Leiste
	if Schablone == "" then Schablone = "Vorlage:Artikelfolge/Schablone"; end
	local Tabelle  = LuaWiki.transclude(Schablone) -- Vorlage ggf. expandieren.
	local KopfL    = FR.args['KopfL'] or ""; -- konstanterText oben links
	local KopfR    = FR.args['KopfR'] or ""; -- konstanter Text oben rechts
	local Titel    = FR.args['Titel'] or ""; -- konstanter Titel oben mittig
	local Subtitel = FR.args['Subtitel'] or ""; -- wenn der Text unter dem Titel konstant ist.
	local Seite = mw.title.getCurrentTitle();
	local Artikel = Seite.text;
	if KopfL == "" then KopfL = "davor"; end
	if KopfR == "" then KopfR = "danach"; end
	-- if Subtitel ~= "" then Subtitel = Subtitel ..'<br />';
	Tabelle=mw.ustring.gsub(Tabelle,"{Subtitel}", Subtitel);
	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);
	table.insert (tbl, 1, '""')  -- 2017-11-03: Repairing a bug. Inserting an empty string as first element.
	table.insert (tbl, '""') 
	local idx = 0  -- korrekte Zeilen
	for i,Zeile in ipairs(tbl) do
		isOk, Daten  = splitaline(Zeile)
		if isOk then
			Lemma[idx] = Daten.Linkziel;
			-- Eine mit " beginnende Zeile kennzeichnet Text ohne Link, z. B. "-" an den Enden. Nur bei Prev oder Next erlaubt
			if mw.ustring.sub(Lemma[idx],1,1) == '"' then
				Link[idx] =  mw.ustring.sub(Lemma[idx],2,-2);
			else
				if  Daten.Linkziel ==  Daten.Linktext or Daten.Linktext=="" then
					Link[idx] = "[[" .. Daten.Linkziel .. "]]";
				else
					Link[idx] = "[[" .. Daten.Linkziel .."|" .. Daten.Linktext .."]]";
				end
			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
	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 "";  zurzeit nicht in der Schablone
		    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); zurzeit nicht in der Schablone
			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