Jump to content

Module:DatesWD

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Carn (talk | contribs) at 17:40, 31 December 2019 (=(). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

local p = {}
local bool_to_number={ [true]=1, [false]=0 }
local getArgs = require('Module:Arguments').getArgs

function p.NthDay( frame )
    local args = getArgs(frame, { frameOnly = true })
    local num = math.floor(tonumber(args[1])) 
    local wday = math.floor(tonumber(args[2])) 
    local mont = math.floor(tonumber(args[3])) 
    local yea = math.floor(tonumber(args[4])) 
    local format = args[5]
    local bool_to_number={ [true]=1, [false]=0 } 
    local err = "---"
    if num < -5 or num > 5 then 
        error("The number must be between -5 and 5")
    elseif num == 0 then
        error("The number must not be zero")
    end
    if wday < 0 or wday > 6 then 
        error("The day of the week must be between 0 and 6") end
    if mont < 0 or mont > 12 then 
        error("The month must be between 1 and 12") end
    if yea < 0 or yea > 9999 then 
        error("Wrong year number") end
    if num > 0 and num < 6 then
        local m_start = os.time{year=yea, month=mont, day=1, hour=0}
        local m_wds = tonumber(os.date("%w", m_start)) 
        local start_shift = (
            (num - bool_to_number[wday >= m_wds]) * 7 
            - (m_wds - wday)
            ) * 24 * 60 * 60
        local tim = m_start + start_shift
        if tonumber(os.date("%m", tim)) == mont then
            return (os.date(format, tim))
        else
            return (err)
        end
    elseif num < 0 and num > -6 then
        local m_end = os.time{year = yea, month = mont + 1, day = 1, hour = 0} - 24 * 60 * 60
        local m_wde = tonumber(os.date("%w", m_end))
        local end_shift = ((math.abs(num + 1) + bool_to_number[wday > m_wde]) * 7 
            + (m_wde - wday)) * 24 * 60 * 60
        local tim = m_end - end_shift
        if tonumber(os.date("%m", tim)) == mont then
            return (os.date(format, tim))
        else
            return (err)
        end
    end
end

local function purif(str)
    if str == "" or str == nil then 
        return nil 
    elseif type(tonumber(str)) == "number" then
        return math.floor(tonumber(str))
    else
        return nil
    end
    -- need .5 -- ,5 number format converter
    error("You shouldn't read this")
end

local function inborders(val,up,down)
	if up < down then
		local err = "Range " .. down .. "-" .. up " is not valid."
		error(err) 
    end
    if val < down or val > up then 
    	local err = "Value " .. val .. " not in the " .. down .. "-" .. up .. " range."
        error(err) 
    end
end	

-- =p.test(mw.getCurrentFrame():newChild{title="обычно не важно",args={"1"}}) 

function p.test(frame)
	local args = getArgs(frame, { frameOnly = true })
	input = args[1]
	if not purif(input) then
		return ""
	else
		inborders(purif(input),1,12)
		return purif(input)
	end
	error("You shouldn't read this too")
end

return p