Module:GameTime

From Palia Wiki
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