<?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%3ARoad_data</id>
	<title>Module:Road data - 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%3ARoad_data"/>
	<link rel="alternate" type="text/html" href="https://the-democratika.com/wiki/index.php?title=Module:Road_data&amp;action=history"/>
	<updated>2026-04-04T22:19:22Z</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:Road_data&amp;diff=8140&amp;oldid=prev</id>
		<title>&gt;Lectonar: Changed protection settings for &quot;Module:Road data&quot;: High-risk template or module ([Edit=Require template editor access] (indefinite))</title>
		<link rel="alternate" type="text/html" href="https://the-democratika.com/wiki/index.php?title=Module:Road_data&amp;diff=8140&amp;oldid=prev"/>
		<updated>2023-05-30T11:19:55Z</updated>

		<summary type="html">&lt;p&gt;Changed protection settings for &amp;quot;&lt;a href=&quot;/wiki/index.php/Module:Road_data&quot; title=&quot;Module:Road data&quot;&gt;Module:Road data&lt;/a&gt;&amp;quot;: &lt;a href=&quot;/wiki/index.php?title=WP:High-risk_templates&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;WP:High-risk templates (page does not exist)&quot;&gt;High-risk template or module&lt;/a&gt; ([Edit=Require template editor access] (indefinite))&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;
-- 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;
&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;
local sizeModule = require(&amp;quot;Module:Road data/size&amp;quot;).size({style = &amp;quot;jct&amp;quot;})&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 = sizeModule&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;
	if mainShield then shield = parser(route, &amp;quot;shieldmain&amp;quot;) end&lt;br /&gt;
	if shieldList then shield = parser(route, &amp;quot;shieldlist&amp;quot;) end&lt;br /&gt;
	if not shield then shield = parser(route, &amp;#039;shield&amp;#039;) or &amp;#039;&amp;#039; 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 sizeModule&lt;br /&gt;
			else return &amp;quot;x&amp;quot; .. sizeModule&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local shieldsize = sizeModule&lt;br /&gt;
	&lt;br /&gt;
	local banner = parser(route, &amp;#039;banner&amp;#039;) or {}&lt;br /&gt;
	local bannersize = sizeModule&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;
-- Return up to two booleans.&lt;br /&gt;
-- The first boolean is false if `shield` does not exist, and true otherwise.&lt;br /&gt;
-- If the first boolean is true, the second boolean is true if the shield is&lt;br /&gt;
-- landscape (width &amp;gt;= height), and false otherwise.&lt;br /&gt;
local function shieldExists(shield)&lt;br /&gt;
	local result = shieldExistsCache[shield]&lt;br /&gt;
	if result == nil then&lt;br /&gt;
		local file = mw.title.new(shield, &amp;#039;Media&amp;#039;).file&lt;br /&gt;
		-- Cache result.&lt;br /&gt;
		local exists = file.exists&lt;br /&gt;
		result = {exists}&lt;br /&gt;
		if exists then result[2] = file.width &amp;gt;= file.height end&lt;br /&gt;
		shieldExistsCache[shield] = result&lt;br /&gt;
	end&lt;br /&gt;
	if result[1] then return true, result[2] end&lt;br /&gt;
	insert(missingShields, shield)&lt;br /&gt;
	return false&lt;br /&gt;
end&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;
	local exists, landscape = shieldExists(shield[1])&lt;br /&gt;
	if not exists then return &amp;#039;&amp;#039; end&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;, sizeModule)&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;
		if shieldExists(banner[1]) then&lt;br /&gt;
			shieldCode = format(&amp;quot;[[File:%s|%s|link=|alt=]]&amp;lt;br&amp;gt;%s&amp;quot;,&lt;br /&gt;
				banner[1],&lt;br /&gt;
				banner[2],&lt;br /&gt;
				shieldCode)&lt;br /&gt;
		end&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;
	if route.rdt then&lt;br /&gt;
		local shieldSize = mw.ustring.match(route.rdt, &amp;#039;^(%d+)$&amp;#039;) or 17&lt;br /&gt;
		scale = shieldSize/defaultShieldSize&lt;br /&gt;
	end&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;
function p.link(route)&lt;br /&gt;
	local abbr, errMsg = parser(route, &amp;#039;abbr&amp;#039;)&lt;br /&gt;
	if not abbr then&lt;br /&gt;
		route.typeerror = true&lt;br /&gt;
		return util.err(errMsg or format(&amp;quot;Invalid type: %s&amp;quot;, route.type or &amp;quot;(nil)&amp;quot;))&lt;br /&gt;
	end&lt;br /&gt;
	if route.nolink then return abbr, abbr end&lt;br /&gt;
&lt;br /&gt;
	local link = parser(route, &amp;#039;link&amp;#039;) or &amp;#039;&amp;#039;&lt;br /&gt;
	if link == &amp;#039;&amp;#039; then return abbr, abbr end&lt;br /&gt;
&lt;br /&gt;
	return format(&amp;quot;[[%s|%s]]&amp;quot;, link, abbr), abbr&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;
function p.locations(args, module, group)&lt;br /&gt;
	module = module or &amp;quot;&amp;quot;&lt;br /&gt;
	local modulearticle = module .. &amp;quot;article&amp;quot;&lt;br /&gt;
	local moduleprefix = module .. &amp;quot;prefix&amp;quot;&lt;br /&gt;
	local modulenameprefix = module .. &amp;quot;nameprefix&amp;quot;&lt;br /&gt;
	local modulenamesuffix = module .. &amp;quot;namesuffix&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local warnings = {}&lt;br /&gt;
&lt;br /&gt;
	-- Region, for disambiguation&lt;br /&gt;
	local region = parserModule.parser(args, &amp;quot;region&amp;quot;, &amp;quot; common &amp;quot;)&lt;br /&gt;
	if not region then&lt;br /&gt;
		-- TODO transition&lt;br /&gt;
		if args.region then&lt;br /&gt;
			warnings.region = &amp;quot;region parameter is deprecated&amp;quot;&lt;br /&gt;
			region = args.region&lt;br /&gt;
		elseif args.country and (args.state or args.province) then&lt;br /&gt;
			warnings.region = &amp;quot;Inferring region from country and state/province&amp;quot;&lt;br /&gt;
			region = stateName(args)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local regionName&lt;br /&gt;
	local regionText&lt;br /&gt;
	if type(region) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		regionName = region.name&lt;br /&gt;
		regionText = format(&amp;quot;[[%s|%s]]&amp;quot;, region.link, regionName)&lt;br /&gt;
	elseif region then&lt;br /&gt;
		regionName = region&lt;br /&gt;
		regionText = format(&amp;quot;[[%s]]&amp;quot;, regionName)&lt;br /&gt;
	end&lt;br /&gt;
	args.region = regionName&lt;br /&gt;
&lt;br /&gt;
	local locations = parserModule.parser(args, &amp;quot;locations&amp;quot;, &amp;quot; common &amp;quot;) or {}&lt;br /&gt;
&lt;br /&gt;
	-- Primary topic requires no specialization to supplied locations.&lt;br /&gt;
	local primaryTopic = not locations and module == &amp;quot;jctint&amp;quot; and args.primary_topic ~= &amp;#039;no&amp;#039;&lt;br /&gt;
	if args.primary_topic then&lt;br /&gt;
		-- TODO transition&lt;br /&gt;
		warnings.primary_topic = &amp;quot;primary_topic parameter is deprecated&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Independent city&lt;br /&gt;
	local indepCityText&lt;br /&gt;
	if args.indep_city_special then&lt;br /&gt;
		indepCityText = args.indep_city_special -- Overrides `indep_city` argument.&lt;br /&gt;
	elseif args.indep_city then&lt;br /&gt;
		local indepCity = args.indep_city&lt;br /&gt;
		local spec = locations.indep_city&lt;br /&gt;
		if spec then&lt;br /&gt;
			local link = format(&amp;quot;%s%s%s&amp;quot;,&lt;br /&gt;
				spec.linkprefix or &amp;quot;&amp;quot;, indepCity, spec.linksuffix or &amp;quot;&amp;quot;)&lt;br /&gt;
			local name = format(&amp;quot;%s%s%s&amp;quot;,&lt;br /&gt;
				spec[modulenameprefix] or spec.nameprefix or &amp;quot;&amp;quot;,&lt;br /&gt;
				indepCity,&lt;br /&gt;
				spec[modulenamesuffix] or spec.namesuffix or &amp;quot;&amp;quot;)&lt;br /&gt;
			indepCityText = format(&amp;quot;%s%s[[%s|%s]]&amp;quot;,&lt;br /&gt;
				spec[modulearticle] or spec.article or &amp;quot;&amp;quot;,&lt;br /&gt;
				spec[moduleprefix] or spec.prefix or &amp;quot;&amp;quot;,&lt;br /&gt;
				link, name)&lt;br /&gt;
		else&lt;br /&gt;
			-- TODO transition&lt;br /&gt;
			warnings.indep_city = &amp;quot;Spec for indep_city parameter undefined in road data module&amp;quot;&lt;br /&gt;
			local cityLink -- Wikilink for independent city&lt;br /&gt;
			if primaryTopic then&lt;br /&gt;
				cityLink = format(&amp;#039;[[%s]]&amp;#039;, indepCity)&lt;br /&gt;
			else&lt;br /&gt;
				-- Specialize independent city to the region.&lt;br /&gt;
				cityLink = format(&amp;#039;[[%s, %s|%s]]&amp;#039;, indepCity, region, indepCity)&lt;br /&gt;
			end&lt;br /&gt;
			indepCityText = &amp;quot;[[Independent city|City]] of &amp;quot; .. cityLink&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if indepCityText then&lt;br /&gt;
		return {region = regionText, indep_city = indepCityText, warnings = warnings}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- First-level subdivision, e.g., county&lt;br /&gt;
	-- Name of the type of subdivision, e.g., &amp;quot;County&amp;quot; and &amp;quot;Parish&amp;quot;&lt;br /&gt;
	local sub1name = args.sub1name -- TODO transition&lt;br /&gt;
	local sub1Text&lt;br /&gt;
	if args.sub1_special then&lt;br /&gt;
		sub1Text = args.sub1_special -- Overrides `sub1` argument.&lt;br /&gt;
	elseif args.sub1 then&lt;br /&gt;
		local sub1 = args.sub1&lt;br /&gt;
		local article&lt;br /&gt;
		local link = sub1&lt;br /&gt;
		local name = sub1&lt;br /&gt;
		-- Type of first-level subdivision area, as a form of disambiguation&lt;br /&gt;
		local sub1area = args.sub1area&lt;br /&gt;
		if sub1area then&lt;br /&gt;
			local sub1areaSpec = locations.sub1areas and locations.sub1areas[sub1area]&lt;br /&gt;
			if sub1areaSpec then&lt;br /&gt;
				article = sub1areaSpec[modulearticle] or sub1areaSpec.article or &amp;quot;&amp;quot;&lt;br /&gt;
				link = format(&amp;quot;%s%s%s&amp;quot;,&lt;br /&gt;
					sub1areaSpec.linkprefix or &amp;quot;&amp;quot;, link, sub1areaSpec.linksuffix or &amp;quot;&amp;quot;)&lt;br /&gt;
				name = format(&amp;quot;%s%s%s&amp;quot;,&lt;br /&gt;
					group and &amp;quot;&amp;quot; or sub1areaSpec[modulenameprefix] or sub1areaSpec.nameprefix or &amp;quot;&amp;quot;,&lt;br /&gt;
					name,&lt;br /&gt;
					group and &amp;quot;&amp;quot; or sub1areaSpec[modulenamesuffix] or sub1areaSpec.namesuffix or &amp;quot;&amp;quot;)&lt;br /&gt;
			else&lt;br /&gt;
				-- TODO report error&lt;br /&gt;
				local errMsg = util.err(format(&amp;quot;Undefined sub1area: %s&amp;quot;, sub1area))&lt;br /&gt;
				name = format(&amp;quot;%s%s&amp;quot;, name, errMsg)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if locations.sub1 then&lt;br /&gt;
			local spec = locations.sub1&lt;br /&gt;
			-- Prepend and append text from spec.&lt;br /&gt;
			link = format(&amp;quot;%s%s%s&amp;quot;,&lt;br /&gt;
				spec.linkprefix or &amp;quot;&amp;quot;, link, spec.linksuffix or &amp;quot;&amp;quot;)&lt;br /&gt;
			name = format(&amp;quot;%s%s%s&amp;quot;,&lt;br /&gt;
				spec[modulenameprefix] or spec.nameprefix or &amp;quot;&amp;quot;,&lt;br /&gt;
				name,&lt;br /&gt;
				spec[modulenamesuffix] or spec.namesuffix or &amp;quot;&amp;quot;)&lt;br /&gt;
			sub1Text = format(&amp;quot;%s[[%s|%s]]&amp;quot;, article or &amp;quot;&amp;quot;, link, name)&lt;br /&gt;
		else&lt;br /&gt;
			-- TODO transition&lt;br /&gt;
			warnings.sub1 = &amp;quot;Spec for sub1 parameter undefined in road data module&amp;quot;&lt;br /&gt;
			-- Add type (if specified) to wikilink for first-level subdivision.&lt;br /&gt;
			local sub1Link = sub1name and trim(format(&amp;quot;%s %s&amp;quot;, sub1, sub1name)) or sub1&lt;br /&gt;
			local sub1Name = module == &amp;quot;jcttop&amp;quot; and sub1Link or sub1&lt;br /&gt;
			if primaryTopic then&lt;br /&gt;
				sub1Text = format(&amp;#039;[[%s|%s]]&amp;#039;, sub1Link, sub1Name)&lt;br /&gt;
			else&lt;br /&gt;
				-- Specialize first-level subdivision, with type added, to the region.&lt;br /&gt;
				sub1Text = format(&amp;#039;[[%s, %s|%s]]&amp;#039;, sub1Link, region, sub1Name)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Second-level subdivision, e.g., city and town&lt;br /&gt;
	local sub2Text&lt;br /&gt;
	if args.sub2_special then&lt;br /&gt;
		sub2Text = args.sub2_special -- Overrides `sub2` argument.&lt;br /&gt;
	elseif args.sub2 then&lt;br /&gt;
		local sub2 = args.sub2&lt;br /&gt;
		if sub2 == &amp;quot;none&amp;quot; then&lt;br /&gt;
			sub2Text = &amp;quot;&amp;amp;#8203;&amp;quot; -- Zero-width space&lt;br /&gt;
		elseif sub2 == &amp;quot;&amp;amp;nbsp;&amp;quot; then&lt;br /&gt;
			-- TODO transition&lt;br /&gt;
			warnings.sub2 = &amp;quot;&amp;amp;nbsp; argument for sub2 parameter is deprecated&amp;quot;&lt;br /&gt;
			sub2Text = &amp;quot;&amp;amp;#8203;&amp;quot; -- Zero-width space&lt;br /&gt;
		elseif primaryTopic then&lt;br /&gt;
			-- TODO transition&lt;br /&gt;
			sub2Text = format(&amp;quot;[[%s]]&amp;quot;, sub2)&lt;br /&gt;
		else&lt;br /&gt;
			local article&lt;br /&gt;
			local link = sub2&lt;br /&gt;
			local name = sub2&lt;br /&gt;
			-- Type of area, e.g., city and village, as a form of disambiguation&lt;br /&gt;
			local sub2area = args.sub2area --[[TODO transition]] or args.area&lt;br /&gt;
			if sub2area then&lt;br /&gt;
				local sub2areaSpec = locations.sub2areas and locations.sub2areas[sub2area]&lt;br /&gt;
				if not sub2areaSpec then&lt;br /&gt;
					-- TODO transition&lt;br /&gt;
					warnings.sub2 =&lt;br /&gt;
						format(&amp;quot;Spec for area parameter &amp;#039;%s&amp;#039; undefined in road data module&amp;quot;, sub2area)&lt;br /&gt;
					local sub2areas = { -- table of different area types&lt;br /&gt;
						city = {&lt;br /&gt;
							linksuffix = &amp;quot; (city)&amp;quot;,&lt;br /&gt;
							jcttoparticle = &amp;quot;the &amp;quot;,&lt;br /&gt;
							nameprefix = &amp;quot;City of &amp;quot;&lt;br /&gt;
						},&lt;br /&gt;
						town = {&lt;br /&gt;
							linksuffix = &amp;quot; (town)&amp;quot;,&lt;br /&gt;
							jcttoparticle = &amp;quot;the &amp;quot;,&lt;br /&gt;
							nameprefix = &amp;quot;Town of &amp;quot;&lt;br /&gt;
						},&lt;br /&gt;
						village = {&lt;br /&gt;
							linksuffix = &amp;quot; (village)&amp;quot;,&lt;br /&gt;
							jcttoparticle = &amp;quot;the &amp;quot;,&lt;br /&gt;
							nameprefix = &amp;quot;Village of &amp;quot;&lt;br /&gt;
						},&lt;br /&gt;
						community = {&lt;br /&gt;
							linksuffix = &amp;quot; (community)&amp;quot;,&lt;br /&gt;
							jcttoparticle = &amp;quot;the &amp;quot;,&lt;br /&gt;
							nameprefix = &amp;quot;Community of &amp;quot;&lt;br /&gt;
						},&lt;br /&gt;
						CDP = {&lt;br /&gt;
							linksuffix = &amp;quot; (CDP)&amp;quot;,&lt;br /&gt;
							jcttoparticle = &amp;quot;the &amp;quot;,&lt;br /&gt;
							nameprefix = &amp;quot;Community of &amp;quot;&lt;br /&gt;
						},&lt;br /&gt;
						hamlet = {&lt;br /&gt;
							linksuffix = &amp;quot; (hamlet)&amp;quot;,&lt;br /&gt;
							jcttoparticle = &amp;quot;the &amp;quot;,&lt;br /&gt;
							nameprefix = &amp;quot;Hamlet of &amp;quot;&lt;br /&gt;
						},&lt;br /&gt;
						[&amp;quot;unorganized territory&amp;quot;] = {&lt;br /&gt;
							linksuffix = &amp;quot; (unorganized territory)&amp;quot;,&lt;br /&gt;
							jcttoparticle = &amp;quot;the &amp;quot;,&lt;br /&gt;
							nameprefix = &amp;quot;Unorganized Territory of &amp;quot;&lt;br /&gt;
						},&lt;br /&gt;
						township = {&lt;br /&gt;
							linksuffix = &amp;quot; Township&amp;quot;,&lt;br /&gt;
							namesuffix = &amp;quot; Township&amp;quot;,&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					sub2areaSpec = sub2areas[sub2area]&lt;br /&gt;
				end&lt;br /&gt;
				if sub2areaSpec then&lt;br /&gt;
					article = sub2areaSpec[modulearticle] or sub2areaSpec.article or &amp;quot;&amp;quot;&lt;br /&gt;
					link = format(&amp;quot;%s%s%s&amp;quot;,&lt;br /&gt;
						sub2areaSpec.linkprefix or &amp;quot;&amp;quot;, link, sub2areaSpec.linksuffix or &amp;quot;&amp;quot;)&lt;br /&gt;
					name = format(&amp;quot;%s%s%s&amp;quot;,&lt;br /&gt;
						group and &amp;quot;&amp;quot; or sub2areaSpec[modulenameprefix] or sub2areaSpec.nameprefix or &amp;quot;&amp;quot;,&lt;br /&gt;
						name,&lt;br /&gt;
						group and &amp;quot;&amp;quot; or sub2areaSpec[modulenamesuffix] or sub2areaSpec.namesuffix or &amp;quot;&amp;quot;)&lt;br /&gt;
				else&lt;br /&gt;
					-- TODO report error&lt;br /&gt;
					local errMsg = util.err(format(&amp;quot;Undefined sub2area: %s&amp;quot;, sub2area))&lt;br /&gt;
					name = format(&amp;quot;%s%s&amp;quot;, name, errMsg)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if locations.sub2 then&lt;br /&gt;
				local spec = locations.sub2&lt;br /&gt;
				-- Prepend and append text from spec.&lt;br /&gt;
				link = format(&amp;quot;%s%s%s&amp;quot;,&lt;br /&gt;
					spec.linkprefix or &amp;quot;&amp;quot;, link, spec.linksuffix or &amp;quot;&amp;quot;)&lt;br /&gt;
				name = format(&amp;quot;%s%s%s&amp;quot;,&lt;br /&gt;
					spec[modulenameprefix] or spec.nameprefix or &amp;quot;&amp;quot;,&lt;br /&gt;
					name,&lt;br /&gt;
					spec[modulenamesuffix] or spec.namesuffix or &amp;quot;&amp;quot;)&lt;br /&gt;
			else&lt;br /&gt;
				-- TODO transition&lt;br /&gt;
				warnings.sub2 = &amp;quot;Spec for sub2 parameter undefined in road data module&amp;quot;&lt;br /&gt;
				-- Some second-level subdivisions are not unique in a given region.&lt;br /&gt;
				-- `sub1dab` is the first-level subdivision to be used for disambiguation.&lt;br /&gt;
				local sub1dab = args.sub1dab&lt;br /&gt;
				if sub1dab then&lt;br /&gt;
					sub1dab = sub1name and trim(format(&amp;quot;%s %s&amp;quot;, sub1dab, sub1name)) or sub1dab&lt;br /&gt;
					link = format(&amp;quot;%s, %s&amp;quot;, link, sub1dab)&lt;br /&gt;
				end&lt;br /&gt;
				link = format(&amp;quot;%s, %s&amp;quot;, link, region) -- Add region to wikilink&lt;br /&gt;
			end&lt;br /&gt;
			sub2Text = format(&amp;quot;%s[[%s|%s]]&amp;quot;, article or &amp;quot;&amp;quot;, link, name)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return {region = regionText, sub1 = sub1Text, sub2 = sub2Text, warnings = warnings}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>&gt;Lectonar</name></author>
	</entry>
</feed>