Module:Hili

local p = {} -- p stands for package local t = require('Module:Arguments')

function p.nrliste(frame) --	--erzeugt eine Tabelle mit Seitennummer und Namen --sehr teuer in der Ausführung, daher nur 50 Listeneinträge --Parameter: ab/abwo, Zahl ab der gestartet wird local a = frame.args             -- direkt per #invoke: übergeben if empty(a) then a = mw.getCurrentFrame.args end -- an die Vorlage übergebene Parameter local tabel, tabtr, tabtre = ' ' return _ end

function p.getid(frame) --	local was = frame.args.seite or frame:getParent.args.seite or 'Lua' -- Seitentitel local ns = frame.args.ns or frame:getParent.args.ns or ''           -- Namensraum local namesp = t.tidy(ns) or 'Artikel' local seite = mw.title.new(was, ns) local _ = seite.id if _ == 0 then return 'Seite ' .. was .. ' existiert nicht im Namensraum ' .. namesp end namesp = seite.nsText local fulln = seite.prefixedText return 'Die Seite ' .. fulln .. ' hat die ID ' .. _ end

function p.countdown(frame) local a = mw.getCurrentFrame.args                           -- direkter Aufruf per invoke if empty(a) then a = mw.getCurrentFrame:getParent.args end -- Aufruf via Vorlage local biswann = trim(a.ende or a[1] or a.enddatum or a.enddat or a.biswann or '3.12.2020') local tag = frame:preprocess('') if string.find(tag, "error") then return 'fehlerhaftes Datum: ' .. biswann end local ta = tonumber(tag) local ja = tonumber(frame:preprocess(''))

local ht = tonumber(frame:preprocess('')) local hj = tonumber(frame:preprocess('')) local diff = ta - ht -- Tage Differenz if hj == ja then -- im gleichen Jahr if ht > ta then --- Countdown schon abgelaufen return 'has ended' else if ht == ta then return "ends today " -- .. 'Jahr: ' .. ja .. ' Tag: ' .. ta			else return 'ends ' .. frame:preprocess('NaN tomorrows') end end else return 'ends next year' end return 'Jahr: ' .. ja .. ' Monat: ' .. mo .. ' Tag: ' .. ta end

function p.cats(frame) -- kategorisiert in alle übergebenen Parameter -- die Variable a enthält alle Parameter, die im #invoke: Statement stehen -- die Variable b enthält die Parameter, die an die Vorlage übergeben werden, die das #invoke: Statement aufruft -- z.B. die Vorlage ruft cats mit dem Parameter Scheme auf: -- frame.args enthält i=1, v=Scheme --             frame:getParent.args i=1, v=Grobs

local a = mw.getCurrentFrame:getParent.args -- kann nur über Vorlage aufgerufen werden, die Parameter der Vorlage werden durchgereicht local b = mw.getCurrentFrame.args local sort = a["sort"] or "" if trim(sort) > " " then sort = "|" .. trim(sort) end local katz = '' for i,v in pairs(a) do -- direkt per #invoke: übergeben if type(i) == 'number' and trim(v) > ' ' and #v < 50 then -- Kategorienamen sollten kürzer als 50 Zeichen sein katz = katz .. ""		end end

local sort = b["sort"] or "" if trim(sort) > " " then sort = "|" .. trim(sort) end

for i,v in pairs(b) do -- direkt per #invoke: übergeben if type(i) == 'number' and trim(v) > ' ' and #v < 50 then -- Kategorienamen sollten kürzer als 50 Zeichen sein katz = katz .. ""		end end return katz

end

function p.hili(frame) -- Syntaxhighlighting von Lilypond-Code -- standardmäßig als Latex formatiert, weil es keine spezielle Lilypond-Syntax gibt local a = frame.args                           -- Direktaufruf via invoke if empty(a) then a = frame:getParent.args end -- Aufruf via Vorlage end local mylow = '' local mus = music

for k, v in pairs(a) do		mylow = string.lower(t.tidy(k)) -- wir müssen die in der Vorlage zulässigen Paramter ausschließen if mylow ~= "lang" and mylow ~= 'display' and mylow ~= 'margin' and mylow ~= 'width' and mylow ~= 'class' then mus = v 			break end end

local _lang = a.lang or 'latex' local _ = frame:extensionTag { name = 'syntaxhighlight', content = mus, args = { lang = _lang } } return _ end

function p.lua(frame) --	-- Angabe einer Startnummer hat nicht wirklich Sinn, weil bloß die Numerierung geändert wird, der Code wird jedenfalls ab Beginn angezeigt -- weil ich es schon mal geschrieben habe, lasse ich den Parameter drin local a = mw.getCurrentFrame:getParent.args -- kann nur über Vorlage aufgerufen werden, die Parameter der Vorlage werden durchgereicht if empty(a) then a = mw.getCurrentFrame.args end local b = '' local mus  = a.code or a.lua or a.mus or '-- Lua code' local _lang = a.lang or 'lua' local aline = a.start if aline then b = frame:extensionTag { name = 'syntaxhighlight', content = mus, args = { lang = _lang, line='line', start = aline } } else b = frame:extensionTag { name = 'syntaxhighlight', content = mus, args = { lang = _lang } } end return b end

function p.vorlage(frame) local a = frame.args             -- direkt per #invoke: übergeben local b = frame:getParent.args -- Aufruf via Vorlage

local c = a.vorlage or b.vorlage or 'keine Vorlage' -- Name der Vorlage --if 1 then return c .. table.concat(a, ", ") end local i,v local _, katz = ,  for i,v in pairs(a) do -- direkt per #invoke: übergeben if tostring(i):lower ~= 'vorlage' and trim(v) > ' ' then katz = katz .. '|' .. i .. '=' .. trim(v) end end for i,v in pairs(b) do -- direkt per #invoke: übergeben if tostring(i):lower ~= 'vorlage' and trim(v) > ' ' then katz = katz .. '|' .. i .. '=' .. trim(v) end end katz = '' --if 1 then return 'alle Parameter ' .. katz end return frame:preprocess(katz) end

function p.lenplus(frame) -- liefert die Länge eines Strings plus eine Zahl local a = frame:getParent.args -- bei Aufruf über Vorlage ist :getParent. erforderlich if empty(a) then a = mw.getCurrentFrame.args end local _len = '' local _text = a.text or a[1] or '' local _add = tonumber(a[2]) or 1 -- Standardwert ist 1 local _tlen = #_text + _add      -- #x ist der Längenoperator für einen Text return _tlen or '' end

function p.tag(frame) -- Tag Auswertungen per Lua -- funktionieren viel besser als per #tag: weil unempfindlicher gegen Sonderzeichen local a = frame.args             -- direkt per #invoke: übergeben if empty(a) then a = mw.getCurrentFrame.args end -- per Vorlage aufgerufen local tag = a.tag or a[2] or 'syntaxhighlight' -- Tagname, benannter oder unbenannter 2. Parameter local content = a.content or a[1] or ''        -- Taginhalt, entweder benannter oder unbenannter 1. Parameter local tagparms = { } local ausgabe = '' for k, v in pairs(a) do                        -- alle restlichen Parameter werden gesammelt und in die tagparms Tabelle übergeben if string.lower(k) ~= "tag" and string.lower(k) ~= 'content' and k ~= '1' and k ~= 1 and k ~= 2 and k ~= '2' then tagparms[k] = v ausgabe = ausgabe .. ' index: ' .. k .. ' inhalt: ' .. v   -- für Testzwecke end end

--return 'Parameter: ' .. ausgabe .. ' tag: ' .. tag .. ' conten: ' .. content return frame:extensionTag { name = tag, content = content, args = tagparms }

end

function p.svg(frame) local a = frame.args             -- direkt per #invoke: übergeben local b = frame:getParent.args -- an die Vorlage übergebene Parameter local katz = ""  -- Kategorie

for i,v in pairs(a) do		if type(i) == 'number' and v > ' ' and #v<50 then katz = katz .. ""		end end for i,v in pairs(b) do		if type(i) == 'number' and v > ' ' and #v<50 then katz = katz .. ""		end end return katz end

function p.rep(frame) -- Wiederholung eines Strings local a = mw.getCurrentFrame:getParent.args  -- bei Aufruf über Vorlage ist :getParent. erforderlich if empty(a) then a = mw.getCurrentFrame.args end -- entweder Direktaufruf oder über Vorlage, so bin ich für alles gerüstet local reps = a.rep or a.reps or a.repetitions or a[2] local text = a.text or a.strg or a[1] local repetitions = tonumber(reps) if not repetitions then -- wenn Wiederholung fehlt oder ungültig, dann gib den ursprünglichen Text aus return text or '' end return string.rep( text or '', repetitions ) end

function trim(s) -- entfernt Weißraum an den beiden Enden des Strings if type(s) ~= 'string' then return s end -- falls kein string return s:match("^%s*(.-)%s*$") end

function empty (x) -- es gibt keine eingebaute Funktion, um zu überprüfen, ob eine Tabelle leer ist -- diese Funktion liefert true, wenn die Tabelle leer ist -- hilfreich bei frame.args oder frame:parent.args etc.   for _, _ in pairs(x) do        return false end return true end

function gibts(name, namespace) -- liefert true, wenn die Wikiseite "name" im namespace "namespace" existiert -- default namespace ist main local name = name local space = namespace or '' if space ~= '' then space = space .. ':' end local titel = mw.title.new(space .. name)

if titel.exists then return titel end return false end

return p