User:Lilyuserin/Lua/Modul:Dokumentation
< User:Lilyuserin | Lua
local p = {} -- p stands for package
local ruler = '<hr style="background-color:#b3b7ff; clear:both; height:.7ex; margin:1em 0;" />'
local template = mw.site.namespaces.Template.name .. ':'
local anzeige='<div style="background-color: #aaa;width:90%; border-radius: 1em; box-shadow: 0.1em 0.1em 0.5em rgba(0,0,0,0.75);;padding:0.5em;"><div style="background-color: #fff;padding:1em; border-radius: 0.5em;"><code style="white-space:pre-wrap">{{msgnw:'
function p.doc(frame)
-- dieser Modul ersetzt die Vorlage documentation
-- und ist abwärtskompatibel, d.h. alte bestehende Dokumentationsseiten werden eingebunden
-- wenn die Dokumentationsunterseite existiert, wird sie eingebunden
-- wenn nicht, wird ein Hinweis mit entsprechender Input-Box erzeugt
local doc = frame.args.doc or 'doc' --- Möglichkeit die Dokumentationsunterseite anders zu benennen
local preload = frame.args.preload or template .. 'Documentation/preload-doc'
local vorlage = frame.args.vorlage or mw.title.getCurrentTitle().rootText
local cat = frame.args.cat or frame.args.kat or frame.args.kategorie or 'Vorlagen'
local nocat = frame.args.nocat or frame.args.nokat or frame.args.keinekat
local hidden = not(frame.args.show or frame.args.zeigen) -- Vorlage ist verborgen
local _vorlage = template .. vorlage
local dok = vorlage .. '/' .. doc -- Name ohne Namespace
local _doc = template .. dok -- mit Namespaceprefix
local _, mycat, result = '', '', ''
local verborgen = (hidden and '<div>Die Vorlage <code style="background-color:yellow;padding:0 0.5em">' .. vorlage .. '</code> ist nur auf eingebundenen Seiten voll sichtbar und auf dieser Seite versteckt.</div>' ) or ''
local duhast = 'Du hast dieVorlagendokumentation mit dem Befehl <code">{{#invoke:Dok|doc}}</code> eingebunden '
local diedokumentationsunterseite = '<div class="messagebox" style="margin-top:1em; clear: both; border: 2px dotted #666666; padding: 0.6em; background-color: #ccffff; text-align: center; ">Die Dokumentationsunterseite <code>{{[[' .. _doc .. '|' .. dok..']]}}</code> ist nicht vorhanden.</div>'
local damitdie = 'Damit die Dokumentation wie vorgesehen funktioniert, ist es erforderlich, dass du für deine Vorlage <code>{{[[' .. _vorlage .. '|' .. vorlage .. ']]}}</code> die Unterseite <code>{{[[' .. _doc .. '|' .. dok..']]}}</code> anlegst, das kannst du mit der Box unterhalb dieses Text durchführen, es wird eine vorausgefüllte Seite basierend auf der Seite <code>{{[[' .. preload .. ']]}}</code> erzeugt. Eine leere Seite kannst du mit dem Link anlegen.\n\n'
local input = '<div style="float:left" class="neu"><inputbox>\ntype=create\nbreak=no\nwidth=40em\nbuttonlabel=Dokumentationsunterseite anlegen\ndefault=' .. _doc .. '\npreload=' .. preload .. '\n</inputbox></div><div style="clear:both;"></div>'
local inputbox = frame:preprocess('\n\n' .. input)
local subpages = frame:preprocess('\n==Eine Liste der bereits vorhandenen Unterseiten==\n{{:Special:PrefixIndex/Template:' .. vorlage .. '/}}')
local docu_info = '{| class="plainlinks" id="Dokumentation.Info" style="border-collapse:collapse; margin:2px 0;"\n' .. '| class="noviewer" style="padding:5px; vertical-align:top; width:40px;" | [[Datei:Info-Icon.png|30px]]\n' .. '| style="padding:0; width:100%;" |<ul>' .. '{{Special:PrefixIndex/Template:' .. vorlage .. '/}}'
if p.gibts(dok) then -- Unterseite doc gibts
local doku, layout, bearbeiten
local linkliste = frame:preprocess('[{{fullurl:Spezial:Linkliste/Template:' .. vorlage .. '|hideredirs=1&hidelinks=1}} Verwendungen]') .. ' dieser Vorlage'
local Unterseiten = frame:preprocess('[[Special:Prefixindex/' .. _vorlage .. '/|Liste der Unterseiten]]')
doku = frame:expandTemplate{ title = _doc, args = {} }
layout = p.layout(frame)
bearbeiten = p.bearbeiten(_vorlage)
-- Link zu Verwendungen der Vorlage und Unterseiten (Parameter zum Einbinden vorsehen?)
local docu_info = ruler .. '\n{| class="plainlinks" id="Dokumentation.Info" style="border-collapse:collapse; margin:2px 0;"\n' .. '| class="noviewer" style="padding:5px; vertical-align:top; width:40px;" | [[Datei:Info-Icon.png|30px]]\n' .. '| style="padding:0; width:100%;" |<ul><li>' .. Unterseiten .. '</li><li>Diese Dokumentation befindet sich [[' .. _doc .. '|auf einer eingebundenen Unterseite]] <span style="font-size:85%; margin-left:1em;">[[' .. tostring(mw.uri.fullUrl( _doc, 'action=edit')) .. ' Bearbeiten]]</span>.</li><li>' .. linkliste .. '</li></ul>\n|}'
result = bearbeiten .. verborgen .. ruler .. layout .. doku .. docu_info
else
local ShowMe = frame:preprocess('\n==Vorlageninhalt==\n' .. anzeige .. vorlage .. '}}</code></div></div>')
result = duhast .. diedokumentationsunterseite .. damitdie .. inputbox .. ShowMe .. subpages
end -- Unterseite doc gibts
-- Kategorisieren
if not nocat then -- die Vorlage soll kategorisiert werden
mycat = '[[category:' .. cat ..']]'
end
return result .. mycat
end
function p.bearbeiten(vorlage)
-- dieser Modul erzeugt ein Kästchen mit punktiertem Rahmen
-- mit Links zu verschiedenen Anzeigemöglichkeiten der Vorlage, bearbeiten, Versionsgeschichte etc.
local frame = mw.getCurrentFrame()
local _vorlage = vorlage
local divspan = '<div style="margin: 0.5em;border: 2px dotted #666666; padding: 0.5em;display:inline-block"><span class="mw-editsection plainlinks" style="padding:0em 1em 0em 0em;" >'
local edit = mw.uri.fullUrl( _vorlage, 'action=edit' )
local history = mw.uri.fullUrl( _vorlage, 'action=history' )
local purge = mw.uri.fullUrl( _vorlage, 'action=purge' )
local qqx = mw.uri.fullUrl( _vorlage, 'uselang=qqx' )
local info = mw.uri.fullUrl( _vorlage, 'uselang=info' )
local result = '[' .. tostring(edit) .. ' Bearbeiten] · [' .. tostring(history) .. ' Versionen] · [' .. tostring(purge) .. ' Cache leeren] · [' .. tostring(qqx) .. ' Messages] · [' .. tostring(info) .. ' Seiteninformation]'
result = divspan .. result .. '</span></div>\n'
return result
end
function p.layout(frame)
-- dieser Modul erzeugt das blaue Hinweiskästchen mit der Überschrift "Vorlagendokumentation"
-- dem Hinweisicon File:Template-info.png
-- und den Links zum Bearbeiten der Dokumentationsunterseite
local frame = mw.getCurrentFrame()
local vorlage = frame.args.vorlage or mw.title.getCurrentTitle().rootText
local doc = frame.args.doc or 'doc' --- Möglichkeit die Dokumentationsunterseite umzubenennen
local _vorlage = template .. vorlage
local dok = vorlage .. '/' .. doc -- Name ohne Namespace
local _doc = template .. dok -- mit Namespaceprefix
local divspan = '<div style="margin:1em; clear: both; border: 2px dotted #666666; padding: 0.6em; background-color:#ccffff;"><div style="padding-bottom:3px; border-bottom:1px solid #aaa; margin-bottom:1em;"><span style="font-size:150%">[[File:Template-info.png|50px]] Vorlagendokumentation</span><span class="mw-editsection plainlinks">'
local edit = mw.uri.fullUrl( _doc, 'action=edit' )
local history = mw.uri.fullUrl( _doc, 'action=history' )
local purge = mw.uri.fullUrl( _doc, 'action=purge' )
local info = mw.uri.fullUrl( _doc, 'action=info' )
local result = ' [' .. tostring(edit) .. ' Bearbeiten] · [' .. tostring(history) .. ' Versionen] · [' .. tostring(purge) .. ' Cache leeren] · [' .. tostring(info) .. ' Seiteninformation]'
result = divspan .. result .. '</span></div>\n\n'
local small = "''<small>Diese [[Template:Vorlagendokumentation|Vorlagendokumentation]] wird von der Seite [[" .. _doc .. "]] eingebunden.</small>''</div>"
return result .. small
end
function p.ptab(frame)
-- erstellen der Parametertabelle einer Vorlage
-- einziger Unterschied zum Unterprogramm: das 2. Ergebnis wird verworfen
local _
_ = p.tabelle(frame)
return _
end
function p.dokuseite(frame)
-- dieser Modul wird in die Dokumentationsunterseite eingebunden
-- aber nicht in die Vorlage inkludiert
-- erzeugt einen Link zur Vorlage und ein Bearbeiten-Kästchen
local _vorlage = frame.args.vorlage or mw.title.getCurrentTitle().rootText
local vorlage = 'Template:' .. _vorlage
local dok = frame.args.dok or 'doc'
local _dok = vorlage .. '/' .. dok
local rohhtml = '<table style="border-style:solid; margin-bottom:2px; margin-top:2px; border-color:MediumSlateBlue"><tr><td>[[File:Info-Icon.png|30px]]</td><td style="width: 100%;">Diese Seite ist die Dokumentations-Unterseite der [[' .. vorlage .. '|<b>Vorlage ' .. _vorlage .. '</b>]]</td></tr></table>'
local divspan = '<div style="margin-bottom: 0.5em;border: 2px dotted #666666; padding: 0.5em;display:inline-block"><span class="mw-editsection plainlinks" style="padding:0em 1em 0em 0em;" >'
local edit = mw.uri.fullUrl( _dok, 'action=edit' )
local history = mw.uri.fullUrl( _dok, 'action=history' )
local purge = mw.uri.fullUrl( _dok, 'action=purge' )
local qqx = mw.uri.fullUrl( _dok, 'uselang=qqx' )
local info = mw.uri.fullUrl( _dok, 'action=info' )
local editv = mw.uri.fullUrl( vorlage, 'action=edit' )
local infov = mw.uri.fullUrl( vorlage, 'action=info' )
local result = '[' .. tostring(edit) .. ' Bearbeiten] · [' .. tostring(history) .. ' Versionen] · [' .. tostring(purge) .. ' Cache leeren] · [' .. tostring(qqx) .. ' Messages] · [' .. tostring(info) .. ' Seiteninformation] · [' .. tostring(editv) .. ' Vorlage bearbeiten] · [' .. tostring(infov) .. ' Seiteninformation Vorlage]'
result = divspan .. result .. '</span></div>\n'
return result .. rohhtml
end
function p.doku(frame)
-- dieser Modul konstruiert die Dokumentationsunterseite vorlage/doc
-- Parameter mit Voreinstellungen
local count = frame.args.count or 0
local vorlage = frame.args.vorlage or mw.title.getCurrentTitle().rootText
local erzeugt = frame.args.text or "erzeugt etwas Tolles, sonst gäbe es sie nicht."
local rubrik = frame.args.rubrik or "AlleListen"
local trnzn = frame.args.trennzeichen or '%,%;' -- Trennzeichenliste für die Verwendungsbeispiele
local klappbar = frame.args.klappbar
local geklappt = frame.args.geklappt
-- Parameter ohne Voreinstellungen, werden nur schlagend, wenn sie angegeben werden
local expand = not frame.args.noexpand -- wenn das Expandieren unterdrückt werden soll, diesen Parameter angeben, Inhalt (derzeit) egal
local render = not frame.args.norender -- wenn das Rendern unterdrückt werden soll, z.B. wegen unerwünschter Kategorisierung
-- Variablen für Formatierung
local div_blue = '<div style="width:100%;margin-top:1em; clear: both; border: 2px solid blue; padding: 0.6em">'
local div_inlineblock = '<div><div style="display:inline-block;background:#acf;color:black;padding: 0.1em 0.8em;width:auto">'
local div_dotted = '</div></div><div style="width:95%;margin-top:1em; clear: both; border: 2px dotted #666666; padding: 0.6em">'
local ergibt_gerendert = div_inlineblock .. 'ergibt gerendert:' .. div_dotted
local ergibt_expandiert = div_inlineblock .. 'ergibt expandiert:' .. div_dotted
-- zusammengesetzte Texte
local tl = '<span style="font-family:"Consolas", monospace;">{{[[Vorlage:' .. vorlage .. '|' .. vorlage .. ']]' .. '}}</span> '
local diese_vorlage='Die Vorlage ' .. tl .. erzeugt
local _vorlage = '{{' .. vorlage -- Vorlage mit geschweiften Klammern zu Beginn
local _vorlage_ = _vorlage .. '}}' -- Vorlage von geschweiften Klammern umschlossen
-- lokale Parameter
local vorlagenliste, i, template,ShowMe = ''
local parametertabelle, muster, anw0, kopiervorlage = '', '', '', ''
local expanded, rendered
-- wenn die zu dokumentierende Vorlage nicht existiert, dann Programm beenden
if not p.gibts(vorlage) then return "Die Vorlage " .. vorlage .. " existiert nicht" end
ShowMe = frame:preprocess('\n==Code==\n' .. anzeige .. vorlage .. '}}</code></div></div>') -- Vorlageninhalt anzeigen
if p.gibts(rubrik) then vorlagenliste = '<div>' .. frame:expandTemplate{ title = rubrik, args = { } } .. '</div>' end
--erster Abschnitt, Beschreibung der Funktion der Vorlage
local vorlagen_intro = diese_vorlage .. vorlagenliste
--Parameterliste abarbeiten
parametertabelle, kopiervorlage = p.tabelle()
parametertabelle = frame:preprocess('\n==Parameter==\n') .. parametertabelle
kopiervorlage = frame:preprocess('\n==Kopiervorlage==\n<code>') .. _vorlage .. kopiervorlage .. "}}</code>" -- Kopiervorlage zur Dokumentationsanwendung mit Auflistung aller Parameter
-- Vorlagenanwendung mit Defaulteinstellungen
anw0 = frame:preprocess('\n==Anwendung==\n') .. p.anwendung(_vorlage_,render,expand,klappbar, geklappt)
-- Anwendungsbeispiele
-- alle Parameterwerte mit Beistrich oder Strichpunkt getrennt
-- wie im Vorlagenaufruf, nur mit einem anderen Trennzeichen
for i=1,10 do -- mehr als 10 Anwendungsbeispiele werden kaum sinnvoll sein
local u, liste, expd, rndr, ergibt, anwendung = frame.args["aw" .. i], '', '', '', ''
local diese_anwendung
if u and u~="" then -- Anwendungsbeispiel mit Index i gefunden
--liste = p.split(u) or {}
--argtab = p.zuweisen(paramlist,liste) obsolet
liste = '|' .. string.gsub(u, '[' .. trnzn .. ']','|') .. '}}' -- Trennzeichen in senkrechte Striche umwandeln, default ist ',' oder ';', als Pattern %,%;
diese_anwendung = _vorlage .. liste
anwendung = p.anwendung(diese_anwendung,render,expand,klappbar, geklappt)
muster = muster .. anwendung
-- if 1 then return '<code><nowiki>anwendung ' .. anwendung .. '</nowiki></code>' end
end -- u and u~=""
end -- for i=1,10 do
return vorlagen_intro .. parametertabelle .. kopiervorlage .. anw0 .. muster .. ShowMe --vorlagen_intro .. parm_table .. anw0
end
function p.anwendung(vorlage,render,expand,klappbar, geklappt)
-- dieser Modul wertet die Vorlage "vorlage" aus
-- der Parameter vorlage enthält den kompletten Aufruftext inklusiver sämtlicher Parameter
-- wie er in einer Wikiseite normalerweise auftritt
-- z.B. {{vorlagenname|parameter1=wert1|parameter2=wert2|...}}
-- das Ergebnis der ausgewerteten Vorlage wird in der lokalen Variablen "processed" gespeichert
-- anschließend werden alle Wikicode-Zeichen mittels mw.text.nowiki in HTML-Entitäten umgewandelt und in der Variablen "expanded" gespeichert
-- https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#mw.text.nowiki
-- folgende Zeichen: '"', '&', "'", '<', '=', '>', '[', ']', '{', '|', '}'
-- weitere Ersetzungen siehe Manual
-- render und expand steuern, ob das Ergebnis der Vorlagenauswertung als expandierter Wikitext und als Vorlageneinbindung angezeigt werden soll
-- klappbar und geklappt erzeugen einklappbare Abschnitte
-- Rückgabewert: ausgewertete Vorlage:
local frame = mw.getCurrentFrame()
local processed, class = frame:preprocess(vorlage), '>'
local expanded, gerendert, _ = '', '', ''
if klappbar or geklappt then
if klappbar then class= class .. ' class =" mw-collapsible' end
if geklappt then class = class .. ' class =" mw-collapsible mw-collapsed' end
class = class .. '">'
end
-- Variablen für die Formatierung
local div_blue = '<div style="width:100%;margin-top:1em; clear: both; border: 2px solid blue; padding: 0.6em"><code>' .. vorlage .. '</code>'
local div_inlineblock = '<div><div style="display:inline-block;background:#acf;color:black;padding: 0.1em 0.8em;width:auto">'
local div_dotted = '<div style="width:95%;margin-top:1em; clear: both; border: 2px dotted #666666; padding: 0.6em "'
local ergibt_gerendert = 'gerendert:' .. '</div></div>' .. div_dotted .. '>'
local ergibt_expandiert = div_inlineblock .. 'ergibt expandiert:' .. '</div></div>' .. div_dotted .. class
if not expand then
ergibt_gerendert= 'ergibt ' .. ergibt_gerendert
end
ergibt_gerendert= div_inlineblock .. ergibt_gerendert
expanded = '<code style="white-space: pre-wrap;">' .. mw.text.nowiki(processed) .. '</code></div>'
gerendert = processed .. '</div>'
if expand then _ = ergibt_expandiert .. expanded end
if render then _ = _ .. ergibt_gerendert .. gerendert end
return div_blue .. _ .. '</div>' --'ergibt gerendert:' .. ergibt_gerendert
end
function p.tabelle(frame)
-- dieser Modul erzeugt eine Tabelle mit den Parameterwerten
-- zu jedem Parameter sollte ein Beschreibungstext angegeben werden
-- es können beliebig viele Parameter eingetragen werden: count
-- als zweiter Rückgabewert wird eine Kopiervorlage mit einer Liste aller vorhandenen Parameter übermittelt
-- weiters kann die Breite der Tabelle sowie der Spalten geändert werden
local pframe, xxx, parm_table = mw.getCurrentFrame(), '', '' --:getParent()
local count = pframe.args.count or 0
local tabwidth = pframe.args.tabwidth -- ändern der Breiteneinstellungen
local descwidth = pframe.args.descwidth
local namewidth = pframe.args.parmwidth
local defwidth = pframe.args.defwidth
local mandwidth = pframe.args.mandwidth
-- Konstante für Formatierung
local table_header = '<table style="width:80%;margin-left: 0;border: 0px;border-bottom: 1px solid #666;border-collapse: collapse;text-align: left;padding: 0.5em 0 0 0;box-shadow: 4px 4px 4px #ccc;"><caption style="background-color:#666; border-radius: 1em 1em 0 0;color:#666;font-family: serif;font-size: 0.4em;border:1px solid #666;padding: 0.5em 0 0 0;>x</caption><tr style="background-color: #666;color: #fff;font-size:1.2em;font-family: serif;border:1px solid #666e;padding: 0.5em 0 0 0;"><th style="width:14%;padding-left:0.5em">Name</th><th style="width:50%;" colspan="2">Beschreibung</th><th style="width:25%">Standard</th><th style="width:16%">Status</th></tr>'
local table_end ='</table>'
-- Änderungen der Tabellenbreite für die Parameterliste
if tabwidth then table_header = table_header:gsub('width:80%%', 'yidth:' .. p.string2pattern(tabwidth),1) end
if descwidth then table_header = table_header:gsub('width:50%%', 'yidth:' .. p.string2pattern(descwidth),1) end
if namewidth then table_header = table_header:gsub('width:14%%', 'yidth:' .. p.string2pattern(namewidth),1) end
if defwidth then table_header = table_header:gsub('width:25%%', 'yidth:' .. p.string2pattern(defwidth),1) end
if mandwidth then table_header = table_header:gsub('width:16%%', 'yidth:' .. p.string2pattern(mandwidth),1) end
table_header = table_header:gsub('yidth:', 'width:')
--Parameterliste abarbeiten
for i = 1,count do
local _, u, j, x, desc, def, mand, fort
j = tostring(i)
x = pframe.args["p" .. j]
if x and x ~= '' then -- es gibt einen Eintrag pi
desc = pframe.args["desc" .. j] or pframe.args["t" .. j] or 'Beschreibung fehlt' -- Parameterbeschreibung
def = pframe.args["def" .. j] or pframe.args["d" .. j] or 'leer' -- Standardeinstellung
mand = pframe.args["mdt" .. j] or pframe.args["m" .. j] -- verpflichtende Eingabe ja/nein
fort = pframe.args["fort" .. j] or pframe.args["f" .. j] -- Fortsetzungszeile der Beschreibung
gort = pframe.args["gort" .. j] or pframe.args["g" .. j] -- Fortsetzungszeile der Beschreibung
zeile = p.zeile(x, desc, def, mand, fort, gort)
parm_table = parm_table .. zeile
xxx = xxx .. '|' .. x .. '=<br>'
end
end -- for i = 1,count do
if count == 0 or count == "0" then -- Abschnitt Parametertabelle fertigstellen
parm_table ='<div style=\"font-weight:bold\">keine</div>'
else
parm_table = table_header .. parm_table .. table_end
end
return parm_table, xxx
end
function p.gibts(name, namespace)
local name = name
local space = namespace or "template"
local titel = space .. ":" .. name
if mw.title.new(titel).exists then return true end
return false
end
function p.string2pattern(str)
return string.gsub(str, "%%", "%%%%")
end
function p.zeile(pname, beschreibung, default, optional,fort,gort)
-- erzeugt eine Tabellenzeile für die Parameterliste
local _ = ""
local pname = pname
local beschreibung = beschreibung
local default = default or "leer"
local optional = optional
if optional == nil or optional=="" then optional="optional" else optional="erforderlich" end
local teil1 = [[<tr style="background-image: linear-gradient(#f9f9f9, #e3e3e3); border:none; border-left: 1px solid #666; border-right: 1px solid #666;">
<td style="font-family: monospace;font-size:1.2em;padding-left:0.5em; border:none;">]]
local teil2 = '</td><td colspan="2" style="border:none;">'
local teil3 = '</td><td style="border:none;"><span style="color:#777; font-variant:small-caps">'
local teil4 = '</span></td><td style="border:none;">'
local teil5 = '</td></tr>'
_ = teil1 .. pname .. teil2 .. beschreibung .. teil3 .. default .. teil4 .. optional .. teil5
if fort and fort ~="" then -- Fortsetzungszeile
_ = _ .. teil1 .. teil2 .. fort .. teil3 .. teil4 .. teil5
end
if gort and gort ~="" then -- 2. Fortsetzungszeile
_ = _ .. teil1 .. teil2 .. gort .. teil3 .. teil4 .. teil5
end
return _
end
return p