Module:User:ɞɞ/sandbox/Dok

From Wikimedia Commons, the free media repository
Jump to navigation Jump to search
Lua

CodeDiscussionEditHistoryLinksLink count Subpages:DocumentationTestsResultsSandboxLive code All modules

Modul für Vorlagendokumentation[edit]

Dieser Modul ist zur Verwendung in Vorlagen gedacht und soll die Dokumentation von Vorlagen so weit wie möglich automatisieren.

Innerhalb der Vorlage wird der erzeugende Wikitext angezeigt (mit gewissen Einschränkungen, die in XML-Notation geschriebene Tags und dadurch erzeugte Strip Markers betreffen), sodass man den Inhalt der Vorlage analysieren kann, ohne die Bearbeiten-Seite aufrufen zu müssen.

Die eigentliche Dokumentation wird von einer Unterseite der Vorlage eingebunden, die standardmäßig doc genannt wird, dieser Wert kann mit dem Paramter doc geändert werden. Wenn ich nachfolgend von der Dokumentationsseite rede, ist diese Unterseite gemeint.

Die Vorlagendokumentation kommt ohne zusätzliche Vorlagen, Module oder sonstige Wiki-Elemente aus. Einzige Ausnahme sind zwei Icons im PNG-Format, die vorhanden sein sollten: und , wie diese konkrekt aussehen sollen, bleibt dir überlassen.

In die Dokumentationsseite können Anwendungsbeispiele der Vorlage eingebunden werden, die sich beim Ändern der Vorlage automatisch aktualisieren. Auf der Vorlagenseite werden diese Beispiele angezeigt, sodass die Vorlage zugleich die Auswirkungen anzeigt. Ich empfehle, die Vorlage so zu gestalten, dass beim Fehlen von Eingabeparametern eine sinnvolle Ausgabe erzeugt wird.

Die Dokumentationsseite besteht aus mehreren Abschnitten. Zunächst wird die Wirkungsweise der Vorlage erklärt, anschließend wird eine Übersichtstabelle mit den Parametern generiert sowie eine Kopiervorlage mit einer Auflistung aller Parameter. Danach folgen Anwendungsbeispiele, der Wikicode der Vorlage sowie Links zur Vorlagenverwendung und -unterseiten.

DAs Anlegen einer Preloadseite für die Dokumentation erleichtert die Erstellung der Dokumentationsseite, ist aber nicht zwingend erforderlich.

Einbindung in die Vorlage[edit]

Das Einbinden des nachfolgenden Codes erzeugt eine automatisierte Vorlagendokumentation.

In die Vorlage folgenden Code einfügen:

{{#invoke:User:ɞɞ/sandbox/Dok|doc}}

Es können Parameter ergänzt werden.
Parameterliste
x
NameBeschreibungStandardStatus
vorlageName der Vorlageaufrufende Seiteoptional
preloadName des Vorlagenmusters für die Neuerstellung derDocumentation/preload-docoptional
Dokumentationsseite
docName der Unterseite, die die Dokumentation enthältdocoptional
catKategorie, in die die Vorlage eingeordnet wirdVorlagenoptional
alternativ: kat, kategorie (in dieser Reihenfolge)
nocatwenn keine automatische Kategorisierung erfolgen sollfalseoptional
alternativ: nokat
showwenn die Vorlage nicht verborgen wird, show=1falseoptional
alternativ: zeigen=1

Einbindung in die Dokumentationsunterseite[edit]

In die passend benannte Unterseite der Dokumentation (Parameter doc) folgenden Code einfügen:

{{#invoke:User:ɞɞ/sandbox/Dok|dokuseite}}
<onlyinclude>
{{#invoke:Dok|doku
|text=erzeugt eine sinnvolle Vorlage
|count=3
|p1=|t1=|d1=|m1=1
|... je nachdem wie viele Parameter (count)
|aw1= ... Anwendungsbeispiel 1
|aw2= ... Anwendungsbeispiel 2 (derzeit bis zu 10 Stück möglich)
|... weitere Parameter lt. Parameterliste
}}</onlyinclude>

Für jedes Anwendungsbeispiel kann mittels der Parameter render⧼n⧽ bzw. expand⧼n⧽ eingestellt werden, ob der Wikitext der Vorlage angezeigt und die Vorlage gerendert werden soll oder nicht.

Mittels des Parameters raw⧼n⧽ kann gesteuert werden, ob die Vorlage im „Raw“-Format ausgeführt werden soll. Wird raw⧼n⧽ mit einem beliebigen Wert belegt, so wird der Inhalt des Parameters aw⧼n⧽ so ausgeführt, wie er dort steht. Allerdings dürfen keine doppelten geschwungenen Klammern und Pipezeichen vorkommen, statt der doppelten Klammern müssen einfache angegeben werden, statt des Pipezeichens das Rufzeichen (meinen Recherchen zufolge ist das Wikizeichen {{!}} ebenfalls möglich). Ein Beispiel würde folgendermaßen aussehen: aw1={vorlage!parameter1=wert1!parameter2=wert2! ... } (oder aw1={vorlage{{!}}parameter1=wert1{{!}}parameter2=wert2{{!}} {weitere Vorlage{{!}}... } }). Wenn innerhalb der Vorlage mehrere Klammern aufeinander folgen, müssen sie durch Leerzeichen voneinander getrennt werden.

Parameterliste
x
NameBeschreibungStandardStatus
counthöchster verwendeter Index n für Parameter, es dürfen Lücken in der Numerierung vorkommen0optional
vorlageName der Vorlageaufrufende Rootseiteoptional
textBeschreibungstextsinnfreier Leertextoptional
trennzeichenTrennzeichen für Vorlagenaufruf z.B. *; oder ,optional
expandIndikator, ob der Vorlageninhalt nicht als Wikitext angezeigt werden solltrueoptional
expand=no oder expand=false/nein/n unterdrückt die Anzeige
renderIndikator, ob die Vorlage ausgeführt werden wolltrueoptional
beide Indikatoren auf „nein“ setzen würde wenig Sinn ergeben, ist aber möglich
klappbarIndikator wenn Vorlageninhalt eingeklappt können werden solltrueoptional
mit klappbar⧼n⧽=ja/nein kann die Einstellung für das n-te Anwendungsbeispiel geändert werden
geklappt=ja klappt das Ergebnis beim Laden der Seite ein, geklappt⧼n⧽ wie klappbar
rubrikVorlagengruppeAlleListenoptional
es wird eine (parameterlose) Vorlage mit diesem Namen in die Dokumentation eingefügt (sofern sie existiert), diese kann z.B. eine automatische Kategorisierung sowie eine Liste aller Vorlagen in dieser Gruppe enthalten
aw⧼n⧽Anwendungsbeispiel: aw⧼n⧽=name=bumsti, familienname=muster, plz=4711leeroptional
wird ausgeführt als {{vorlage|name=bumsti|familienname=muster|plz=4711}}
das Trennzeichen wird in das magische Zeichen | umgewandelt und die Vorlage entsprechend dieser Eingabe aufgerufen, dadurch ist weitgehende Flexibiliät möglich; aw1, aw2, ... , aw10 derzeit implementiert
p⧼n⧽Parameter ⧼n⧽, n kann eine beliebige ganze Zahl seinoptional
t⧼n⧽Beschreibung des Parameters ⧼n⧽, alternativ: desc⧼n⧽Beschreibung fehltoptional
d⧼n⧽Voreinstellung des Parameters ⧼n⧽, alternativ: def⧼n⧽leeroptional
m⧼n⧽Parameter ⧼n⧽ erforderlich: m⧼n⧽=1, alternativ: mdt⧼n⧽optionaloptional
f⧼n⧽Fortsetzungszeile zur Parameterbeschreibung, alternativ: fort⧼n⧽leeroptional
g⧼n⧽2. Fortsetzungszeile zur Parameterbeschreibung, alternativ: gort⧼n⧽leeroptional
expand⧼n⧽mit expand⧼n⧽ kann der oben stehende Parameter expand für das n-te Beispiel überschrieben werdenexpandoptional
expand0=f unterdrückt die Anzeige der Vorlagenanwenung ohne Parameter
render⧼n⧽mit render⧼n⧽ kann der oben stehende Parameter render überschrieben werdenrenderoptional
render0=f unterdrückt die Ausführung der Vorlagenanwenung ohne Parameter
raw⧼n⧽Parameterinhalt als komplette Vorlage übernehmenleeroptional
geschwungene Klammern müssen maskiert werden; öffnend: \{, schließend:}/
das Pipe-Zeichen | muss durch Rufzeichen ersetzt werden
aw0Vorlage ohne Parameter expandieren/rendern: ja/neinjaoptional
tabwidthGesamtbreite der Parametertabelle80%optional
parmwidthBreite der Namensspalte14%optional
descwidthBreite der Beschreibungsspalte50%optional
defwidthBreite der Spalte mit der Voreinstellung25%optional
mandwidthBreite der Statusspalte (optional/erforderlich)16%optional

Vorschlag für die Preload-Seite[edit]

Der Name der Vorlagenseite (die durch die Vereinfachung per Lua beinahe schon überflüssig geworden ist) für die Dokumentationsunterseite kann per Parameter gewählt werden und lautet standardmäßig Vorlage:Documentation/preload-doc. Nachfolgend ein Vorschlag für eine mögliche Vorbelegung.

Vorlage für die Vorlagendokumentations-Unterseite Vorlage:Documentation/preload-doc <includeonly><onlyinclude> {{#invoke:Dok|dokuseite}} <only<includeonly/>include>{{#invoke:Dok|doku |vorlage={{subst:BASEPAGENAME}} |p1=1|t1=|d1=|m1=|f1= |p2=2|t2=|d2=|m2=|f2= |count= |text=erzeugt |aw1=parameter wie in der Liste angeführt getrennt durch , oder ; |rubrik=AlleListen |tabwidth= |descwidth= |namewidth= |defwidth= |mandwidth= |norender= |noexpand=}} </only<noinclude></noinclude>include></onlyinclude></includeonly> <includeonly><onlyinclude>[[Category:Dokumentation]]</onlyinclude></includeonly> {{#invoke:Dok|showme}}

Code

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 code_style = 'font-family:&quot;Consolas&quot;, monospace;'

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;"><span style="' .. code_style .. ' white-space:pre-wrap">'
local anzeige_ = '</span></div></div>'

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 vorlage = frame.args.vorlage or mw.title.getCurrentTitle().rootText  -- Name der Vorlage
	local ns      = frame.args.ns or mw.title.getCurrentTitle().nsText         -- Namespace der Vorlage
	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 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
	
	_vorlage =  ns .. ':' .. vorlage    -- für alle Unterprogramme gültig
	dok      =  vorlage .. '/' .. doc   -- Name ohne Namespace
	_doc     = _vorlage .. '/' .. doc   -- mit Namespaceprefix

	local _, mycat, result = '', '', ''
	-- wenn die zu dokumentierende Vorlage nicht existiert, dann Programm beenden
	local dievorlage = p.gibts(vorlage)
	if not dievorlage then return "Die Vorlage " .. _vorlage .. " existiert nicht" end
	
	local verborgen = (hidden and '<div>Die Vorlage <span style="' .. code_style .. ' background-color:yellow;padding:0 0.5em">' .. vorlage .. '</span> ist nur auf eingebundenen Seiten voll sichtbar und auf dieser Seite versteckt.</div>' ) or ''

	local duhast = 'Du hast die Vorlagendokumentation mit dem Befehl <span style="' .. code_style .. '">{{#invoke:Dok|doc|...}}</span> eingebunden und willst die Dokumentation von der Unterseite <span style="' .. code_style .. '">' .. dok .. '</span> einbinden. Über mögliche Parameter und ihre Verwendung kannst du [[Modul:Dok/Doku| in der Dokumentation zum aufgerufenen Modul <i>Dok</i> nachlesen.]]'
	
	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 <span style="' .. code_style .. '">{{[[' .. _doc .. '|' .. dok..']]}}</span> ist nicht vorhanden.</div>'
	
	local damitdie = 'Damit die Dokumentation wie vorgesehen funktioniert, ist es erforderlich, dass du für deine Vorlage <span style="' .. code_style .. '">{{[[' .. _vorlage .. '|' .. vorlage .. ']]}}</span> die Unterseite <span style="' .. code_style .. '">{{[[' .. _doc .. '|' .. dok..']]}}</span> anlegst.\nDas kannst du mit der Eingabebox unterhalb dieses Text durchführen, dadurch wird eine vorausgefüllte Seite basierend auf der Seite <span style="' .. code_style .. '">{{[[' .. preload .. ']]}}</span> erzeugt. Eine leere Seite kannst du mit dem (vermutlich) roten 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 .. '/}}'
    local dokgibts = p.gibts(dok, ns)
	if dokgibts then -- Unterseite doc gibts
		local doku, layout, bearbeiten
		local linkliste = frame:preprocess('[{{fullurl:Spezial:Linkliste/' .. _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 = frame:preprocess('<references />') .. 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;">&#91;[' .. tostring(mw.uri.fullUrl( _doc, 'action=edit')) .. ' Bearbeiten]&#93;</span>.</li><li>' .. linkliste .. '</li></ul>\n|}'		
		result = bearbeiten .. verborgen .. ruler .. layout .. doku .. docu_info
	else
		local mytitel = frame:preprocess('\n==Vorlageninhalt==\n')
		local ShowMe = p.wrap(p.Show(dievorlage))
		result = duhast .. diedokumentationsunterseite .. damitdie .. inputbox .. mytitel .. 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 _doc    = _doc  -- Name der Dokumentationsunterseite inklusive Namespace
	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:Test Template Info-Icon.svg|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]&nbsp;·&nbsp;[' .. tostring(history) .. ' Versionen]&nbsp;·&nbsp;[' .. tostring(purge) .. ' Cache leeren]&nbsp;·&nbsp;[' .. tostring(info) .. ' Seiteninformation]'
	result = divspan .. result .. '</span></div>\n\n'
	
	local small = "''<small>Diese [[Module:User:ɞɞ/sandbox/Dok|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
   -- ruft keine Unterprogramme auf

	local vorlage = frame.args.vorlage or mw.title.getCurrentTitle().baseText
	local ns      = frame.args.ns      or mw.title.getCurrentTitle().nsText
	local doc     = frame.args.dok     or 'doc'
	
	local _vorlage =  ns .. ':' .. vorlage
	local dok      =  vorlage .. '/' .. doc   -- Name ohne Namespace
	local _doc     = _vorlage .. dok         -- mit Namespaceprefix

	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 [[' .. _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( _doc,    'action=edit' )
	local history = mw.uri.fullUrl( _doc,    'action=history' )
	local purge   = mw.uri.fullUrl( _doc,    'action=purge' )
	local qqx     = mw.uri.fullUrl( _doc,    'uselang=qqx' )
	local info    = mw.uri.fullUrl( _doc,    '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 .. frame:preprocess('__NOTOC__')
end

function p.doku(frame)
	
	-- dieser Modul konstruiert die Dokumentationsunterseite vorlage/doc
	-- aufgerufene Unterprogramme: p.gibts, p.tabelle

	-- Parameter mit Voreinstellungen
	local count    = frame.args.count or 0 
	local vorlage  = frame.args.vorlage or mw.title.getCurrentTitle().baseText -- Name der Vorlage
	local ns      = frame.args.ns or mw.title.getCurrentTitle().nsText         -- Namespace der Vorlage
--if 1 then return 'mw.title.getCurrentTitle().baseText: ' .. vorlage end
	local erzeugt  = frame.args.text or "erzeugt etwas Tolles, sonst gäbe es sie nicht."
	local rubrik   = frame.args.rubrik or "AlleListen"
	local trnzn    = string.gsub(frame.args.trennzeichen or ',;','%p', '%%%0')  -- Trennzeichenliste für die Verwendungsbeispiele
	local klappbar = YesNo(frame.args.klappbar, true)
	local geklappt = YesNo(frame.args.geklappt, false)
	local leeranw  = YesNo(frame.args.anw0, true)  -- anw0=no: kein Anwendungsbeispiel ohne Parametervorgaben
	
	local expand   = YesNo(frame.args.expand, true) -- soll Vorlageninhalt standardmäßig expandiert werden
	local render   = YesNo(frame.args.render, true) -- soll Vorlageninhalt standardmäßig gerendert werden
	
	_vorlage =  ns .. ':' .. vorlage

	-- 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="' .. code_style .. '">{{[[' .. _vorlage .. '|' .. vorlage .. ']]' .. '}}</span> '
	local diese_vorlage = '\nDie 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
	local dievorlage = p.gibts(vorlage, ns)
	if not dievorlage then return "Die Vorlage " .. vorlage .. " existiert nicht" end
	
	ShowMe = frame:preprocess('\n==Code==\n') .. p.wrap(p.Show(dievorlage)) -- 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<span style="' .. code_style .. '">') .. __vorlage .. kopiervorlage .. "}}</span>" -- Kopiervorlage zur Dokumentationsanwendung mit Auflistung aller Parameter

	-- Vorlagenanwendung ohne Parameter
	-- wenn expand0=false und render0=false dann nicht
	local lexpand = YesNo(frame.args.expand0, true)
	local lrender = YesNo(frame.args.render0, true)
	if leeranw then  -- Anwendung ohne Parameter
		anw0 = frame:preprocess('\n==Anwendung==\n') .. p.anwendung(_vorlage_, lrender, lexpand, klappbar, geklappt)
	else
		anw0 = ''
	end

	-- Anwendungsbeispiele
	-- alle Parameterwerte mit Beistrich oder Strichpunkt getrennt
	-- wie im Vorlagenaufruf, nur mit einem anderen Trennzeichen
	-- mit raw⧼n⧽ kann die Anwendung im Rohformart eingegeben werden
	-- geschwungene Klammern müssen maskiert werden, sonst wird die Vorlage vor dem Lua-Aufruf transkludiert
	-- öffnende Klammern mit vonangestelltem Backslah: \{ 
	-- schließende Klammern mit nachgestelltem Slash: }/
	-- Pipezeichen müssen als {{{!}}} oder ! geschrieben werden
	
	for i=1,10 do -- mehr als 10 Anwendungsbeispiele werden kaum sinnvoll sein
		 local u, liste, ergibt, anwendung = frame.args["aw" .. i], '', '', '', ''
		 local diese_anwendung
		 if u and u~="" then -- Anwendungsbeispiel mit Index i gefunden
			local raw  = frame.args['raw' .. i] -- die i-te Anwendung im Rohformat ausführen
			local lexpand = YesNo(frame.args['expand' .. i], expand) -- Voreinstellung für Expandieren ändern
			local lrender = YesNo(frame.args['render' .. i], render) -- Voreinstellung für Rendern ändern
			local lklappbar = YesNo(frame.args['klappbar' .. i], klappbar) -- Voreinstellung für Klappbar ändern
			local lgeklappt = YesNo(frame.args['geklappt' .. i], geklappt) -- Voreinstellung für Eingeklappt ändern

			if raw then
				local _
				_ = u:gsub('\\%{','%{')
				_ = _:gsub('}/','%}')
				diese_anwendung = _:gsub('!','|')
			else
				liste = '|' .. string.gsub(u, '[' .. trnzn .. ']','|') .. '}}'  -- Trennzeichen in senkrechte Striche umwandeln, default ist ',' oder ';', als Pattern %,%;
					diese_anwendung = __vorlage .. liste
			end
			anwendung = p.anwendung(diese_anwendung, lrender, lexpand, lklappbar, lgeklappt)
			muster = muster .. anwendung
		 end -- u and u~=""
	end -- for i=1,10 do 

	return vorlagen_intro .. parametertabelle .. kopiervorlage .. anw0 .. muster .. ShowMe .. frame:preprocess('__NOTOC__')

end

function p.anwendung(vorlage, xender, xxpand, xklappbar, xgeklappt)
	-- 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 xklappbar or xgeklappt then
		if xklappbar then class = ' class ="mw-collapsible">' end
		if xgeklappt then class = ' class ="mw-collapsible mw-collapsed">' end
	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"><span style="' .. code_style .. '">' .. vorlage .. '</span>'
	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 xxpand then
		 ergibt_gerendert= 'ergibt ' .. ergibt_gerendert
	end
	ergibt_gerendert= div_inlineblock .. ergibt_gerendert
	
	expanded = '<span style="' .. code_style .. ' white-space: pre-wrap;">' .. mw.text.nowiki(processed) .. '</span></div>'
	gerendert = processed .. '</div>'
	
	if xxpand then _ = ergibt_expandiert .. expanded end
	if xender 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 = tonumber(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["t" .. j] or pframe.args["desc" .. j] or 'Beschreibung fehlt' -- Parameterbeschreibung
			def  = pframe.args["d" .. j]  or pframe.args["def" .. j] or 'leer'               -- Standardeinstellung
			mand = pframe.args["md" .. j]  or pframe.args["mt" .. j]                         -- verpflichtende Eingabe ja/nein
			fort = pframe.args["f" .. j] or pframe.args["fort" .. j]  -- Fortsetzungszeile der Beschreibung
			gort = pframe.args["g" .. j] or pframe.args["gort" .. 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 mw.title.getCurrentTitle().nsText
  local titel = mw.title.new(space .. ":" .. name)

  if titel.exists then return titel end
  return false
end

function p.Show(titel)
	-- titel: muss eine Wiki-Seite sein
	-- diese Funktion liefert den Inhalt der Seite zurück, wobei alle Sonderzeichen in HTML-Entitäten umgewandelt werden
	-- sodass nur der Rohinhalt angezeigt wird, aber keine Inhalte geparst werden
	local titel = titel
	if titel.exists then
		--return mw.text.nowiki(mw.text.killMarkers(titel:getContent()))
		return mw.text.nowiki(titel:getContent())
	else
		return
	end
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

function p.showme(frame)
	local vorlage = frame.args.vorlage or (mw.title.getCurrentTitle().nsText .. ':' .. mw.title.getCurrentTitle().text)
	local _
	_ = frame:preprocess(anzeige .. vorlage .. anzeige_)
	return _
end

function p.wrap(s)
	return anzeige .. tostring(s) .. anzeige_
end

function YesNo( wert, default)
	-- gibt wahr zurück wenn Eingabe irgendwie ja ist
	-- ansonsten falsch
	
	-- wenn  wert kein String ist, dann  wert ::= falsch
	-- wenn  wert einen Wert enthält, wird er in Kleinbuchstaben umgewandelt

	 wert = type( wert) == 'string' and  wert:lower() or  wert
	if  wert == nil then -- kein Eingabeparameter 1: stellt auf default
		return default
	elseif  wert == true 
		or  wert == 'yes' or  wert == 'ja' or  wert == 'true'
		or  wert == 'y'   or  wert == 'j'  or  wert == 'wahr'
		or  wert == 't'   or  wert == 'si'
		or  wert == 'on'  or  wert == 'jo'
		or tonumber( wert) == 1
	then
		return true
	elseif  wert == false
		or  wert == 'no'  or  wert == 'nein' or  wert == 'false'
		or  wert == 'n'   or  wert == 'nix'  or  wert == 'falsch'
		or  wert == 'f'   or  wert == 'nada'
		or  wert == 'off' or  wert == 'not'
		or  wert == 'niente'
		or  wert == 'nicht'
		or  wert == 'nichts'
		or  wert == 'nothing'
		or  wert == 'non'
		or  wert == 'nit'
		or  wert == 'ned'
		or tonumber( wert) == 0
	then
		return false
	else
		return default
	end
end

return p