Modul:LinkFormDatum

Version vom 1. Dezember 2025, 10:17 Uhr von HeikoBot (Diskussion | Beiträge) (linkFormDate() zusätzlich ISO-P case YYYY-MM-DD)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

LinkFormDate

Funktion, welche die Datumsfelder der Formulare zur Visualisierung in den Faktenboxen abbildet. Hierbei werden die Datumsangaben gleichzeitig semantisiert.

Die von der Vorlage übergebenen Parameter lauten:

  • 1 = Datum, z. B. das Geburtsdatum in beliebigem Format
  • 2 = Name des Hauptattributs, z. B. Geburtsdatum
  • 3 = Name des Tagesattributes, z. B. Geburtstag
  • 4 = Name des Jahresattributes, z. B. Geburtsjahr

FormatDate

Bringt ein semantisches Datum (z. B. 20 Januar 2008) in die Übliche Darstellung (20. Januar 2008), so dass Jahr und Jahrestag klickbar sind und in die entsprechenden Artikel verlinken. Es funktioniert auch, wenn der Tag mit Punkt übergeben wird (also 20. Januar 2008).

HumanToFormDate

Bringt ein Menschenlesbares Datum wie "23. Februar 1985" in die semantische Form "1985/02/23". Die Konvertierung gelingt auch, wenn der Tag oder Tag und Monat fehlen. Das nun maschinenlesbare Format kann mit der Funktion LinkFormDate wieder semantisiert und in die Datenbank eingetragen werden (unter Nennung der Attribute, siehe dort).

Unterseiten


local p = {}
local c = require( "Module:Common" )
local str = require("Modul:String")

function p.LinkFormDate(frame)
	-- #invoke wrapper
	local args = frame.args
    return p.linkFormDate(args[1], args[2], args[3], args[4])
end

function p.linkFormDate(date, attr_date, attr_day, attr_year)
    local months = c.getMonthList()
    local date_array
    local mda
    local mn	-- monthname

	if string.find(date, "/") ~= nil then										-- regular case YYYY/MM/DD
    	date_array = str.split(date, "/")
    else																		-- ISO-P case YYYY-MM-DD
    	date_array = str.split(date, "-")
    end
    
    -- wenn keine Attribute übergeben, werden keine gesetzt, sondern nur Links eingebaut
    if attr_day ~= nil then
    	attr_day = attr_day .. "::"
    else
    	attr_day = ""
    end
    if attr_year ~= nil then
    	attr_year = attr_year .. "::"
    else
    	attr_year = ""
    end
    if attr_date ~= nil then
    	mw.smw.set({[attr_date] = date})
    end
    if c.isEmpty(date_array[2]) then
    	-- When datestring contained no "/"
    	if c.isInteger(date_array[1]) then
    		-- When dateformat is just YYYY
    		return "[[" .. attr_year .. date_array[1] .. "]]"
    	else
    		-- Dateformat is <monthname> YYYY
    		mda = str.split(date_array[1])
    		return mda[1] .. " [[" .. attr_year .. mda[2] .. "]]"
    	end
    elseif c.isEmpty(date_array[3]) then
    	-- Datestring contained one "/"
    	mn = months[tonumber(date_array[2])]
    	return mn .. " [[" .. attr_year .. date_array[1] .. "]]"
    else
    	-- Dateformat should be YYYY/MM/DD or YYYY-MM-DD
    	mn = months[tonumber(date_array[2])]
    	date_array[3] = date_array[3]:gsub('0*', '', 1)
    	return "[[" .. attr_day .. date_array[3] .. ". " .. mn .. "]]" .. 
    		" [[" .. attr_year .. date_array[1] .. "]]"
    end
end

function p.FormatDate(frame)
	-- #invoke wrapper
	return p.formatDate(frame.args[1])
end

function p.formatDate(date)
	local date_array = str.split(date, " ")
	local day
	
	if c.isEmpty(date_array[2]) then
    	-- When datestring contained no " ", thus is year
    	return "[[" .. date_array[1] .. "]]"
	elseif c.isEmpty(date_array[3]) then
		-- When datestring contains monthname and year
		return date_array[1] .. " [[" .. date_array[2] .. "]]"
	else
		-- When datestring contains day, monthname and year
		day = string.gsub(date_array[1], "%.", "")
		return "[[" .. day .. ". " .. date_array[2] .. "]] " .. 
			"[[" .. date_array[3] .. "]]"
	end
end

function p.HumanToFormDate(frame)
	-- #invoke wrapper
	return p.humanToFormDate(frame.args[1])
end

function p.humanToFormDate(date)
	mw.log("p.humanToFormDate(date)")
	mw.logObject(date)
	-- Converts a human date (3. Februar 1955) to 1955/02/03, like SMW needs
	local date_array=str.split(date, " ")
	local day
	local mnr	-- monthnr
	
	if c.isEmpty(date_array[2]) then
		-- When datestring contained no " ", thus is year
		return date_array[1]
	elseif c.isEmpty(date_array[3]) then
		-- When datestring contains monthname and year
		return date_array[1].." "..date_array[2]
	else
		day = string.gsub(date_array[1], "%.", "")
		day = string.format("%02d", day)
		mnr = c.getMonthnr(date_array[2])
		mnr = string.format("%02d", mnr)
		return date_array[3] .. "/" .. mnr .. "/" .. day
	end
end

return p