Module:Загвар:FormatDateSimple

--[[
Modul für Hilfsfunktionen für Vorlage:FormatDateSimple
]]

local p = { }

function p.format(frame)
--[[
    Formatierung eines Datums. Wenn dieses im ISO-Format (YYYY-MM-DD) vorliegt, wird es im deutschen Langformat (z.B. "6. Dezember 2018") formatiert.
    Sonst wird der übergebene Wert unverändert zurückgegeben.
    Parameter:
    * Datum
]]
    local sDateRaw = frame.args[1]
    
    local tabMonate = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"}
    
    local sDateFormatted = sDateRaw -- Fallback
    
    local sYear, sMonth, sDay = mw.ustring.match(sDateRaw, "(%d%d%d%d)-(%d%d)-(%d%d)")
    if sYear ~= nil then
    	-- Die folgende Prüfung ist etwas trickreich:
    	-- Die Funktion os.time toleriert zwar zu große Angeben für month und day, 
    	-- diese überzähligen Einheiten werden aber aufaddiert, was dazu führt,
    	-- dass das mittels os.date wieder ins ISO-Format rückkonvertierte Datum
    	-- nicht gleich dem ursprünglichen Datum (Eingangsparameter) sein kann.
    	local dtTest = os.time{year=sYear, month=sMonth, day=sDay}
    	if os.date("%Y-%m-%d", dtTest) == sDateRaw then -- valid?
        	sDateFormatted = tonumber(sDay) .. ". " .. tabMonate[tonumber(sMonth)] .. " " .. tonumber(sYear)
    	end
    end
    return sDateFormatted
end

return p