<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://the-democratika.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AJct</id>
	<title>Module:Jct - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://the-democratika.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AJct"/>
	<link rel="alternate" type="text/html" href="https://the-democratika.com/wiki/index.php?title=Module:Jct&amp;action=history"/>
	<updated>2026-04-05T01:23:14Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://the-democratika.com/wiki/index.php?title=Module:Jct&amp;diff=7000&amp;oldid=prev</id>
		<title>&gt;Fredddie: 24</title>
		<link rel="alternate" type="text/html" href="https://the-democratika.com/wiki/index.php?title=Module:Jct&amp;diff=7000&amp;oldid=prev"/>
		<updated>2022-12-29T03:42:28Z</updated>

		<summary type="html">&lt;p&gt;24&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&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 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;
local cityModuleName = &amp;quot;Module:Jct/city&amp;quot; .. moduleSuffix&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;
local util = require(&amp;quot;Module:Road data/util&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Shields&lt;br /&gt;
local defaultShieldSize = 24&lt;br /&gt;
&lt;br /&gt;
local function addContextBanner(route, name, suffix, bannerSpec)&lt;br /&gt;
	local bannerModule = &amp;#039;Module:Road data/banners/&amp;#039; .. string.upper(route.country)&lt;br /&gt;
	local shieldfield = name .. &amp;#039;shield&amp;#039;&lt;br /&gt;
	local shield = parser(route, 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(route, &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(route, &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;
	if route.dir then&lt;br /&gt;
		addContextBanner(route, &amp;#039;dir&amp;#039;, bannerSuffix, banners)&lt;br /&gt;
	end&lt;br /&gt;
	if route.to then&lt;br /&gt;
		addContextBanner(route, &amp;#039;to&amp;#039;, bannerSuffix, banners)&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(route, mainShield, shieldList)&lt;br /&gt;
	local shieldSpec = {}&lt;br /&gt;
&lt;br /&gt;
	local shield&lt;br /&gt;
	local shieldto = parser(route, &amp;#039;shieldto&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	if route.to then&lt;br /&gt;
		if not shield then shield = shieldto or parser(route, &amp;#039;shield&amp;#039;) or &amp;#039;&amp;#039; end&lt;br /&gt;
	else&lt;br /&gt;
		if not shield then shield = parser(route, &amp;#039;shield&amp;#039;) or &amp;#039;&amp;#039; end&lt;br /&gt;
	end&lt;br /&gt;
	if shield == &amp;#039;&amp;#039; then return shieldSpec end&lt;br /&gt;
	local orientation = parser(route, &amp;#039;orientation&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	local function size(route)&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(route)&lt;br /&gt;
	&lt;br /&gt;
	local banner = parser(route, &amp;#039;banner&amp;#039;) or {}&lt;br /&gt;
	local bannersize = defaultShieldSize&lt;br /&gt;
	local bannersuffix = parser(route, &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 or shieldsize[i]&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(route, 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(route, 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(route)&lt;br /&gt;
	local nolink = route.nolink&lt;br /&gt;
	local abbr = parser(route, &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(route, &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;
&lt;br /&gt;
-- Links/abbreviations&lt;br /&gt;
local function routeText(route, jctname, frame)&lt;br /&gt;
	local link&lt;br /&gt;
	local type = route.type&lt;br /&gt;
	if not type or type == &amp;#039;&amp;#039; then&lt;br /&gt;
		link = route.route&lt;br /&gt;
	else&lt;br /&gt;
		link = p.link(route)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local dir = route.dir and &amp;#039; &amp;#039; .. string.lower(route.dir) or &amp;#039;&amp;#039;&lt;br /&gt;
	local routeText = link .. dir&lt;br /&gt;
&lt;br /&gt;
	local name = route.name&lt;br /&gt;
	if name and name ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		local mainText = jctname and name or routeText&lt;br /&gt;
		local parenText = jctname and routeText or name&lt;br /&gt;
		&lt;br /&gt;
		return format(&amp;#039;%s (%s)&amp;#039;, mainText, parenText)&lt;br /&gt;
	else&lt;br /&gt;
		return routeText&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function extra(args)&lt;br /&gt;
	local extraTypes = mw.loadData(&amp;#039;Module:Road data/extra&amp;#039;)&lt;br /&gt;
	local extraIcon = extraTypes[string.lower(args.extra or &amp;#039;&amp;#039;)]&lt;br /&gt;
	if not extraIcon then return &amp;#039;&amp;#039; end&lt;br /&gt;
	local size = defaultShieldSize .. &amp;#039;px&amp;#039;&lt;br /&gt;
	local countryIcon = extraIcon[args.country] or extraIcon.default&lt;br /&gt;
	if type(countryIcon) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		local localIcon = countryIcon[args.state] or countryIcon.default&lt;br /&gt;
		return string.format(&amp;quot;[[File:%s|%s|alt=|link=]]&amp;quot;, localIcon, size)&lt;br /&gt;
	else&lt;br /&gt;
		return string.format(&amp;quot;[[File:%s|%s|alt=|link=]]&amp;quot;, countryIcon, size)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parseArgs(args)&lt;br /&gt;
	local state = args.state or args.province or &amp;#039;&amp;#039;&lt;br /&gt;
	args.state = state&lt;br /&gt;
	local country&lt;br /&gt;
	if args.country and args.country ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		country = string.upper(args.country)&lt;br /&gt;
	else&lt;br /&gt;
		local countryModule = mw.loadData(&amp;quot;Module:Road data/countrymask&amp;quot;)&lt;br /&gt;
		country = countryModule[state] or &amp;#039;UNK&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	args.country = country&lt;br /&gt;
&lt;br /&gt;
	local params = {&amp;#039;denom&amp;#039;, &amp;#039;county&amp;#039;, &amp;#039;township&amp;#039;, &amp;#039;dab&amp;#039;, &amp;#039;nolink&amp;#039;, &amp;#039;noshield&amp;#039;, &amp;#039;to&amp;#039;, &amp;#039;dir&amp;#039;, &amp;#039;name&amp;#039;}&lt;br /&gt;
	local routes = {}&lt;br /&gt;
	local routeCount = 1&lt;br /&gt;
	local seenTo = false&lt;br /&gt;
	while true do&lt;br /&gt;
		local routeType = args[routeCount * 2 - 1]&lt;br /&gt;
		if not routeType then break end&lt;br /&gt;
		local route = {type = routeType, route = args[routeCount * 2]}&lt;br /&gt;
		for _,v in pairs(params) do&lt;br /&gt;
			route[v] = args[v .. routeCount]&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if args.nolink then&lt;br /&gt;
			route.nolink = args.nolink&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		route.country = country&lt;br /&gt;
		route.state = state&lt;br /&gt;
&lt;br /&gt;
		-- Set the first .to to true.&lt;br /&gt;
		-- Set all following .to to &amp;#039;&amp;#039;.&lt;br /&gt;
		if seenTo then&lt;br /&gt;
			if route.to then&lt;br /&gt;
				-- Report duplicate to flag.&lt;br /&gt;
				route.toerror = true&lt;br /&gt;
			end&lt;br /&gt;
			route.to = &amp;#039;&amp;#039;&lt;br /&gt;
		elseif route.to then&lt;br /&gt;
			route.to = true&lt;br /&gt;
			seenTo = true&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		insert(routes, route)&lt;br /&gt;
		routeCount = routeCount + 1&lt;br /&gt;
	end&lt;br /&gt;
	return routes&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function prefix(to, num)&lt;br /&gt;
	if to and to ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		return num == 1 and &amp;#039;To &amp;#039; or &amp;#039; to &amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return num == 1 and &amp;#039;&amp;#039; or &amp;#039;&amp;amp;nbsp;/ &amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function addErrorMsg(catCode, msg, errorMsg)&lt;br /&gt;
	errorMsg.code = errorMsg.code or catCode&lt;br /&gt;
	insert(errorMsg, format(&amp;#039;&amp;lt;span style=&amp;quot;display: none;&amp;quot;&amp;gt;Module:Jct %s&amp;lt;/span&amp;gt;&amp;#039;, msg))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._jct(args, frame)&lt;br /&gt;
	local routes = parseArgs(args)&lt;br /&gt;
	local shields = {}&lt;br /&gt;
	local links = {}&lt;br /&gt;
	local allMissingShields = {}&lt;br /&gt;
	local typeErr = false&lt;br /&gt;
	local toErr = false&lt;br /&gt;
	frame = frame or mw.getCurrentFrame()&lt;br /&gt;
	for num,route in ipairs(routes) do&lt;br /&gt;
		if not (args.noshield or route.noshield) then&lt;br /&gt;
			local shield, missingShields = p.shield(route)&lt;br /&gt;
			insert(shields, shield)&lt;br /&gt;
			if missingShields[1] then&lt;br /&gt;
				insert(allMissingShields, concat(missingShields, &amp;#039; / &amp;#039;))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local prefix = prefix(route.to, num)&lt;br /&gt;
		if prefix ~= &amp;#039;&amp;#039; then insert(links, prefix) end&lt;br /&gt;
		insert(links, routeText(route, args.jctname, frame))&lt;br /&gt;
		typeErr = typeErr or route.typeerror or false&lt;br /&gt;
		toErr = toErr or route.toerror or false&lt;br /&gt;
	end&lt;br /&gt;
	local graphics = concat(shields) .. extra(args) .. &amp;#039; &amp;#039;&lt;br /&gt;
	local linkText = concat(links)&lt;br /&gt;
	local cities = &amp;#039;&amp;#039;&lt;br /&gt;
	if args.city1 or args.location1 then&lt;br /&gt;
		local citiesPrefix&lt;br /&gt;
		if args.citiesprefix then&lt;br /&gt;
			citiesPrefix = args.citiesprefix ~= &amp;#039;&amp;#039; and format(&amp;quot; %s &amp;quot;, args.citiesprefix) or &amp;#039;&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			citiesPrefix = &amp;#039;&amp;amp;nbsp;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		local cityModule = require(cityModuleName)&lt;br /&gt;
		cities = citiesPrefix .. cityModule.city(args)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local errorMsg = {}&lt;br /&gt;
	-- Errors must be reported by the level of severity, most severe first.&lt;br /&gt;
	if typeErr then&lt;br /&gt;
		-- Report invalid type errors.&lt;br /&gt;
		addErrorMsg(&amp;quot;§&amp;quot;, &amp;#039;error: Invalid route type&amp;#039;, errorMsg)&lt;br /&gt;
	end&lt;br /&gt;
	if #allMissingShields &amp;gt; 0 then&lt;br /&gt;
		-- Report missing shield error.&lt;br /&gt;
		-- shieldExists() would have populated missingShields if shields are missing.&lt;br /&gt;
		addErrorMsg(&amp;quot;¶&amp;quot;, &amp;#039;error: Missing route marker graphics: &amp;#039; .. concat(allMissingShields, &amp;#039; / &amp;#039;), errorMsg)&lt;br /&gt;
	end&lt;br /&gt;
	if toErr then&lt;br /&gt;
		-- Report invalid to errors.&lt;br /&gt;
		addErrorMsg(&amp;quot;&amp;amp;&amp;quot;, &amp;#039;error: Invalid &amp;quot;to&amp;quot; argument&amp;#039;, errorMsg)&lt;br /&gt;
	end&lt;br /&gt;
	if args.road then&lt;br /&gt;
		-- Report deprecated &amp;quot;road&amp;quot; warning.&lt;br /&gt;
		addErrorMsg(&amp;quot;∆&amp;quot;, &amp;#039;warning: &amp;quot;road&amp;quot; parameter is deprecated&amp;#039;, errorMsg)&lt;br /&gt;
	end&lt;br /&gt;
	if args.rdt then&lt;br /&gt;
		-- Report deprecated &amp;quot;rdt&amp;quot; warning.&lt;br /&gt;
		addErrorMsg(&amp;quot;£&amp;quot;, &amp;#039;warning: &amp;quot;rdt&amp;quot; parameter is deprecated&amp;#039;, errorMsg)&lt;br /&gt;
	end&lt;br /&gt;
	if #errorMsg &amp;gt; 0 then&lt;br /&gt;
		local page = mw.title.getCurrentTitle().prefixedText -- Get transcluding page&amp;#039;s title&lt;br /&gt;
		-- Add a category for the first, most severe error.&lt;br /&gt;
		insert(errorMsg, format(&amp;#039;[[Category:Jct template errors|%s %s]]&amp;#039;, errorMsg.code, page))&lt;br /&gt;
		errorMsg = concat(errorMsg)&lt;br /&gt;
	else&lt;br /&gt;
		errorMsg = &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return graphics .. linkText .. cities .. errorMsg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.jct(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, {removeBlanks = false})&lt;br /&gt;
	return p._jct(args, frame)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._roadlink(args, frame)&lt;br /&gt;
	local routes = parseArgs(args)&lt;br /&gt;
	local links = {}&lt;br /&gt;
	local typeErr = false&lt;br /&gt;
	local toErr = false&lt;br /&gt;
	frame = frame or mw.getCurrentFrame()&lt;br /&gt;
	for num,route in ipairs(routes) do&lt;br /&gt;
		local prefix = prefix(route.to, num)&lt;br /&gt;
		if prefix ~= &amp;#039;&amp;#039; then insert(links, prefix) end&lt;br /&gt;
		insert(links, routeText(route, args.jctname, frame))&lt;br /&gt;
		typeErr = typeErr or route.typeerror or false&lt;br /&gt;
		toErr = toErr or route.toerror or false&lt;br /&gt;
	end&lt;br /&gt;
	local linkText = concat(links)&lt;br /&gt;
	local cities = &amp;#039;&amp;#039;&lt;br /&gt;
	if args.city1 or args.location1 then&lt;br /&gt;
		local citiesPrefix&lt;br /&gt;
		if args.citiesprefix then&lt;br /&gt;
			citiesPrefix = args.citiesprefix ~= &amp;#039;&amp;#039; and format(&amp;quot; %s &amp;quot;, args.citiesprefix) or &amp;#039;&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			citiesPrefix = &amp;#039;&amp;amp;nbsp;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		local cityModule = require(cityModuleName)&lt;br /&gt;
		cities = citiesPrefix .. cityModule.city(args)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local errorMsg = {}&lt;br /&gt;
	-- Errors must be reported by the level of severity, most severe first.&lt;br /&gt;
	if typeErr then&lt;br /&gt;
		-- Report invalid type errors.&lt;br /&gt;
		addErrorMsg(&amp;quot;2&amp;quot;, &amp;#039;error: Invalid route type&amp;#039;, errorMsg)&lt;br /&gt;
	end&lt;br /&gt;
	if toErr then&lt;br /&gt;
		-- Report invalid to errors.&lt;br /&gt;
		addErrorMsg(&amp;quot;3&amp;quot;, &amp;#039;error: Invalid &amp;quot;to&amp;quot; argument&amp;#039;, errorMsg)&lt;br /&gt;
	end&lt;br /&gt;
	if args.road then&lt;br /&gt;
		-- Report deprecated &amp;quot;road&amp;quot; warning.&lt;br /&gt;
		addErrorMsg(&amp;quot;W&amp;quot;, &amp;#039;warning: &amp;quot;road&amp;quot; parameter is deprecated&amp;#039;, errorMsg)&lt;br /&gt;
	end&lt;br /&gt;
	if #errorMsg &amp;gt; 0 then&lt;br /&gt;
		local page = mw.title.getCurrentTitle().prefixedText -- Get transcluding page&amp;#039;s title&lt;br /&gt;
		-- Add a category for the first, most severe error.&lt;br /&gt;
		insert(errorMsg, format(&amp;#039;[[Category:Jct template errors|%s %s]]&amp;#039;, errorMsg.code, page))&lt;br /&gt;
		errorMsg = concat(errorMsg)&lt;br /&gt;
	else&lt;br /&gt;
		errorMsg = &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return linkText .. cities&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.roadlink(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, {removeBlanks = true})&lt;br /&gt;
	return p._roadlink(args, frame)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>&gt;Fredddie</name></author>
	</entry>
</feed>