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