Modul:LinkFormDatum: Unterschied zwischen den Versionen

Aus FürthWiki

(linkFormDateAttrList() string check)
(linkFormDateAttrList() Modul:SMW geändert; + date nil check)
 
Zeile 69: Zeile 69:
-- attr_list={}; print(p.linkFormDateAttrList{date="2026/02", attr_list=attr_list, attr_date="Datum", attr_day="Tag", attr_year="Jahr"}); mw.logObject(attr_list)
-- attr_list={}; print(p.linkFormDateAttrList{date="2026/02", attr_list=attr_list, attr_date="Datum", attr_day="Tag", attr_year="Jahr"}); mw.logObject(attr_list)
local t = ""
local t = ""
    -- date zerteilen
if args.date ~= nil then
    local date_array
    -- date zerteilen
if string.find(args.date, "/") ~= nil then -- regular case YYYY/MM/DD
    local date_array
    date_array = str.split(args.date, "/")
if string.find(args.date, "/") ~= nil then -- regular case YYYY/MM/DD
    else -- ISO-P case YYYY-MM-DD
    date_array = str.split(args.date, "/")
    date_array = str.split(args.date, "-")
    else -- ISO-P case YYYY-MM-DD
end
    date_array = str.split(args.date, "-")
-- Fälle unterscheiden
end
    local day, month, year
-- Fälle unterscheiden
    if com.isEmpty(date_array[2]) then -- "2026" oder "April 2026"
    local day, month, year
    -- When datestring contained no "/" => only year
    if com.isEmpty(date_array[2]) then -- "2026" oder "April 2026"
    if com.isInteger(date_array[1]) then
    -- When datestring contained no "/" => only year
    -- When dateformat is just YYYY
    if com.isInteger(date_array[1]) then
    year = date_array[1]
    -- When dateformat is just YYYY
    t = "[[" .. year .. "]]"
    year = date_array[1]
    else
    t = "[[" .. year .. "]]"
    -- Dateformat is <monthname> YYYY
    else
    local mda = str.split(date_array[1])
    -- Dateformat is <monthname> YYYY
    year = mda[2]
    local mda = str.split(date_array[1])
    t = mda[1] .. " [[" .. year .. "]]"
    year = mda[2]
    end
    t = mda[1] .. " [[" .. year .. "]]"
    elseif com.isEmpty(date_array[3]) then -- "2026/02"
    end
    -- Datestring contained one "/"
    elseif com.isEmpty(date_array[3]) then -- "2026/02"
    month = kal.month_names[tonumber(date_array[2])]
    -- Datestring contained one "/"
  year = date_array[1]
    month = kal.month_names[tonumber(date_array[2])]
    t = month .. " [[" .. year .. "]]"
  year = date_array[1]
    else
    t = month .. " [[" .. year .. "]]"
    -- Dateformat should be YYYY/MM/DD or YYYY-MM-DD
    else
    month = kal.month_names[tonumber(date_array[2])]
    -- Dateformat should be YYYY/MM/DD or YYYY-MM-DD
    date_array[3] = date_array[3]:gsub('0*', '', 1)
    month = kal.month_names[tonumber(date_array[2])]
    day = date_array[3] .. ". " .. month
    date_array[3] = date_array[3]:gsub('0*', '', 1)
    year = date_array[1]
    day = date_array[3] .. ". " .. month
    t = "[[" .. day .. "]]" .. " [[" .. year .. "]]"
    year = date_array[1]
    end
    t = "[[" .. day .. "]]" .. " [[" .. year .. "]]"
    -- Werte in Attributeliste eintragen. Bei nil wird nix eingetragen
    end
    if type(args.attr_list[args.attr_date]) ~= "string" then
    -- Werte in Attributeliste eintragen. Bei nil wird nix eingetragen
    smw.addAttrToList(args.attr_list, args.attr_date, args.date)
  smw.addAttrToList(args.attr_list, args.attr_date, args.date)
    end
    if type(args.attr_list[args.attr_date .. "Lfd"]) ~= "string" then
    smw.addAttrToList(args.attr_list, args.attr_date .. "Lfd", t)
    smw.addAttrToList(args.attr_list, args.attr_date .. "Lfd", t)
    end
  smw.addAttrToList(args.attr_list, args.attr_day, day)
    if args.attr_day ~= nil then
    smw.addAttrToList(args.attr_list, args.attr_day, day)
    end
    if args.attr_year ~= nil then
    smw.addAttrToList(args.attr_list, args.attr_year, year)
    smw.addAttrToList(args.attr_list, args.attr_year, year)
end
end -- if args.date ~= nil then
     return t
     return t
end
end

Aktuelle Version vom 14. Februar 2026, 11:33 Uhr

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

linkFormDateAttrList

Wie LinkFormDate, aber dass die Attribute in Attribute-Liste eingetragen werden.

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 com = require("Modul:Common")
local str = require("Modul:String")
local kal = require("Modul:Kalender")
local smw = require("Modul:SMW")

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 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 com.isEmpty(date_array[2]) then
    	-- When datestring contained no "/"
    	if com.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 com.isEmpty(date_array[3]) then
    	-- Datestring contained one "/"
    	mn = kal.month_names[tonumber(date_array[2])]
    	return mn .. " [[" .. attr_year .. date_array[1] .. "]]"
    else
    	-- Dateformat should be YYYY/MM/DD or YYYY-MM-DD
    	mn = kal.month_names[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.linkFormDateAttrList(args)
	-- wie linkFormDate, aber zu setzende Attribute werden in Attribute-Liste eingetragen
	-- Kommandozeile zum Debuggen:
	-- attr_list={}; print(p.linkFormDateAttrList{date="2026/02/10", attr_list=attr_list, attr_date="Datum", attr_day="Tag", attr_year="Jahr"}); mw.logObject(attr_list)
	-- attr_list={}; print(p.linkFormDateAttrList{date="2026-02-10", attr_list=attr_list, attr_date="Datum", attr_day="Tag", attr_year="Jahr"}); mw.logObject(attr_list)
	-- attr_list={}; print(p.linkFormDateAttrList{date="2026", attr_list=attr_list, attr_date="Datum", attr_day="Tag", attr_year="Jahr"}); mw.logObject(attr_list)
	-- attr_list={}; print(p.linkFormDateAttrList{date="April 2026", attr_list=attr_list, attr_date="Datum", attr_day="Tag", attr_year="Jahr"}); mw.logObject(attr_list)
	-- attr_list={}; print(p.linkFormDateAttrList{date="2026/02", attr_list=attr_list, attr_date="Datum", attr_day="Tag", attr_year="Jahr"}); mw.logObject(attr_list)
	local t = ""
	if args.date ~= nil then
	    -- date zerteilen
	    local date_array
		if string.find(args.date, "/") ~= nil then									-- regular case YYYY/MM/DD
	    	date_array = str.split(args.date, "/")
	    else																		-- ISO-P case YYYY-MM-DD
	    	date_array = str.split(args.date, "-")
		end
		-- Fälle unterscheiden
	    local day, month, year
	    if com.isEmpty(date_array[2]) then											-- "2026" oder "April 2026"
	    	-- When datestring contained no "/" => only year
	    	if com.isInteger(date_array[1]) then
	    		-- When dateformat is just YYYY
	    		year = date_array[1]
	    		t = "[[" .. year .. "]]"
	    	else
	    		-- Dateformat is <monthname> YYYY
	    		local mda = str.split(date_array[1])
	    		year = mda[2]
	    		t = mda[1] .. " [[" .. year .. "]]"
	    	end
	    elseif com.isEmpty(date_array[3]) then										-- "2026/02"
	    	-- Datestring contained one "/"
	    	month = kal.month_names[tonumber(date_array[2])]
	   		year = date_array[1]
	    	t = month .. " [[" .. year .. "]]"
	    else
	    	-- Dateformat should be YYYY/MM/DD or YYYY-MM-DD
	    	month = kal.month_names[tonumber(date_array[2])]
	    	date_array[3] = date_array[3]:gsub('0*', '', 1)
	    	day = date_array[3] .. ". " .. month
	    	year = date_array[1]
	    	t = "[[" .. day .. "]]" .. " [[" .. year .. "]]"
	    end
	    -- Werte in Attributeliste eintragen. Bei nil wird nix eingetragen
	   	smw.addAttrToList(args.attr_list, args.attr_date, args.date)
	    smw.addAttrToList(args.attr_list, args.attr_date .. "Lfd", t)
	   	smw.addAttrToList(args.attr_list, args.attr_day, day)
	    smw.addAttrToList(args.attr_list, args.attr_year, year)
	end -- if args.date ~= nil then
    return t
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 com.isEmpty(date_array[2]) then
    	-- When datestring contained no " ", thus is year
    	return "[[" .. date_array[1] .. "]]"
	elseif com.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 com.isEmpty(date_array[2]) then
		-- When datestring contained no " ", thus is year
		return date_array[1]
	elseif com.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 = kal.month_numbers[date_array[2]]
		mnr = string.format("%02d", mnr)
		return date_array[3] .. "/" .. mnr .. "/" .. day
	end
end

return p