<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ARoutelist_row%2Fsandbox_2</id>
	<title>Module:Routelist row/sandbox 2 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ARoutelist_row%2Fsandbox_2"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Routelist_row/sandbox_2&amp;action=history"/>
	<updated>2026-07-25T18:41:52Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Routelist_row/sandbox_2&amp;diff=144941&amp;oldid=prev</id>
		<title>imported&gt;Fredddie: swap</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Routelist_row/sandbox_2&amp;diff=144941&amp;oldid=prev"/>
		<updated>2022-08-13T02:11:18Z</updated>

		<summary type="html">&lt;p&gt;swap&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {} -- Package to be exported&lt;br /&gt;
&lt;br /&gt;
-- Change to &amp;quot;&amp;quot; upon deployment.&lt;br /&gt;
local moduleSuffix = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local lang = mw.getContentLanguage() -- Built-in locale for date formatting&lt;br /&gt;
local format = mw.ustring.format -- String formatting function&lt;br /&gt;
local insert = table.insert&lt;br /&gt;
local concat = table.concat&lt;br /&gt;
local util = require(&amp;quot;Module:Road data/util&amp;quot;)&lt;br /&gt;
local frame = mw.getCurrentFrame()&lt;br /&gt;
&lt;br /&gt;
local parserModuleName = &amp;quot;Module:Road data/parser&amp;quot; .. moduleSuffix&lt;br /&gt;
local statenameModuleName = &amp;quot;Module:Jct/statename&amp;quot; .. moduleSuffix -- TODO transition&lt;br /&gt;
&lt;br /&gt;
local concat = table.concat&lt;br /&gt;
local insert = table.insert&lt;br /&gt;
local format = mw.ustring.format&lt;br /&gt;
local trim = mw.text.trim&lt;br /&gt;
&lt;br /&gt;
local parserModule = require(parserModuleName)&lt;br /&gt;
local parser = parserModule.parser&lt;br /&gt;
&lt;br /&gt;
-- Shields&lt;br /&gt;
local defaultShieldSize = 28&lt;br /&gt;
&lt;br /&gt;
local function addContextBanner(args, name, suffix, bannerSpec)&lt;br /&gt;
	local bannerModule = &amp;#039;Module:Road data/banners/&amp;#039; .. string.upper(args.country)&lt;br /&gt;
	local shieldfield = name .. &amp;#039;shield&amp;#039;&lt;br /&gt;
	local shield = parser(args, shieldfield)&lt;br /&gt;
	if shield == nil then&lt;br /&gt;
		-- This route type does not define shield.&lt;br /&gt;
		-- Find shield in the default banner table.&lt;br /&gt;
		shield = parser(args, &amp;#039;shield&amp;#039;, name, bannerModule)&lt;br /&gt;
		if shield and shield ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			if suffix == nil then&lt;br /&gt;
				suffix = parser(args, &amp;#039;shield&amp;#039;, &amp;#039;suffix&amp;#039;, bannerModule)&lt;br /&gt;
			end&lt;br /&gt;
			if suffix and suffix ~= &amp;#039;&amp;#039; then&lt;br /&gt;
				shield = shield .. &amp;quot; &amp;quot; .. suffix&lt;br /&gt;
			end&lt;br /&gt;
			shield = shield .. &amp;quot;.svg&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if shield and shield ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		local shieldSize = defaultShieldSize&lt;br /&gt;
		-- Add banner plate.&lt;br /&gt;
		insert(bannerSpec, {shield, shieldSize})&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function bannerSpec(banner, bannerSize, bannerSuffix, route)&lt;br /&gt;
	local banners = {}&lt;br /&gt;
	if type(banner) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		local bannerSizeIsNotTable = type(bannerSize) ~= &amp;quot;table&amp;quot;&lt;br /&gt;
		for i,filename in ipairs(banner) do&lt;br /&gt;
			local bannersize = bannerSizeIsNotTable and bannerSize or bannerSize[i] or defaultShieldSize&lt;br /&gt;
			insert(banners, {filename, bannersize})&lt;br /&gt;
		end&lt;br /&gt;
	elseif banner ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		insert(banners, {banner, bannerSize})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return banners&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function shieldSpec(args, mainShield, shieldList)&lt;br /&gt;
	local shieldSpec = {}&lt;br /&gt;
&lt;br /&gt;
	local shield&lt;br /&gt;
&lt;br /&gt;
	if not shield then shield = parser(args, &amp;#039;shieldlist&amp;#039;) or parser(args, &amp;#039;shield&amp;#039;) or &amp;#039;&amp;#039; end&lt;br /&gt;
	&lt;br /&gt;
	if shield == &amp;#039;&amp;#039; then return shieldSpec end&lt;br /&gt;
	&lt;br /&gt;
	local orientation = parser(args, &amp;#039;orientation&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	local function size(args)&lt;br /&gt;
		if orientation == &amp;quot;upright&amp;quot; then&lt;br /&gt;
			return defaultShieldSize&lt;br /&gt;
			else return &amp;quot;x&amp;quot; .. defaultShieldSize&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local shieldsize = size(args)&lt;br /&gt;
	&lt;br /&gt;
	local banner = parser(args, &amp;#039;banner&amp;#039;) or {}&lt;br /&gt;
	local bannersize = defaultShieldSize&lt;br /&gt;
	local bannersuffix = parser(args, &amp;#039;bannersuffix&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	local bannerIsNotTable = type(banner) ~= &amp;quot;table&amp;quot;&lt;br /&gt;
	local bannersizeIsNotTable = type(bannersize) ~= &amp;quot;table&amp;quot;&lt;br /&gt;
	local bannersuffixIsNotTable = type(bannersuffix) ~= &amp;quot;table&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	if type(shield) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		for i,filename in ipairs(shield) do&lt;br /&gt;
			local size = shieldsize[i] or shieldsize&lt;br /&gt;
			if size == &amp;quot;&amp;quot; then size = nil end&lt;br /&gt;
			-- banner.all describes banners that apply to all multiple shields.&lt;br /&gt;
			local shieldBanner = bannerIsNotTable and banner or (banner[i] or banner.all or {})&lt;br /&gt;
			-- Banner size is default if the corresponding entry&lt;br /&gt;
			-- in bannerSize table is not set.&lt;br /&gt;
			local shieldBannerSize =&lt;br /&gt;
				bannersizeIsNotTable and bannersize&lt;br /&gt;
				or (bannersize[i] or bannersize.all or defaultShieldSize)&lt;br /&gt;
			local shieldBannerSuffix = bannersuffix and (bannersuffixIsNotTable and bannersuffix or bannersuffix[i])&lt;br /&gt;
			insert(shieldSpec, {&lt;br /&gt;
				shield = {filename, size},&lt;br /&gt;
				banners = bannerSpec(shieldBanner, shieldBannerSize, shieldBannerSuffix, route)&lt;br /&gt;
			})&lt;br /&gt;
		end&lt;br /&gt;
	elseif shield ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		if shieldsize == &amp;quot;&amp;quot; then shieldsize = nil end&lt;br /&gt;
		insert(shieldSpec, {&lt;br /&gt;
			shield = {shield, shieldsize},&lt;br /&gt;
			banners = bannerSpec(banner, bannersize,  bannersuffix, route)&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return shieldSpec&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local missingShields&lt;br /&gt;
&lt;br /&gt;
local shieldExistsCache = {}&lt;br /&gt;
&lt;br /&gt;
local function render(shieldEntry, scale, showLink)&lt;br /&gt;
	local shield = shieldEntry.shield&lt;br /&gt;
	local banners = shieldEntry.banners&lt;br /&gt;
&lt;br /&gt;
	local size&lt;br /&gt;
	if shield[2] then&lt;br /&gt;
		local width, height = mw.ustring.match(shield[2], &amp;quot;(%d*)x?(%d*)&amp;quot;)&lt;br /&gt;
		width = tonumber(width)&lt;br /&gt;
		height = tonumber(height)&lt;br /&gt;
		local sizeparts = {}&lt;br /&gt;
		if width then&lt;br /&gt;
			insert(sizeparts, format(&amp;quot;%d&amp;quot;, width * scale))&lt;br /&gt;
		end&lt;br /&gt;
		if height then&lt;br /&gt;
			insert(sizeparts, format(&amp;quot;x%d&amp;quot;, height * scale))&lt;br /&gt;
		end&lt;br /&gt;
		size = concat(sizeparts)&lt;br /&gt;
	else&lt;br /&gt;
		size = format(&amp;quot;%s%d&amp;quot;, landscape and &amp;quot;x&amp;quot; or &amp;quot;&amp;quot;, defaultShieldSize * scale)&lt;br /&gt;
	end&lt;br /&gt;
	local shieldCode = format(&amp;quot;[[File:%s|%spx|link=|alt=]]&amp;quot;, shield[1], size)&lt;br /&gt;
	if not banners[1] then return shieldCode end&lt;br /&gt;
&lt;br /&gt;
	for _,banner in ipairs(banners) do&lt;br /&gt;
		shieldCode = format(&amp;quot;[[File:%s|%spx|link=|alt=]]&amp;lt;br&amp;gt;%s&amp;quot;,&lt;br /&gt;
			banner[1],&lt;br /&gt;
			defaultShieldSize,&lt;br /&gt;
			shieldCode)&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;&amp;lt;span style=&amp;quot;display: inline-block; vertical-align: baseline; line-height: 0; text-align: center;&amp;quot;&amp;gt;&amp;#039; .. shieldCode .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.shield(args, scale, showLink, mainShield, shieldList)&lt;br /&gt;
	missingShields = {}&lt;br /&gt;
&lt;br /&gt;
	scale = scale or 1&lt;br /&gt;
&lt;br /&gt;
	local rendered = {}&lt;br /&gt;
	for _,entry in ipairs(shieldSpec(args, mainShield, shieldList)) do&lt;br /&gt;
		insert(rendered, render(entry, scale, showLink))&lt;br /&gt;
	end&lt;br /&gt;
	return concat(rendered), missingShields&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Links/abbreviations&lt;br /&gt;
function p.link(args)&lt;br /&gt;
	local nolink = args.nolink&lt;br /&gt;
	local abbr = parser(args, &amp;#039;abbr&amp;#039;)&lt;br /&gt;
	if nolink then&lt;br /&gt;
		return abbr&lt;br /&gt;
	else&lt;br /&gt;
		local link = parser(args, &amp;#039;link&amp;#039;)&lt;br /&gt;
		if not link or link == &amp;#039;&amp;#039; then&lt;br /&gt;
			return abbr&lt;br /&gt;
		else&lt;br /&gt;
			return format(&amp;quot;[[%s|%s]]&amp;quot;, link, abbr)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function stateName(args)&lt;br /&gt;
	-- TODO transition&lt;br /&gt;
	local data = mw.loadData(statenameModuleName) &lt;br /&gt;
	local abbr = args.state or args.province&lt;br /&gt;
	local countryData = data[args.country]&lt;br /&gt;
	return countryData and countryData[abbr]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------&lt;br /&gt;
--[[-&lt;br /&gt;
@type status&lt;br /&gt;
@field #string row: The start of the row, for this particular type (color)&lt;br /&gt;
@field #string established: The string to be output in the &amp;quot;Formed&amp;quot; column.&lt;br /&gt;
	For future routes, &amp;quot;proposed&amp;quot; is displayed here.&lt;br /&gt;
	Otherwise, display the year passed in the established parameter.&lt;br /&gt;
@field #string removed: The string to be output in the &amp;quot;Removed&amp;quot; column.&lt;br /&gt;
	In the case of routeStates.former, the year that the route was&lt;br /&gt;
	decommissioned is output instead.&lt;br /&gt;
]]&lt;br /&gt;
--[[-&lt;br /&gt;
Route statuses.&lt;br /&gt;
@list &amp;lt;#status&amp;gt;&lt;br /&gt;
]]&lt;br /&gt;
local routeStatuses = {&lt;br /&gt;
	-- current routes&lt;br /&gt;
	current = {&lt;br /&gt;
		row = &amp;quot;|-&amp;quot;,&lt;br /&gt;
		removed = &amp;quot;current&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	-- future routes&lt;br /&gt;
	future = {&lt;br /&gt;
		row = &amp;#039;|- style=&amp;quot;background-color:#ffdead;&amp;quot; title=&amp;quot;Future route&amp;quot;&amp;#039;,&lt;br /&gt;
		established = &amp;quot;proposed&amp;quot;,&lt;br /&gt;
		removed = &amp;quot;—&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	-- former routes&lt;br /&gt;
	former = {&lt;br /&gt;
		row = &amp;#039;|- style=&amp;quot;background-color:#d3d3d3;&amp;quot; title=&amp;quot;Former route&amp;quot;&amp;#039;&lt;br /&gt;
	},&lt;br /&gt;
	-- routes marked as former by override&lt;br /&gt;
	-- deprecated&lt;br /&gt;
	formeroverride = {&lt;br /&gt;
		row = &amp;#039;|- style=&amp;quot;background-color:#d3d3d3;&amp;quot; title=&amp;quot;Former route&amp;quot;&amp;#039;,&lt;br /&gt;
		removed = &amp;quot;—&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	-- route with unknown status&lt;br /&gt;
	unknown = {&lt;br /&gt;
		row = &amp;quot;|-&amp;quot;,&lt;br /&gt;
		removed = &amp;quot;—&amp;quot;&lt;br /&gt;
	} &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--[[-&lt;br /&gt;
Return the route status.&lt;br /&gt;
@param #string established `established` argument passed to the module&lt;br /&gt;
@param #string decommissioned `decommissioned` argument passed to the module&lt;br /&gt;
@return #status the status of the route.&lt;br /&gt;
]]&lt;br /&gt;
local function getRouteStatus(established, decommissioned)&lt;br /&gt;
	if decommissioned == &amp;#039;yes&amp;#039; then&lt;br /&gt;
		-- a former route with no decommission information&lt;br /&gt;
		return routeStatuses.formeroverride&lt;br /&gt;
	elseif decommissioned then&lt;br /&gt;
		-- If the route is decommissioned, then it must be a former route.&lt;br /&gt;
		return routeStatuses.former&lt;br /&gt;
	elseif not established then&lt;br /&gt;
		-- Without the establishment date, there is not enough information&lt;br /&gt;
		-- to determine the status of the route.&lt;br /&gt;
		return routeStatuses.unknown&lt;br /&gt;
	elseif established == &amp;#039;proposed&amp;#039; then&lt;br /&gt;
		-- a future route&lt;br /&gt;
		return routeStatuses.future&lt;br /&gt;
	else&lt;br /&gt;
		-- a current route&lt;br /&gt;
		return routeStatuses.current&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[-&lt;br /&gt;
A limited replacement for {{dts}}.&lt;br /&gt;
Derive the sort key from a given date.&lt;br /&gt;
@param #string date&lt;br /&gt;
@param #string circa &amp;quot;yes&amp;quot; if `date` is tagged as circa&lt;br /&gt;
@return #string true the hidden sort key, along with the year of the original date&lt;br /&gt;
@return #boolean false if the sort key cannot be derived&lt;br /&gt;
]]&lt;br /&gt;
local function dtsYearCore(date)&lt;br /&gt;
	local year = lang:formatDate(&amp;#039;Y&amp;#039;, date) -- year for this date&lt;br /&gt;
	if year == date then -- If the provided date is just the year,&lt;br /&gt;
		-- tack on January 1 for the sort key to work right.&lt;br /&gt;
		date = date .. &amp;quot;-01-01&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local month = lang:formatDate(&amp;#039;m&amp;#039;, date) -- month for this date&lt;br /&gt;
	local day = lang:formatDate(&amp;#039;d&amp;#039;, date) -- day for this date&lt;br /&gt;
	-- Create and store the formatted hidden sort key.&lt;br /&gt;
	-- The year must be five digits, per convention.&lt;br /&gt;
	local dtsStr = format(&amp;quot;%05d-%02d-%02d&amp;quot;, year, month, day)&lt;br /&gt;
	-- Return the hidden sort key and the year for this date.&lt;br /&gt;
	return {dtsStr, year}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function dtsYear(date, circa)&lt;br /&gt;
	local success, result = pcall(dtsYearCore, date)&lt;br /&gt;
	if not success then&lt;br /&gt;
		result = {&lt;br /&gt;
			&amp;quot;00001-01-01&amp;quot;,&lt;br /&gt;
			util.err(format(&amp;#039;Invalid date &amp;quot;%s&amp;quot;.&amp;#039;, date))&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	-- Generate the HTML code necessary for the hidden sort key.&lt;br /&gt;
	local dtsStyle = format(&amp;quot;style=\&amp;quot;white-space:nowrap;\&amp;quot; data-sort-value=\&amp;quot;%s\&amp;quot;&amp;quot;, result[1])&lt;br /&gt;
	local year = result[2]&lt;br /&gt;
	if circa == &amp;#039;yes&amp;#039; then -- If the date is tagged as circa,&lt;br /&gt;
		-- add the circa abbreviation to the display. Derived from {{circa}}.&lt;br /&gt;
		year = &amp;quot;&amp;lt;span style=\&amp;quot;white-space:nowrap;\&amp;quot;&amp;gt;&amp;lt;abbr title=\&amp;quot;circa\&amp;quot;&amp;gt;c.&amp;lt;/abbr&amp;gt;&amp;amp;thinsp;&amp;quot; .. year .. &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return dtsStyle, year&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Return formatting and output for a date column.&lt;br /&gt;
local function date(text, date, circa, ref)&lt;br /&gt;
	-- Returns the text if specified, or the dtsYear-formatted date, and an em-dash.&lt;br /&gt;
	local style, output&lt;br /&gt;
	if text then&lt;br /&gt;
		output = text&lt;br /&gt;
	elseif date then&lt;br /&gt;
		style, output = dtsYear(date, circa)&lt;br /&gt;
	else&lt;br /&gt;
		output = &amp;quot;—&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return format(&amp;quot;|align=center %s|%s%s&amp;quot;, style or &amp;quot;&amp;quot;, output, ref)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Return output for the date columns for a given route.&lt;br /&gt;
local function dates(established, decommissioned, routeStatus, args)&lt;br /&gt;
	local established_ref = args.established_ref or &amp;#039;&amp;#039; -- Reference for date established&lt;br /&gt;
	local decommissioned_ref = args.decommissioned_ref or &amp;#039;&amp;#039; -- Reference for date decommissioned&lt;br /&gt;
	return format(&amp;quot;%s\n%s&amp;quot;,&lt;br /&gt;
		date(routeStatus.established, established, args.circa_established, established_ref),&lt;br /&gt;
		date(routeStatus.removed, decommissioned, args.circa_decommissioned, decommissioned_ref))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Return output for the termini columns for a given route.&lt;br /&gt;
local function termini(args)&lt;br /&gt;
	local beltway = args[&amp;quot;beltway&amp;quot;]&lt;br /&gt;
	if beltway then&lt;br /&gt;
		-- The given route is a beltway. &lt;br /&gt;
		-- `beltway` text will span both termini columns.&lt;br /&gt;
		return &amp;quot;|colspan=2 align=center|&amp;quot; .. beltway&lt;br /&gt;
	else&lt;br /&gt;
		local terminus_a = args[&amp;quot;terminus_a&amp;quot;] or &amp;#039;—&amp;#039; -- Southern or western terminus&lt;br /&gt;
		local terminus_b = args[&amp;quot;terminus_b&amp;quot;] or &amp;#039;—&amp;#039; -- Northern or eastern terminus&lt;br /&gt;
		-- Fill in the termini columns&lt;br /&gt;
		return &amp;#039;|&amp;#039; .. terminus_a .. &amp;#039;||&amp;#039; .. terminus_b&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Return output for the length columns for a given route, with the appropriate conversions.&lt;br /&gt;
local function length(args)&lt;br /&gt;
	local km = args[&amp;quot;length_km&amp;quot;] or &amp;#039;&amp;#039; -- Length in kilometers&lt;br /&gt;
    local mi = args[&amp;quot;length_mi&amp;quot;] or &amp;#039;&amp;#039; -- Length in miles&lt;br /&gt;
    local ref = args[&amp;quot;length_ref&amp;quot; ] or &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    if mi == &amp;#039;&amp;#039; and km == &amp;#039;&amp;#039; then&lt;br /&gt;
        return format(&amp;quot;|align=right|—||align=right|—&amp;quot;)&lt;br /&gt;
	elseif mi ~= &amp;#039;0&amp;#039; and km == &amp;#039;&amp;#039; then&lt;br /&gt;
		return format(&amp;quot;|&amp;quot;) .. frame:expandTemplate{ title = &amp;#039;convert&amp;#039;, args = { mi, &amp;quot;mi&amp;quot;, &amp;quot;km&amp;quot;, disp = &amp;quot;table&amp;quot;}}&lt;br /&gt;
	else&lt;br /&gt;
		return format(&amp;quot;|&amp;quot;) .. frame:expandTemplate{ title = &amp;#039;convert&amp;#039;, args = { km, &amp;quot;km&amp;quot;, &amp;quot;mi&amp;quot;, disp = &amp;quot;table&amp;quot;}}&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- Generate a &amp;quot;Local names&amp;quot; cell if necessary.&lt;br /&gt;
local function localname(args)&lt;br /&gt;
	local enabled = args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	if enabled == &amp;quot;local&amp;quot; then&lt;br /&gt;
		local localName = args[&amp;quot;local&amp;quot;] or &amp;#039;&amp;#039;&lt;br /&gt;
		return &amp;quot;|&amp;quot; .. localName&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Generate a &amp;quot;Notes&amp;quot; cell if necessary.&lt;br /&gt;
local function notes(notes)&lt;br /&gt;
	if notes == &amp;#039;none&amp;#039; then&lt;br /&gt;
		return &amp;#039;| &amp;#039; --create empty cell&lt;br /&gt;
	elseif notes then&lt;br /&gt;
		return &amp;#039;|&amp;#039; .. notes --display notes in cell&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;#039; --create no cell&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Derive the sort key from a given route.&lt;br /&gt;
local function sortkey(abbr)&lt;br /&gt;
	-- Split `abbr` into three possibly empty parts, with number in the middle.&lt;br /&gt;
	local prefix, num, suffix = mw.ustring.match(abbr, &amp;quot;([^0-9]*)(%d*)(.*)&amp;quot;)&lt;br /&gt;
	-- If `abbr` does not contain a number, the entry appears at the bottom.&lt;br /&gt;
	num = tonumber(num)&lt;br /&gt;
	num = type(num) == &amp;quot;number&amp;quot; and format(&amp;quot;%04d&amp;quot;, num) or &amp;quot;&amp;quot;&lt;br /&gt;
	-- The sort key is `abbr`, but with route number zero-padded to 4 digits&lt;br /&gt;
	-- and prefix moved to the end.&lt;br /&gt;
	return mw.text.trim(&lt;br /&gt;
		mw.ustring.gsub(format(&amp;quot;%s%s %s&amp;quot;, num, suffix, prefix), &amp;quot;&amp;amp;nbsp;&amp;quot;, &amp;quot; &amp;quot;),&lt;br /&gt;
		&amp;quot;- &amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function route(args, shieldSize)&lt;br /&gt;
	local link, abbr = p.link(args)&lt;br /&gt;
	-- Use the sort key if already specified.&lt;br /&gt;
	local sortkey = args.sortkey or sortkey(abbr or &amp;quot;&amp;quot;)&lt;br /&gt;
	local shield = p.shield(args)&lt;br /&gt;
&lt;br /&gt;
	if shield == nil or args.noshield then&lt;br /&gt;
		return format(&amp;#039;!scope=&amp;quot;row&amp;quot; class=&amp;quot;nowrap&amp;quot; data-sort-value=&amp;quot;%s&amp;quot;|%s&amp;#039;,&lt;br /&gt;
			sortkey, link)&lt;br /&gt;
	else&lt;br /&gt;
		return format(&amp;#039;!scope=&amp;quot;row&amp;quot; class=&amp;quot;nowrap&amp;quot; data-sort-value=&amp;quot;%s&amp;quot;|%s %s&amp;#039;,&lt;br /&gt;
			sortkey, shield, link)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Derive the anchor from a given route.&lt;br /&gt;
local function anchor(routeType, routeNo)&lt;br /&gt;
	-- Split `routeNo` into three possibly empty parts, with number in the middle.&lt;br /&gt;
	local prefix, num, suffix = mw.ustring.match(routeNo, &amp;quot;([^0-9]*)(%d*)(.*)&amp;quot;)&lt;br /&gt;
	-- Zero-pad route number to 4 digits if `routeNo` does contain a number.&lt;br /&gt;
	num = tonumber(num)&lt;br /&gt;
	num = type(num) == &amp;quot;number&amp;quot; and format(&amp;quot;%04d&amp;quot;, num) or &amp;quot;&amp;quot;&lt;br /&gt;
	-- The anchor is the concatenation of `type` and zero-padded `routeNo`.&lt;br /&gt;
	return format(&amp;quot;%s%s%s%s&amp;quot;, routeType, prefix, num, suffix)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._row(args)&lt;br /&gt;
	local established = args.established&lt;br /&gt;
	local decommissioned = args.decommissioned&lt;br /&gt;
	local routeStatus = getRouteStatus(established, decommissioned)&lt;br /&gt;
	local anchor = args.anchor or anchor(args.type, args.route)&lt;br /&gt;
	local rowdef = format(&amp;#039;%s id=&amp;quot;%s&amp;quot;&amp;#039;, routeStatus.row, anchor)&lt;br /&gt;
	local route = route(args)&lt;br /&gt;
	local length = length(args)&lt;br /&gt;
	local termini = termini(args)&lt;br /&gt;
	local localname = localname(args)&lt;br /&gt;
	local dates = dates(established, decommissioned, routeStatus, args)&lt;br /&gt;
	local notes = notes(args.notes)&lt;br /&gt;
&lt;br /&gt;
	local row = {rowdef, route, length, termini, localname, dates, notes}&lt;br /&gt;
	return concat(row, &amp;#039;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.row(frame)&lt;br /&gt;
	-- Import module function to work with passed arguments&lt;br /&gt;
	local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
	local args = getArgs(frame) -- Gather passed arguments into easy-to-use table&lt;br /&gt;
	return p._row(args);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Fredddie</name></author>
	</entry>
</feed>