Vorlagenprogrammierung Diskussionen Lua Unterseiten
Modul Deutsch English

Modul: Dokumentation

Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus

Die Funktion Run liest den Inhalt von Vorlage:Artikelfolge/Schablone aus und ersetzt die dort enthaltenen Platzhalter durch die an die Funktion übergebene Parameter. Rückgabe ist die fertige Tabelle. Siehe dazu auch Vorlage:Artikelfolge/Doku.


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
	-- Der String soll die Form  "Linkziel[=Linktext=Extra1=Extra2]" 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: Linkziel
	pos = mw.ustring.find(str,'=',1,true);
	if pos == 1 then -- "=" am Anfang: Pflichtfeld 1 ist leer - Fehler
		return false, Data;
	end
	Data.Linkziel = mw.ustring.sub(str,1,pos-1);
	str = mw.ustring.sub(str, pos+1, -1); -- gelesene Zeichen wegkuerzen 

	-- Feld 2: Linktext
	pos = mw.ustring.find(str,'=',1,true); 
	if not pos then -- Kein weiteres "=", der Rest ist leer
		Data.Linktext = "";
		return true, Data;
	end
	if pos == 1 then -- Bei pos == 1 ist Feld 2 leer ("==")
		Data.Linktext = "";
	elseif pos  > 1 then --  Feld 2 nicht leer
		Data.Linktext = mw.ustring.sub(str,1,pos-1); 
	end
	str = mw.ustring.sub(str, pos+1, -1); -- gelesene Zeichen wegkuerzen

	-- Feld 3: Extra1
	pos = mw.ustring.find(str,'=',1,true);            
	if not pos then -- Kein weiteres "=", der Rest ist leer.
		return true, Data;
	end
	if pos == 1 then  -- Feld 3 ist leer ("==")
		Data.Extra1 = "";
	elseif pos  > 1 then --  Feld 3 nicht leer
		Data.Extra1 = mw.ustring.sub(str,1,pos-1); 
	end
	str = mw.ustring.sub(str, pos+1, -1); -- gelesene Zeichen wegkuerzen
	
	-- Feld 4: Extra2
	pos = mw.ustring.find(str,'=',1,true); 
	if not pos then -- kein weiteres "=", der Rest ist leer.
		return true, Data;
	end
	if pos == 1 then  -- Feld 4 ist leer ("==")
		Data.Extra2 = "";
	elseif pos  > 1 then --  Feld 4 nicht leer
		Data.Extra2 = 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 Linktext = {}; -- nimmt alle Linktexte der Liste auf
	local Link  = {}; -- nimmt alle Links 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 Titel ~= "" and Subtitel  ~= "" then
		Subtitel = '<br />' .. Subtitel;
	end
	-- Erstelle mit den Konstanten die obere Zeile
	Tabelle=mw.ustring.gsub(Tabelle,"{Titel}", Titel);
	Tabelle=mw.ustring.gsub(Tabelle,"{Subtitel}", Subtitel);
	Tabelle=mw.ustring.gsub(Tabelle,"{Kopf_L}", KopfL);
	Tabelle=mw.ustring.gsub(Tabelle,"{Kopf_R}", KopfR);
	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 -- Doppelte eckige Klammern wieder entfernen
				Link[idx] =  mw.ustring.sub(Lemma[idx],2,-2);
			else
				if Daten.Linktext=="" then
					Daten.Linktext = Daten.Linkziel;
				end
				if  Daten.Linkziel ==  Daten.Linktext  then
					Link[idx] = "[[" .. Daten.Linkziel .. "]]";
				else
					Link[idx] = "[[" .. Daten.Linkziel .."|" .. Daten.Linktext .."]]";
				end
			end
			-- Zeilenumbrüche ermitteln
			if Daten.Linktext ~= "" and Daten.Extra1 ~= "" then
				Daten.Extra1 = "<br />" .. Daten.Extra1;
			end
			if Daten.Extra1 ~= "" and Daten.Extra2 ~= "" then
				Daten.Extra2 = "<br />" .. Daten.Extra2;
			end
			Linktext[idx] = Daten.Linktext;
			Extra1[idx] = Daten.Extra1;
			Extra2[idx] = Daten.Extra2;
			idx=idx+1 ;
		end
	end
	local found = false;
	for idx, txt in ipairs(Lemma) do
		if txt == Artikel then
			Tabelle=mw.ustring.gsub(Tabelle,"{Linktext}", Linktext[idx]);
			Tabelle=mw.ustring.gsub(Tabelle,"{Extra1}", Extra1[idx]);
			Tabelle=mw.ustring.gsub(Tabelle,"{Extra2}", Extra2[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

-- Funktion Checklist: Wiedergabe der Linkziele
function p.Checklist(frame)
	local FR = frame:getParent()
	local tbl = {};
	local isOk = true;
	local Daten = {}; -- nimmt die Teile der in Bearbeitung befindlichen Zeile auf
	local Linkziel; -- der aktuelle Listeneintrag
	local page = mw.title.getCurrentTitle() 
	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.remove (tbl,1); -- Zeile mit <onlyinclude> entfernen
	table.remove (tbl); -- Letzte Zeile mit </onlyinclude> entfernen
	local Ausgabe="<hr />\n<ul>\n" 
	local Seite;
	for i,Zeile in ipairs(tbl) do
		isOk, Daten  = splitaline(Zeile);
		if isOk then
			Linkziel = Daten.Linkziel;
			if mw.ustring.sub(Linkziel,1,1) == '"' then 
				Ausgabe = Ausgabe ..'<li>'  .. Linkziel .. '</li>\n';
			else
				Linkziel = "[[" .. Daten.Linkziel .. "]]";				
				Ausgabe = Ausgabe ..'<li>'  .. Linkziel .. '</li>\n';
			end
		else
			if mw.ustring.sub(Zeile,1,4) == '<!--' then
				Ausgabe = Ausgabe ..'<li><b>Kommentarzeile</b></li>\n';
			else
				Ausgabe = Ausgabe ..'<li class="error">Fehlerhafte Zeile!</li>\n';
			end
		end
	end
	Ausgabe = Ausgabe ..'</ul>\n';
	return 	Ausgabe;
end

return p