gemeinsam neue Wege der Erkenntnis gehen
Eine freie Initiative von Menschen bei anthrowiki.at anthrowiki.at, anthro.world anthro.world, biodyn.wiki biodyn.wiki und steiner.wiki steiner.wiki
mit online Lesekreisen, Übungsgruppen, Vorträgen ...
Wie Sie die Entwicklung von AnthroWiki durch Ihre Spende unterstützen können, erfahren Sie hier.

Use Google Translate for a raw translation of our pages into more than 100 languages.
Please note that some mistranslations can occur due to machine translation.
Alle Banner auf einen Klick
Prof. Dr. David Martin - Künstliche Intelligenz und Robotik, 2026
Prof. Dr. David Martin - Künstliche Intelligenz und Robotik, 2026

Prof. Dr. David Martin - Künstliche Intelligenz und Robotik, 2026

Der neue Glomer Katalog 2025/26 ist da!

Aktuelle Neuerscheinungen und alle lieferbaren Bücher anthroposophischer Verlage
Anthroposophie, Waldorf, Jugend & Kinderbücher, Gesundheit, Lebensphasen, Wissenschaften mit mehr als 7.500 Titeln aus über 80 Verlagen.


Modul:Vorlage:Artikelfolge

Aus AnthroWiki

Die Dokumentation für dieses Modul kann unter Modul:Vorlage: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
	-- 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