Module:Sandbox/BrandonXLF/1

This is an old revision of this page, as edited by BrandonXLF (talk | contribs) at 17:41, 22 August 2024 (Test Module:Road data changes). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

-- Sandbox, do not delete

require('strict')

local p = {}

-- Parameters that can be numbered
local numeredParams = {
	service = true,
	dest = true,
	note = true
}

-- Labels for platform types
local platformLabels = {
	island = 'Island platform',
	top = 'Side platform',
	bottom = 'Side platform'
}

-- Generate the HTML to display a service
local function displayService(service, dest, note, dir)
	if not service then return '' end
	
	return '<div class="service">' ..
		'<div class="' .. (dir ~= 'left' and 'hidden' or '') .. '">←</div>' ..
		'<div>' .. service .. (dest and ' toward ' .. dest or '') .. (note and ' ' .. note or '') .. '</div>' ..
		(dir == 'right' and '<div>→</div>' or '') ..
	'</div>'
end

-- Generate the HTML to display a track (one or more services)
local function displayTrack(floorPart)
	if not floorPart.service then
		return ''
	end
	
	floorPart.dest = floorPart.dest or {}
	floorPart.note = floorPart.note or {}
	
	local out = ''
	
	for i = 1, floorPart.service.max do
		out = out .. displayService(floorPart.service[i], floorPart.dest[i], floorPart.note[i], floorPart.dir)
	end
	
	return out
end

-- Generate the HTML to generate a "row" of the floor
local function displayFloorPart(floorPart, floorNum, partNum)
	local out = ''
	
	if floorPart.name then
		return '<div class="track"><div>' .. floorPart.name .. '</div></div>' ..
			'<div class="track"><div class="desc"><div>' .. (floorPart.desc or '') .. '</div>' .. displayTrack(floorPart) .. '</div></div>'
	end
	
	if floorPart.platform then
		if not platformLabels[floorPart.platform] then
			return '<div class="part-error">Invalid platform type!</div>'
		end
		
		return '<div class="platform ' .. floorPart.platform .. '">' ..
			platformLabels[floorPart.platform] ..
			(floorPart.accessible and ' ' .. mw.getCurrentFrame():expandTemplate{ title = 'access icon' } or '') ..
			(floorPart.note and ', ' .. floorPart.note or '') ..
		'</div>'
	end 

	local prefix = floorNum .. '_' .. partNum .. '_'
	
	return '<div class="part-error">Invalid floor part! Must have either <code>' .. prefix .. 'name</code> or <code>' .. prefix .. 'platform</code></div>.'
end

-- Generate the HTML to display a floor
local function displayFloor(stationFloor, num, last)
	local out = '<div class="floor' .. (last and ' last' or '') .. '" style="grid-row: span ' .. stationFloor.count .. ';">' .. stationFloor.letter .. '</div>'

	for i = 1, stationFloor.max do
		out = out .. displayFloorPart(stationFloor[i], num, i)
	end
	
	return out
end

-- Create a table that can hold numbered arguments
local function createArgTable(tbl)
	tbl = tbl or {}
	
	tbl.max = 0
	tbl.count = 0
	
	return tbl
end

-- Add an argument number to a table of numbered arguments
local function addArg(tbl, num, value)
	if num > tbl.max then
		tbl.max = num
	end
	
	if not tbl[num] then
		tbl[num] = value
		tbl.count = tbl.count + 1
	end
end
	
-- Process an argument with the format level_part_param[paramNum]
local function processArg(out, level, part, param, paramNum, value)
	level = tonumber(level)
	part = tonumber(part)
	paramNum = paramNum and tonumber(paramNum) or 1
	
	addArg(out, level, createArgTable())
	addArg(out[level], part, {})
	
	if numeredParams[param] then
		if not out[level][part][param] then
			out[level][part][param] = createArgTable()
		end
		
		addArg(out[level][part][param], paramNum, value)
	else
		out[level][part][param] = value
	end
end
	
-- Process the argument table
local function processArgs(args)
	local out = createArgTable()
	
	for i, v in pairs(args) do
		if type(i) == 'number' then
			addArg(out, i, createArgTable({ letter = v }))
		else
			local level, part, param, paramNum = i:match('(%d+)_(%d+)_([^%d]+)(%d*)')
			
			if level and part and param then
				processArg(out, level, part, param, paramNum, v)
			end
		end
	end
	
	return out
end

-- Main function, called by wikitext
function p.main(frame)
	local sortedArgs = processArgs(frame.args)
	local out = frame:extensionTag{
		name = 'templatestyles',
		args = { src = 'User:BrandonXLF/styles.css' }
	}
	
	out = out .. '<div class="station-layout">'
	
	for i = 1, sortedArgs.max do
		out = out .. displayFloor(sortedArgs[i], i, i == sortedArgs.max)
	end
	
	return out .. '</div>'
end

function p.test(frame)
	local modules = {
		"Module:Road data/strings/USA",	
		"Module:Road data/strings/CAN/ON",	
		"Module:Road data/strings/USA/TX",	
		"Module:Road data/strings/USA/NJ",	
		"Module:Road data/strings/USA/NY",	
		"Module:Road data/strings/USA/WA",	
		"Module:Road data/strings/USA/AR",	
		"Module:Road data/strings/USA/AS",	
		"Module:Road data/strings/GBR",	
		"Module:Road data/strings/MEX",	
		"Module:Road data/strings/HKG",	
		"Module:Road data/strings/USA/GA",	
		"Module:Road data/strings/USA/IA",	
		"Module:Road data/strings/USA/MI",	
		"Module:Road data/strings/USA/MN",	
		"Module:Road data/strings/USA/AZ",	
		"Module:Road data/strings/USA/KY",	
		"Module:Road data/strings/USA/NH",	
		"Module:Road data/strings/USA/SC",	
		"Module:Road data/strings/USA/TN",	
		"Module:Road data/strings/USA/NC",	
		"Module:Road data/strings/USA/PA",	
		"Module:Road data/strings/USA/VA",	
		"Module:Road data/strings/USA/FL",	
		"Module:Road data/strings/USA/IL",	
		"Module:Road data/strings/USA/AL",	
		"Module:Road data/strings/USA/LA",	
		"Module:Road data/strings/USA/NV",	
		"Module:Road data/strings/USA/MS",	
		"Module:Road data/strings/USA/IN",	
		"Module:Road data/strings/USA/OH",	
		"Module:Road data/strings/USA/AK",	
		"Module:Road data/strings/AUS",	
		"Module:Road data/strings/USA/OR",	
		"Module:Road data/strings/USA/DE",	
		"Module:Road data/strings/CHN",	
		"Module:Road data/strings/USA/RI",	
		"Module:Road data/strings/JPN",	
		"Module:Road data/strings/USA/CO",	
		"Module:Road data/strings/USA/WI",	
		"Module:Road data/strings/USA/CT",	
		"Module:Road data/strings/USA/WY",	
		"Module:Road data/strings/USA/VT",	
		"Module:Road data/strings/CAN/SK",	
		"Module:Road data/strings/USA/ME",	
		"Module:Road data/strings/USA/CA",	
		"Module:Road data/strings/USA/MO",	
		"Module:Road data/strings/USA/KS",	
		"Module:Road data/strings/USA/WV",	
		"Module:Road data/strings/USA/HI",	
		"Module:Road data/strings/USA/VI",	
		"Module:Road data/strings/USA/GU",	
		"Module:Road data/strings/USA/PR",	
		"Module:Road data/strings/EUR",	
		"Module:Road data/strings/USA/MA",	
		"Module:Road data/strings/USA/NM",	
		"Module:Road data/strings/USA/MT",	
		"Module:Road data/strings/USA/ND",	
		"Module:Road data/strings/IND",	
		"Module:Road data/strings/USA/SD",	
		"Module:Road data/strings/CAN/NS",	
		"Module:Road data/strings/USA/ID",	
		"Module:Road data/strings/USA/NE",	
		"Module:Road data/strings/USA/UT",	
		"Module:Road data/strings/USA/MD",	
		"Module:Road data/strings/USA/OK",	
		"Module:Road data/strings/CAN/QC",	
		"Module:Road data/strings/ESP",	
		"Module:Road data/strings/PHL",	
		"Module:Road data/strings/AUT",	
		"Module:Road data/strings/BRA",	
		"Module:Road data/strings/NZL",	
		"Module:Road data/strings/HRV",	
		"Module:Road data/strings/BEL",	
		"Module:Road data/strings/FRA",	
		"Module:Road data/strings/GHA",	
		"Module:Road data/strings/CAN/NB",	
		"Module:Road data/strings/TWN",	
		"Module:Road data/strings/NLD",	
		"Module:Road data/strings/ZAF",	
		"Module:Road data/strings/IRL",	
		"Module:Road data/strings/ASIA",	
		"Module:Road data/strings/RUS",	
		"Module:Road data/strings/CAN/MB",	
		"Module:Road data/strings/CAN/NL",	
		"Module:Road data/strings/JOR",	
		"Module:Road data/strings/NOR",	
		"Module:Road data/strings/USA/DC",	
		"Module:Road data/strings/DEU",	
		"Module:Road data/strings/USA/MP",	
		"Module:Road data/strings/PER",	
		"Module:Road data/strings/LVA",	
		"Module:Road data/strings/TUR",	
		"Module:Road data/strings/PRT",	
		"Module:Road data/strings/DNK",	
		"Module:Road data/strings/GEO",	
		"Module:Road data/strings/LKA",	
		"Module:Road data/strings/MNE",	
		"Module:Road data/strings/CAN/YT",	
		"Module:Road data/strings/HUN",	
		"Module:Road data/strings/CRI",	
		"Module:Road data/strings/UZB",	
		"Module:Road data/strings/SVK",	
		"Module:Road data/strings/URY",	
		"Module:Road data/strings/ROU",	
		"Module:Road data/strings/BWA",	
		"Module:Road data/strings/ITA",	
		"Module:Road data/strings/ISL",	
		"Module:Road data/strings/ARE",	
		"Module:Road data/strings/LUX",	
		"Module:Road data/strings/BEN",	
		"Module:Road data/strings/DJI",	
		"Module:Road data/strings/COL",	
		"Module:Road data/strings/CZE",	
		"Module:Road data/strings/POL",	
		"Module:Road data/strings/NPL",	
		-- "Module:Road data/strings/USA/regional/NER",	
		"Module:Road data/strings/UKR",	
		"Module:Road data/strings/KAZ",	
		"Module:Road data/strings/BLR",	
		"Module:Road data/strings/BOL",	
		"Module:Road data/strings/LAO",	
		"Module:Road data/strings/LTU",	
		"Module:Road data/strings/SWE",	
		"Module:Road data/strings/ALB",	
		"Module:Road data/strings/BGD",	
		"Module:Road data/strings/GRC",	
		"Module:Road data/strings/AZE",	
		"Module:Road data/strings/EST",	
		"Module:Road data/strings/KGZ",	
		"Module:Road data/strings/KOR",	
		"Module:Road data/strings/VNM",	
		"Module:Road data/strings/LSO",	
		"Module:Road data/strings/ECU",	
		"Module:Road data/strings/ZMB",	
		"Module:Road data/strings/CYP",	
		"Module:Road data/strings/BIH",	
		"Module:Road data/strings/CAN/PE",	
		"Module:Road data/strings/VEN",	
		"Module:Road data/strings/MDA",	
		"Module:Road data/strings/CAN/AB",	
		"Module:Road data/strings/BGR",	
		"Module:Road data/strings/NIC",	
		"Module:Road data/strings/SVN",	
		"Module:Road data/strings/SRB",	
		"Module:Road data/strings/CAN/NT",	
		"Module:Road data/strings/IRN",	
		"Module:Road data/strings/CAN",	
		"Module:Road data/strings/ARM",	
		"Module:Road data/strings/ISR",	
		"Module:Road data/strings/OMN",	
		"Module:Road data/strings/IDN",	
		"Module:Road data/strings/CHE",	
		"Module:Road data/strings/CHL",	
		"Module:Road data/strings/CAN/BC",	
		"Module:Road data/strings/AND",	
		"Module:Road data/strings/FIN",	
		"Module:Road data/strings/MKD",	
		"Module:Road data/strings/ARG",	
		"Module:Road data/strings/IRQ",	
		"Module:Road data/strings/NAM",	
		"Module:Road data/strings/THA",	
		"Module:Road data/strings/UNK",	
		"Module:Road data/strings/KOS",	
		"Module:Road data/strings/IMN",	
		"Module:Road data/strings/SCT",	
		-- "Module:Road data/strings/USA/regional/Tour",	
		"Module:Road data/strings/CPV",	
		"Module:Road data/strings/ALA",	
		"Module:Road data/strings/ENG",	
		"Module:Road data/strings/GUF",	
		"Module:Road data/strings/PAK",	
		"Module:Road data/strings/GLP",	
		-- "Module:Road data/strings/USA/regional/Trails",	
		"Module:Road data/strings/CUB",	
		"Module:Road data/strings/MTQ",	
		"Module:Road data/strings/SAD",	
		"Module:Road data/strings/JAM",	
		"Module:Road data/strings/WLS",	
		-- "Module:Road data/strings/USA/regional/GRR",	
		"Module:Road data/strings/PRY",	
		"Module:Road data/strings/JEY",	
		"Module:Road data/strings/LIE",	
		"Module:Road data/strings/DOM",	
		"Module:Road data/strings/KEN",	
		"Module:Road data/strings/TAH",	
		"Module:Road data/strings/NIR",	
		"Module:Road data/strings/GGY",	
		"Module:Road data/strings/DZA",	
		"Module:Road data/strings/BLZ",	
		"Module:Road data/strings/MMR",	
		"Module:Road data/strings/GIB",	
		"Module:Road data/strings/BRN",	
		"Module:Road data/strings/REU",	
		"Module:Road data/strings/AFR",	
		"Module:Road data/strings/MYS",	
		"Module:Road data/strings/AFG",	
		"Module:Road data/strings/KAM",	
		"Module:Road data/strings/NGA",	
		"Module:Road data/strings/PRI",	
		"Module:Road data/strings/MWI",	
		"Module:Road data/strings/AFRICA",	
		"Module:Road data/strings/CAF",	
		"Module:Road data/strings/TZA",	
		"Module:Road data/strings/PK"
	}
	
	local out = ''
	
	for i, module in ipairs(modules) do
		local exports = require(module)
		local parts = mw.text.split(module)
		
		for type, v in ipairs(exports) do
			out = out .. frame:expandTemplate{ title = 'Jct', args = {
				type,
				'1',
				country = parts[3],
				state = parts[4] or ''
			} }
		end
	end
	
	return out
end 

return p