Module:Lily/procs

From About PCs Wiki
Jump to navigation Jump to search

Documentation for this module may be created at Module:Lily/procs/doc

local p = {} -- p stands for package

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 '14.2.2021')
	
	local tag = frame:preprocess('{{#time:z|' .. biswann .. '}}')
	if string.find(tag, "error") then return 'fehlerhaftes Datum: ' .. biswann end	
	
	local ta = tonumber(tag)
	local ja = tonumber(frame:preprocess('{{#time:Y|' .. biswann .. '}}'))

	local ht = tonumber(frame:preprocess('{{#time:z|}}'))
	local hj = tonumber(frame:preprocess('{{#time:Y|}}'))
	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"
			else
				return 'ends ' .. frame:preprocess('{{plural:' .. diff .. '|tomorrow|in ' .. diff .. ' days}}')
			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 {{Scheme}} ruft cats mit dem Parameter Scheme auf: 
	-- {{#invoke:Hili|cats|Scheme}} frame.args enthält i=1, v=Scheme
	-- {{Scheme|Grobs}}             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 .. "[[Category:" .. trim(v) .. sort .. "]]"
		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 .. "[[Category:" .. trim(v) .. sort .. "]]"
		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 mus = music

	for k, v in pairs(a) do
		if string.lower(k) ~= "lang" then -- damit kann der Parameter beliebig benannt werden, nur lang wird ausgenommen
			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.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 = '{{raw:lily:' .. c .. 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 .. '<br>index: ' .. k .. '<br>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.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