Module:Sandbox/DixonD/DateTemplates

From Wikipedia, the free encyclopedia
local DateTime = require("Module:Sandbox/DixonD/Datetime");
local Math = require("Module:Math");
local Error = require('Module:Error')

local z = {}

-- utility functions
local function getArgs(frame)
    local args = frame.args;
    
    -- if there are any arguments, then assume that we've got proper ones
    for k,v in pairs(args) do 
        return args
    end
    
    -- otherwise, return args from the parent
    local parent = frame:getParent();
    return parent.args;
end

local function isError(response)
    return type(response) == 'string' and string.find(response, 'error');
end

--template implementations

-- [[Template:JULIANDAY]]
function z.julianDay(frame)
    local args = getArgs(frame);
    
    return DateTime.julianDay(Math._cleanNumber(args[1]),
        Math._cleanNumber(args[2]), Math._cleanNumber(args[3]),
        Math._cleanNumber(args[4]), Math._cleanNumber(args[5]),
        Math._cleanNumber(args[6]), 'g');
end

-- [[Template:JULIANDAY.YEAR]]
function z.yearOfJulianDay(frame)
    local args = getArgs(frame);
    
    return DateTime.yearOfJulianDay(Math._cleanNumber(args[1]), 'g');
end

-- [[Template:JULIANDAY.MONTH]]
function z.monthOfJulianDay(frame)
    local args = getArgs(frame);
    
    return DateTime.monthOfJulianDay(Math._cleanNumber(args[1]), 'g');
end

-- [[Template:JULIANDAY.DAY]]
function z.dayOfJulianDay(frame)
    local args = getArgs(frame);
    
    return DateTime.dayOfJulianDay(Math._cleanNumber(args[1]), 'g');
end

-- [[Template:JULIANDAY.HOUR]]
function z.hourOfJulianDay(frame)
    local args = getArgs(frame);
    
    return DateTime.hourOfJulianDay(Math._cleanNumber(args[1]), 'g');
end

-- [[Template:JULIANDAY.MINUTE]]
function z.minuteOfJulianDay(frame)
    local args = getArgs(frame);
    
    return DateTime.minuteOfJulianDay(Math._cleanNumber(args[1]), 'g');
end

-- [[Template:JULIANDAY.SECOND]]
function z.secondOfJulianDay(frame)
    local args = getArgs(frame);
    
    return DateTime.secondOfJulianDay(Math._cleanNumber(args[1]), 'g');
end

-- [[Template:JULIANDAY.JULIAN]]
function z.julianDayJulian(frame)
    local args = getArgs(frame);
    
    return DateTime.julianDay(Math._cleanNumber(args[1]),
        Math._cleanNumber(args[2]), Math._cleanNumber(args[3]),
        Math._cleanNumber(args[4]), Math._cleanNumber(args[5]),
        Math._cleanNumber(args[6]), 'j');
end

-- [[Template:Gregorian serial date]]
function z.gregorianSerialDate(frame)
    local args = getArgs(frame);
    
    local currentDate = os.date('!*t');
    
    local year = args.year == nil and currentDate.year or Math._cleanNumber(args.year);
    if year == nil then return Error.error{"Parameter ''year'' has wrong format!"}; end;
    
    local month = args.month == nil and currentDate.month or Math._cleanNumber(args.month);
    if month == nil then return Error.error{"Parameter ''month'' has wrong format!"}; end;
    
    local day = args.day == nil and currentDate.day or Math._cleanNumber(args.day);
    if day == nil then return Error.error{"Parameter ''day'' has wrong format!"}; end;
    
    local julianDay = DateTime.julianDay(year, month, day, nil, nil, nil, 'g');
    
    if isError(julianDay) then return julianDay; end;
    
    return julianDay - 1721425;
end

return z