<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.tachyony.co.uk/w/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://wiki.tachyony.co.uk/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AJct"/>
	<link rel="alternate" type="text/html" href="https://wiki.tachyony.co.uk/w/index.php?title=Module:Jct&amp;action=history"/>
	<updated>2026-05-15T13:30:49Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://wiki.tachyony.co.uk/w/index.php?title=Module:Jct&amp;diff=8993&amp;oldid=prev</id>
		<title>Tachyony: Created page with &quot;local p = {}  local SUFFIX = &quot;&quot; -- Change to main module upon deployment local parserModuleName = &quot;Module:Road data/parser&quot; .. SUFFIX local cityModuleName = &quot;Module:Jct/city&quot; .. SUFFIX  local concat = table.concat local insert = table.insert local format = mw.ustring.format local roadDataModule = require(&quot;Module:Road data&quot; .. SUFFIX)  local rdt  -- Links/abbreviations local function routeText(route, jctname, frame) 	local link 	local type = route.type 	if not type or typ...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.tachyony.co.uk/w/index.php?title=Module:Jct&amp;diff=8993&amp;oldid=prev"/>
		<updated>2022-01-20T02:36:41Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local p = {}  local SUFFIX = &amp;quot;&amp;quot; -- Change to main module upon deployment local parserModuleName = &amp;quot;Module:Road data/parser&amp;quot; .. SUFFIX local cityModuleName = &amp;quot;Module:Jct/city&amp;quot; .. SUFFIX  local concat = table.concat local insert = table.insert local format = mw.ustring.format local roadDataModule = require(&amp;quot;Module:Road data&amp;quot; .. SUFFIX)  local rdt  -- Links/abbreviations local function routeText(route, jctname, frame) 	local link 	local type = route.type 	if not type or typ...&amp;quot;&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;
&lt;br /&gt;
local SUFFIX = &amp;quot;&amp;quot;&lt;br /&gt;
-- Change to main module upon deployment&lt;br /&gt;
local parserModuleName = &amp;quot;Module:Road data/parser&amp;quot; .. SUFFIX&lt;br /&gt;
local cityModuleName = &amp;quot;Module:Jct/city&amp;quot; .. SUFFIX&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 roadDataModule = require(&amp;quot;Module:Road data&amp;quot; .. SUFFIX)&lt;br /&gt;
&lt;br /&gt;
local rdt&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 = roadDataModule.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;
		if route.rdt then&lt;br /&gt;
			return frame:expandTemplate{ title = &amp;#039;BSsplit&amp;#039;, args = {mainText, parenText, align = &amp;#039;left&amp;#039;, valign = &amp;#039;middle&amp;#039; } }&lt;br /&gt;
		else&lt;br /&gt;
			return format(&amp;#039;%s (%s)&amp;#039;, mainText, parenText)&lt;br /&gt;
		end&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 = require(&amp;quot;Module:Road data/size&amp;quot;).size({style = &amp;#039;jct&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;
		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;
		route.rdt = args.rdt&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;
	rdt = args.rdt&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 = roadDataModule.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 #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>Tachyony</name></author>
	</entry>
</feed>