Editing Module:D'ni Time
From Guild of Archivists
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 2: | Line 2: | ||
dnitools = require("Module:D'ni Tools") | dnitools = require("Module:D'ni Tools") | ||
local p = {} | local p = {} | ||
Line 19: | Line 15: | ||
local msPerProrahn = msPerHahr / prorahnteePerHahr | local msPerProrahn = msPerHahr / prorahnteePerHahr | ||
local refProrahnteePerHahr = 9647 * 290 * 5 * 25 * 25 * 25 | local refProrahnteePerHahr = 9647 * 290 * 5 * 25 * 25 * 25 | ||
local vaileetee = {"Leefo","Leebro","Leesahn","Leetar","Leevot","Leevofo","Leevobro","Leevosahn","Leevotar","Leenovoo"} | |||
local vaileetee_dnifont = {"lEfo","lEbro","lEsan","lEtar","lEvot","lEvofo","lEvobro","lEvosan","lEvotar","lEnovU"} | |||
local leapSecTimeStamps = {2272060800, 2287785600, 2303683200, 2335219200, 2366755200, 2398291200, 2429913600, 2461449600, 2492985600, 2524521600, 2571782400, 2603318400, 2634854400, 2698012800, 2776982400, 2840140800, 2871676800, 2918937600, 2950473600, 2982009600, 3029443200, 3076704000, 3124137600, 3345062400, 3439756800, 3550089600, 3644697600, 3692217600} | local leapSecTimeStamps = {2272060800, 2287785600, 2303683200, 2335219200, 2366755200, 2398291200, 2429913600, 2461449600, 2492985600, 2524521600, 2571782400, 2603318400, 2634854400, 2698012800, 2776982400, 2840140800, 2871676800, 2918937600, 2950473600, 2982009600, 3029443200, 3076704000, 3124137600, 3345062400, 3439756800, 3550089600, 3644697600, 3692217600} | ||
Line 197: | Line 196: | ||
return os.date("*t",surfaceTimestamp) | return os.date("*t",surfaceTimestamp) | ||
end | end | ||
-- ==Parse Functions== | |||
local vaileetee = {'Leefo','Leebro','Leesahn','Leetar','Leevot','Leevofo','Leevobro','Leevosahn','Leevotar','Leenovoo'} | |||
if true then | |||
local function index_by_name(array) | |||
local dict = {} | |||
for i,name in pairs(array) do | |||
name = name:lower() | |||
dict[name] = i - 1 | |||
end | |||
return dict | |||
end | |||
vailee_by_name = index_by_name(vaileetee) | |||
end | |||
local function lookup_vailee(s) | |||
local vailee = vailee_by_name[s:lower()] | |||
if not vailee then error('expected vailee, got "'..s..'"') end | |||
return vailee | |||
end | |||
-- We do not want to pass the date table to tonumber(), just the string. | |||
local function parseint(s) | |||
return tonumber(s) | |||
end | |||
-- The known date/time format codes. The default action is | |||
-- parseint(), since most values are just integers, exactly as we need | |||
-- them. | |||
local fmt_details = { | |||
hhhh = { '%d%d%d%d', 'hahr' }; | |||
v = { '%d+', 'vailee' }; | |||
vv = { '%d%d', 'vailee' }; | |||
vvvv = { '%a+', 'vailee', lookup_vailee }; | |||
y = { '%d+', 'yahr' }; | |||
yy = { '%d%d', 'yahr' }; | |||
g = { '%d+', 'gahrtahvo' }; | |||
gg = { '%d%d', 'gahrtahvo' }; | |||
t = { '%d+', 'tahvo' }; | |||
tt = { '%d%d', 'tahvo' }; | |||
r = { '%d+', 'gorahn' }; | |||
rr = { '%d%d', 'gorahn' }; | |||
p = { '%d+', 'prorahn' }; | |||
pp = { '%d%d', 'prorahn' }; | |||
[' '] = { '%s*', 'whitespace' }; -- Allow omission. | |||
[','] = { '%s*,?', 'a comma' }; -- Allow omission and leading whitespace. | |||
w = { '%a+', 'a word' }; -- Value ignored. | |||
n = { '%d+', 'a number' }; -- Value ignored. | |||
} | |||
-- Splits one part of a format string off; returns that and the rest. | |||
local function split_fmt(fmt) | |||
local c = fmt:match('^(%a)') | |||
if c then | |||
return fmt:match('^('..c..'+)(.*)') | |||
elseif #fmt > 0 then | |||
return fmt:sub(1,1), fmt:sub(2) | |||
end | |||
end | |||
-- Parses the string, s, according to the format, fmt. | |||
local function parseDniDateStr(s, fmt) | |||
local matched, d = '', {hahr=1,yahr=1,vailee=1,gahrtahvo=0,tahvo=0,gorahn=0,prorahn=0} | |||
local function fail(what, pattern) | |||
if pattern then what = what..' ('..pattern..')' end | |||
if matched ~= '' then what = what..' after "'..matched..'"' end | |||
error('expected '..what..', got "'..s..'"') | |||
end | |||
while fmt ~= '' do | |||
local head_fmt, rest_fmt = split_fmt(fmt) | |||
local pattern, field, fun = unpack(fmt_details[head_fmt] or {}) | |||
local part, rest | |||
if pattern then | |||
part, rest = s:match('^('..pattern..')(.*)') | |||
if not part then fail(field,head_fmt) end | |||
d[field] = (fun or parseint)(part,d) | |||
matched = matched .. part | |||
elseif head_fmt:find('^%a') then | |||
error('unknown date/time pattern: '..head_fmt) | |||
elseif s:sub(1,#head_fmt) ~= head_fmt then | |||
fail('"'..head_fmt..'"') | |||
else | |||
matched = matched .. s:sub(1,#head_fmt) | |||
rest = s:sub(#head_fmt + 1) | |||
end | |||
s, fmt = rest, rest_fmt | |||
end | |||
if s ~= '' then fail('nothing') end | |||
return d | |||
end | |||
local function parseSurfaceDateStr(dateStr) | |||
-- Given a surface data string, accepts formats that #time accepts | |||
-- Returns a surfaceDate (table) | |||
lang = mw.getContentLanguage() | |||
surfaceTimeStamp = lang:formatDate("U",dateStr) | |||
surfaceTime = os.date("!*t",surfaceTimeStamp) | |||
surfaceTime['isdst'] = true | |||
return surfaceTime | |||
end | |||
-- ==Display Functions== | |||
local function getVaileeName(vailee, useDniFont) | |||
-- Return name of vailee given number (zero-indexed) | |||
-- If useDniFont is true, return it in Dnifont text | |||
useDniFont = useDniFont or false | |||
if(useDniFont) then | |||
return vaileetee_dnifont[vailee+1] | |||
else | |||
return vaileetee[vailee+1] | |||
end | |||
end | |||
local function displayDniTime(dniTime) | |||
-- Return dniTime (table) as string of table | |||
return '{'..'hahr = '..dniTime['hahr']..', vailee = '..dniTime['vailee']..', vaileeName = '..getVaileeName(dniTime['vailee'])..', yahr = '..dniTime['yahr']..', gahrtahvo = '..dniTime['gahrtahvo']..', tahvo = '..dniTime['tahvo']..', gorahn = '..dniTime['gorahn']..', prorahn = '..dniTime['prorahn']..'}' | |||
end | |||
local function displaySurfaceTime(surface) | |||
-- Return surfaceTime (table) as string of table | |||
return '{'..'year = '..surface['year']..', month = '..surface['month']..', day = '..surface['day']..', hour = '..surface['hour']..', min = '..surface['min']..', sec = '..surface['sec']..', isdst = '..tostring(surface['isdst'])..'}' | |||
end | |||
local function formatSurfaceTime(surfaceTime,format) | |||
format = format or 'c' | |||
lang = mw.getContentLanguage() | |||
return lang:formatDate(format,tostring(surfaceTime['year'])..'/'..tostring(surfaceTime['month'])..'/'..tostring(surfaceTime['day'])..' '..tostring(surfaceTime['hour'])..':'..tostring(surfaceTime['min'])..':'..tostring(surfaceTime['sec'])) | |||
end | |||
local function formatDniTime(dniTime,format) | |||
-- Given a DniTime (table), returns formatted string. | |||
-- format is a string with patterns for parts of the date, like standard dates | |||
-- Patterns in capitals padded with zeroes | |||
-- HHHH, hhhh = hahr (4-digits, Uppercase includes +/-) | |||
-- hh = last two digits of the hahr | |||
-- XX = 'era' (BE or DE) | |||
-- VVVV = vailee by name | |||
-- VV,vv = vailee (1 indexed) | |||
-- YY, yy = yahr | |||
-- GG, gg = gahrtahvo | |||
-- TT, tt = tahvo | |||
-- RR, rr = gorahnn | |||
-- PP, pp = prorahn | |||
format = format or "HHHH VVVV yy gg:tt:rr:pp" | |||
result = format | |||
if (dniTime['hahr'] < 0) then | |||
era = "BE" | |||
sign = "-" | |||
else | |||
era = "DE" | |||
sign = "+" | |||
end | |||
result = string.gsub(result,"%a+", { | |||
["dHHHH"] = dnitools._num2dnifont(math.abs(dniTime['hahr']),4), | |||
["HHHH"] = string.format("%04d",tostring(dniTime['hahr'])), | |||
["dhhhh"] = dnitools._num2dnifont(math.abs(dniTime['hahr'])), | |||
["hhhh"] = math.abs(dniTime['hahr']), | |||
["dhh"] = dnitools._num2dnifont(string.sub(dniTime['hahr'],-2)), | |||
["hh"] = string.sub(dniTime['hahr'],-2), | |||
["dYY"] = dnitools._num2dnifont(dniTime['yahr'],2), | |||
["YY"] = string.format("%02d",tostring(dniTime['yahr'])), | |||
["dyy"] = dnitools._num2dnifont(dniTime['yahr']), | |||
["yy"] = dniTime['yahr'], | |||
["dVVVV"] = getVaileeName(dniTime['vailee'],true), | |||
["VVVV"] = getVaileeName(dniTime['vailee']), | |||
["VV"] = string.format("%02d",tostring(dniTime['vailee']+1)), | |||
["dvv"] = dnitools._num2dnifont(dniTime['vailee'] + 1), | |||
["vv"] = dniTime['vailee'] + 1, | |||
["GG"] = string.format("%02d",tostring(dniTime['gahrtahvo'])), | |||
["dgg"] = dnitools._num2dnifont(dniTime['gahrtahvo']), | |||
["gg"] = dniTime['gahrtahvo'], | |||
["TT"] = string.format("%02d",tostring(dniTime['tahvo'])), | |||
["dtt"] = dnitools._num2dnifont(dniTime['tahvo']), | |||
["tt"] = dniTime['tahvo'], | |||
["RR"] = string.format("%02d",tostring(dniTime['gorahn'])), | |||
["drr"] = dnitools._num2dnifont(dniTime['gorahn']), | |||
["rr"] = dniTime['gorahn'], | |||
["PP"] = string.format("%02d",tostring(dniTime['prorahn'])), | |||
["pp"] = dniTime['prorahn'], | |||
["dpp"] = dnitools._num2dnifont(dniTime['prorahn']), | |||
["XX"] = era, | |||
["X"] = sign, | |||
}) | |||
return result | |||
end | |||
-- ============================================================================= | -- ============================================================================= | ||
Line 221: | Line 426: | ||
preprocessSingleArg('datetime') | preprocessSingleArg('datetime') | ||
preprocessSingleArg('format') | preprocessSingleArg('format') | ||
if args['datetime'] then | if args['datetime'] then | ||
output = formatDniTime(surface2DniTime(makeSurfaceTimeStamp(parseSurfaceDateStr(args['datetime']))),args['format']) | |||
else | else | ||
preprocessSingleArg('year') | preprocessSingleArg('year') | ||
Line 235: | Line 438: | ||
-- Parse the data parameters | -- Parse the data parameters | ||
surface = {year = args['year'], month = args['month'] | surface = {year = args['year'], month = args['month'], day = args['day'], hour = args['hour'], min = args['minute'], sec = args['second']} | ||
-- return displaySurfaceTime(surface) | |||
output = formatDniTime(surface2DniTime(makeSurfaceTimeStamp(surface)),args['format']) | |||
end | end | ||
return output | return output | ||
Line 254: | Line 457: | ||
preprocessSingleArg('datetime') | preprocessSingleArg('datetime') | ||
preprocessSingleArg('format') | preprocessSingleArg('format') | ||
if args['datetime'] then | if args['datetime'] then | ||
output = | output = displaySurfaceTime(dni2SurfaceTime(dni)) | ||
else | else | ||
preprocessSingleArg('hahr') | preprocessSingleArg('hahr') | ||
Line 270: | Line 472: | ||
dni = {hahr = tonumber(args['hahr']), vailee = tonumber(args['vailee']), yahr = tonumber(args['yahr']), gahrtahvo = tonumber(args['gahrtahvo']), tahvo = tonumber(args['tahvo']), gorahn = tonumber(args['gorahn']), prorahn = tonumber(args['prorahn'])} | dni = {hahr = tonumber(args['hahr']), vailee = tonumber(args['vailee']), yahr = tonumber(args['yahr']), gahrtahvo = tonumber(args['gahrtahvo']), tahvo = tonumber(args['tahvo']), gorahn = tonumber(args['gorahn']), prorahn = tonumber(args['prorahn'])} | ||
-- | -- return displaySurfaceTime(surface) | ||
output = | output = formatSurfaceTime(dni2SurfaceTime(dni),args['format']) | ||
end | end | ||
Line 291: | Line 493: | ||
lang = mw.getContentLanguage() | lang = mw.getContentLanguage() | ||
timeStr = "9647 23 2 3 4 5 6" | |||
fmtStr = "hhhh y v g t r p" | |||
output = | output = timeStr .. " - " .. fmtStr | ||
output = output .. "<br/>"..displayDniTime(parseDniDateStr(timeStr, fmtStr)) | |||
output = output .. "<br/>". | |||