Modul:Vorlog:Artikelfolge
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