Modul:LinkFormDatum/Work

Aus FürthWiki

Die Dokumentation für dieses Modul kann unter Modul:LinkFormDatum/Work/Doku erstellt werden

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 = ""
    -- 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)
    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