Module:GameTime
Jump to navigation
Jump to search
Documentation for this module may be created at Module:GameTime/doc
local common = require('Module:Common')
local l10n = require('Module:Common/Language')
local p = {}
local timePeriods = {
{
["name"] = "morning",
["game"] = {
["start"] = "3:00",
["end"] = "6:00"
},
["real"] = {
["start"] = "",
["end"] = ""
}
},
{
["name"] = "day",
["game"] = {
["start"] = "6:00",
["end"] = "18:00"
},
["real"] = {
["start"] = "",
["end"] = ""
}
},
{
["name"] = "evening",
["game"] = {
["start"] = "18:00",
["end"] = "21:00"
},
["real"] = {
["start"] = "",
["end"] = ""
}
},
{
["name"] = "night",
["game"] = {
["start"] = "21:00",
["end"] = "3:00"
},
["real"] = {
["start"] = "",
["end"] = ""
}
}
}
local function wrapSpan( wikitext, class )
local span = mw.html.create('span')
:addClass( class )
if type(wikitext) == 'table' then
return span:node( wikitext )
end
return span:wikitext( wikitext )
end
local function finalize( wikitext )
return tostring(
wrapSpan( wikitext, 'template-gametime' )
:allDone()
)
end
local function finalizeKey( key, language )
return ("'''%s'''"):format(l10n.localizedKey('Template:GameTime/Messages', key, language) or key)
end
local function addTime( list, names, timeStart, timeEnd )
table.insert( list, {
['names'] = names,
['start'] = timeStart,
['end'] = timeEnd
})
end
local function formatTime( frame, t )
return frame:expandTemplate{ title = 'Time', args = { t } }
end
local function map( period )
local low = mw.text.trim( period ):lower()
if low == 'all day' then
return 'all'
elseif low == 'any time' then
return 'any'
end
return low
end
local function join( frame, list, style, language )
local out = mw.html.create( nil )
if #list == 0 then
return out
end
local entries = {}
for _, entry in pairs( list ) do
local entry = l10n.listToText( entry['names'], language )
-- Space separator
.. ' '
.. tostring(wrapSpan(
-- Text
'('
.. formatTime( frame, entry['start'] )
.. ' - '
.. formatTime( frame, entry['end'] )
.. ')',
-- Class
'gametime-detail'
):allDone())
-- If the style is a list, wrap every list entry in the span
if style == 'list' then
entry = finalize( entry )
end
table.insert( entries, entry )
end
if style == 'list' then
return out:wikitext( '* ' .. mw.text.listToText( entries, '\n* ', '\n* ' ) )
end
return finalize(
out:wikitext( l10n.listToText( entries, language ) )
)
end
function p.main( frame )
local args = common.getArgs( frame )
local out = {}
if #args <= 0 then
return finalize('Empty')
end
local language = l10n.getContentLanguage(frame)
-- Collect a list of values from the comma-separated input
local list = {}
for timePeriod in mw.text.gsplit( args[1], ',' ) do
local trimmed = map( timePeriod )
if trimmed == 'all' then
return finalizeKey('all', language)
elseif trimmed == 'any' then
return finalizeKey('any', language)
end
table.insert(list, trimmed)
end
local names = {}
local timeStart = nil
local timeEnd = nil
-- Iterate over our game times to generate a string
for _, timePeriod in pairs(timePeriods) do
if common.contains( list, timePeriod['name'] ) then
local localized = l10n.localizedKey('Template:GameTime/Messages', timePeriod['name'], language)
local game = timePeriod['game']
-- Add bolding to the name
localized = "'''" .. localized .. "'''"
if timeStart == nil and timeEnd == nil then
names = { localized }
timeStart = game['start']
timeEnd = game['end']
elseif timeEnd == game['start'] then
table.insert( names, localized )
timeEnd = game['end']
else
addTime( out, names, timeStart, timeEnd )
names = { localized }
timeStart = game['start']
timeEnd = game['end']
end
end
end
if timeStart ~= nil and timeEnd ~= nil then
if timeStart == timeEnd then
return finalizeKey('any', language)
end
addTime( out, names, timeStart, timeEnd )
end
return join( frame, out, args['style'], language )
end
return p