Modul:Kalender: Unterschied zwischen den Versionen

Aus FürthWiki

(p.date2ISO() Optimierungen)
(+ DateLastDayCompleter())
Zeile 45: Zeile 45:
-- Prüfe auf Formate wie: 2024, -44, 44 v. Chr., 800 n. Chr.
-- Prüfe auf Formate wie: 2024, -44, 44 v. Chr., 800 n. Chr.
return s:match("^%-?%d+$") or s:match("^%d+%s+[vn]%.%s+Chr%.$")
return s:match("^%-?%d+$") or s:match("^%d+%s+[vn]%.%s+Chr%.$")
end
function p.DateLastDayCompleter(frame)
-- mw.log("DateLastDayCompleter(frame)")
-- mw.logObject(frame, "frame")
local date = frame.args[1] or ""
local last_date = p.dateLastDayCompleter(date)
-- mw.logObject(last_date, "last_date")
return last_date
end
end



Version vom 8. Januar 2026, 14:49 Uhr

Dieses Modul enthält Kalender/Datums-bezogene Funktionen.

istJahrestag()

Überprüft den Namen des beinhaltenden Artikels auf:

  • mit 1 oder 2 Ziffern beginnt (%d%d?)
  • gefolgt ist von einem Punkt (%.)
  • optionalem Leerzeichen (%s*),
  • und einem Monatsnamen (%a+ = Buchstaben).

Wenn das zutreffend ist, wird das erste Argument zurückgegeben. Wenn nicht, wird das zweite Argument zurückgegeben. Sind keine Argumente gegeben, wird true oder "" zurückgegeben.

istJahreszahl()

Überprüft den Namen des beinhaltenden Artikels auf:

  • Ist der Artikelname eine Ganzzahl, positiv oder negativ? (^%-?%d+$)
  • Oder ist der Artikelname eine positive Ganzzahl, gefolgt von "v. Chr." oder "n. Chr." (^%d+%s+[vn]%.%s+Chr%.$)

Wenn das zutreffend ist, wird das erste Argument zurückgegeben. Wenn nicht, wird das zweite Argument zurückgegeben. Sind keine Argumente gegeben, wird "" oder true zurückgegeben.

dateLastDayCompleter() / DateLastDayCompleter()

Ergänzt ein Formular-Datum um letzten Tag für eine SMW-Query, insbesondere Abfragen.

Unterseiten


p = {}

p.month_names = { "Januar", "Februar", "März", "April", "Mai",  "Juni",
	"Juli", "August", "September", "Oktober", "November", "Dezember"}

p.month_numbers = {
	["Januar"] = 1,		["Februar"] = 2,	["März"] = 3,
	["April"] = 4,		["Mai"] = 5,		["Juni"] = 6,
	["Juli"] = 7,		["August"] = 8,		["September"] = 9,
	["Oktober"] = 10,	["November"] = 11,	["Dezember"] = 12}

function p.IstJahrestag(frame)
	-- #invoke wrapper
	local args = frame.args
    local title = mw.title.getCurrentTitle().text
    local tag, monat = p.istJahrestag(title)
    
    if tag and monat then
        return frame.args[1] or "true"
    else
        return frame.args[2] or ""
    end
end

function p.istJahrestag(s)
	s = s or ""
	-- Prüfe auf ein-/zweistellige Zahl durch Punkt gefolgt, opt. Leerzeichen
	return s:match("^(%d%d?)%.%s*(%a+)$")
end

function p.IstJahreszahl(frame)
	-- #invoke wrapper
    local args = frame.args
    local title = mw.title.getCurrentTitle().text

    if p.istJahreszahl(title) then
        return args[1] or "true"
    else
        return args[2] or ""
    end
end

function p.istJahreszahl(s)
	s = s or ""
	-- Prüfe auf Formate wie: 2024, -44, 44 v. Chr., 800 n. Chr.
	return s:match("^%-?%d+$") or s:match("^%d+%s+[vn]%.%s+Chr%.$")
end

function p.DateLastDayCompleter(frame)
--	mw.log("DateLastDayCompleter(frame)")
--	mw.logObject(frame, "frame")
	local date = frame.args[1] or ""
	local last_date = p.dateLastDayCompleter(date)
--	mw.logObject(last_date, "last_date")
	return last_date
end

function p.dateLastDayCompleter(date)
	-- ergänzt letzten Tag für SMW-Query
	-- 2000 => 2000/12/31
	-- Februar 2000 => 2000/2/29
	-- Februar 2001 => 2001/2/28
	-- 2020/04/02 => 2020/04/02
	local last_date
	if #date == 4 then															-- nur "Jahr" vorhanden
		last_date = date .. "/12/31"
	elseif string.find(date, " ") ~= nil then									-- "Monat Jahr" vorhanden (hat Leerzeichen)
		local days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
		local month = string.sub(date, 1, string.find(date, " ") - 1)
		month = p.month_numbers[month]
		local year = string.sub(date, string.find(date, " ") + 1)
		last_date = year .. "/" .. string.format("%02d", month) .. "/"
		if month == 2 and year % 4 == 0 then									-- Sonderfall Feb. Schaltjahr
			last_date = last_date .. "29"
		else
			last_date = last_date .. days[month]
		end
	else
		last_date = date
	end
	return last_date
end

function p.dateFirstDayCompleter(date)
	-- ergänzt ersten Tag
	-- 2000 => 2000/01/01
	-- Februar 2000 => 2000/2/01
	-- 2020/04/02 => 2020/04/02
	local first_date
	if #date == 4 then															-- nur "Jahr" vorhanden
		first_date = date .. "/01/01"
	elseif string.find(date, " ") ~= nil then									-- "Monat Jahr" vorhanden (hat Leerzeichen)
		local month = string.sub(date, 1, string.find(date, " ") - 1)
		month = p.month_numbers[month]
		local year = string.sub(date, string.find(date, " ") + 1)
		first_date = year .. "/" .. string.format("%02d", month) .. "/01"
	else
		first_date = date
	end
	return first_date
end

function p.date2ISO(date)
	-- 2000 => 2000
	-- Februar 2000 => 2000-02
	-- 2020/04/02 => 2020-04-02
	local date_iso = ""
	if #date == 4 then															-- nur "Jahr" vorhanden
		date_iso = date
	elseif string.find(date, " ") ~= nil then									-- "Monat Jahr" vorhanden (hat Leerzeichen)
		local month = string.sub(date, 1, string.find(date, " ") - 1)
		month = p.month_numbers[month]
		date_iso = string.sub(date, string.find(date, " ") + 1)
		if month ~= nil then
			date_iso = date_iso .. "-" .. string.format("%02d", month)
		end
	else
		for i = 1, #date do
			local char = string.sub(date, i, i)
			if char == "/" then
				date_iso = date_iso .. "-"
			else
				date_iso = date_iso .. char
			end
		end
	end
	return date_iso
end

return p