Module:NavJaor
Documentatie voor deze module kan aangemaakt worden op de volgende pagina: Module:NavJaor/doc
-- Module for navigation by year, decade and/or century
local p = {}
local BC = " v. Chr."
local AD = ""
-- local functions
local function epoch(year)
if year > 0 then
return AD
else
return BC
end
end
local function yearInEpoch(year)
if year <= 0 then
year = -year + 1 -- 0 becomes 1 [BC]
end
return year
end
local function centuryInEpoch(year)
return math.floor((yearInEpoch(year) - 1) / 100) + 1
end
-- returns 0 for the first decade of the epoch
local function decade(year)
return math.floor(yearInEpoch(year) / 10)
end
-- e.g. "22 v. Chr."
local function yearString(year)
return yearInEpoch(year) .. epoch(year)
end
-- e.g. "29-20 v. Chr."
local function decadeString(year)
local decade = decade(year)
local epoch = epoch(year)
local r
if epoch == BC then
if decade == 0 then
r = "9-1" .. epoch
else
r = decade .. "9-" .. decade .. "0" .. epoch
end
else
if decade == 0 then
r = "1-9" .. epoch
else
r = decade .. "0-" .. decade .. "9" .. epoch
end
end
return r
end
-- e.g. "1e eeuw v. Chr."
local function centuryString(year)
return centuryInEpoch(year) .. "e eeuw" .. epoch(year)
end
local function bc(year)
return -year + 1
end
local function link(title, label)
if not label then
return "[[" .. title .. "]]"
else
return "[[" .. title .. "|" .. label .. "]]"
end
end
local function centuries(year)
local r = "'''Eeuwen:''' "
local first = -2
local last = 2
for co = first, last do
local cs = centuryString(year + co * 100)
if (co == first) then
r = r .. link(cs, "<")
elseif (co == last) then
r = r .. link(cs, ">")
elseif (co == 0) then
r = r .. "'''" .. link(cs) .. "'''"
else
r = r .. link(cs)
end
if (co ~= last) then
r = r .. " | "
end
end
return r
end
local function decades(year)
local r = "'''Decennia:''' "
local first = -3
local last = 3
for offset = first, last do
local f
if (year >= bc(9) and year <= 9) and (offset == 1 or offset == -1) then
f = 9
else
f = 10
end
local ds = decadeString(year + offset * f)
if (offset == first) then
r = r .. link(ds, "<")
elseif (offset == last) then
r = r .. link(ds, ">")
elseif (offset == 0) then
r = r .. "'''" .. link(ds) .. "'''"
else
r = r .. link(ds)
end
if (offset ~= last) then
r = r .. " | "
end
end
return r
end
local function years(year)
local r = "'''Jaoren:''' "
local first = -6;
local last = 6;
for i = first, last do
local yearOffset = i
local label
if (i == first) then
yearOffset = yearOffset - 4
label = "<<"
elseif (i == first + 1) then
label = "<"
elseif (i == last - 1) then
label = ">"
elseif (i == last) then
yearOffset = yearOffset + 4
label = ">>"
end
local ys = yearString(year + yearOffset);
if (yearOffset == 0) then
r = r .. "'''" .. link(ys, label) .. "'''"
else
r = r .. link(ys, label)
end
if (i ~= last) then
r = r .. " | "
end
end
return r
end
-- centuries + decades + years
local function cdy(year)
return centuries(year) .. "\n\n" .. decades(year) .. "\n\n" .. years(year)
end
-- centuries + decades
local function cd(year)
return centuries(year) .. "\n\n" .. decades(year)
end
local function yearNumber(yearStr)
local i = mw.ustring.find(yearStr, BC, 1, true)
local r
if i then
r = bc(mw.ustring.sub(yearStr, 1, i))
else
r = tonumber(yearStr)
end
return r
end
-- exported functions
-- centuries + decades
-- argument is a decade, e.g. "1390-1399" or a year
function p.cd(frame)
local str = frame.args[1] or tostring(mw.title.getCurrentTitle())
local i = mw.ustring.find(str, "-", 1, true)
local yearStr
if i then
yearStr = mw.ustring.sub(str, i + 1)
else
yearStr = str
end
local yearNum = yearNumber(yearStr)
return cd(yearNum)
end
-- centuries + decades + years
-- argument is a year, e.g. "22 v. Chr."
function p.cdy(frame)
local yearStr = frame.args[1] or tostring(mw.title.getCurrentTitle())
local yearNum = yearNumber(yearStr)
return cdy(yearNum)
end
-- century e.g. "1e eeuw v. Chr."
-- argument is a year, e.g. "22 v. Chr."
function p.century(frame)
local yearStr = frame.args[1] or tostring(mw.title.getCurrentTitle())
local yearNum = yearNumber(yearStr)
return centuryString(yearNum)
end
return p