Module:Jctint/USA

local p = {}

local format = mw.ustring.format local concat = table.concat local insert = table.insert

local roadDataModule = require("Module:Road data")

-- TODO transition -- begin transition code local region_special = { GA = "Georgia", NY = "New York", WA = "Washington" }

local indep_city = { CA = { ["San Francisco"] = { prefix = "City and County of " }	},	CO = { ["Denver"] = { prefix = "City and County of " },		default = { prefix = "City and County of ", linksuffix = ", Colorado" }	},	MD = { ["Baltimore"] = { namesuffix = " City" }	},	PR = { default = { linksuffix = ", Puerto Rico" }	} }

local sub1Config = { LA = "parish", PR = "municipality" }

local sub1name = { LA = "Parish", PR = "" }

local sub1span = { LA = {"cspan", "pspan"}, PR = {"cspan", "munspan"} }

local sub2params = { NY = {"town"}, WI = {"town", "township"} }

local subConfig = { county = { group = "county" },	parish = { group = "parish" },	municipality = { group = "municipal" },	indep_city = { group = "city" },	town = { sub2area = "town", group = "town", single = true },	township = { sub2area = "township", group = "township", single = true, firstnonum = true } }

local pspan = { LA = "plspan" }

local function sub_special(args, subTypeConfig, specialPrefix, subType) -- Find parameter. local subParam for _,p in ipairs(subTypeConfig) do if args[p .. 1] or args[p] then subParam = p			break end end if not subParam then return args[specialPrefix .. "_special"] end local config = subConfig[subParam] or {} local subs = {} -- Retrieve wikilinks for subdivisions. local num = 1 while num == 1 or args[subParam .. num] do -- Save parameters. local saved = {} saved[subType]= args[subType] args[subType] = args[subParam .. num] or num == 1 and args[subParam] saved.sub1dab = args.sub1dab args.sub1dab = args["ctdab" .. num] or args.ctdab or num == 1 and config.firstnonum and args.county saved.area = args.area args.area = not (config.nosub1dab and args.sub1dab) and (config.sub2area or args["area" .. num] or num == 1 and config.firstnonum and args.area) local locns = roadDataModule.locations(args, "jctint", true) -- Restore parameters. args[subType] = saved[subType] args.sub1dab = saved.sub1dab args.area = saved.area subs[num] = locns[subType] num = num + 1 end if #subs > 1 then -- Construct wikitext for multiple subs. local textParts = {} insert(textParts, subs[1]) for i = 2, #subs do			insert(textParts, "–") if i % 2 ~= 0 then -- Odd subs after first begin a new line. insert(textParts, " ") end insert(textParts, subs[i]) end local groupSuffix = args[specialPrefix .. "_group"] or config.group if groupSuffix then insert(textParts,				format("%s%s", #subs % 2 == 0 and " " or " ", groupSuffix)) end if #subs == 2 then insert(textParts, " line") elseif #subs == 3 then insert(textParts, " tripoint") elseif #subs == 4 then insert(textParts, " quadripoint") else insert(textParts, " multipoint") end return concat(textParts) elseif #subs == 1 and config.single then -- TODO transition -- Save parameters. local saved = {} saved[subType]= args[subType] args[subType] = args[subParam .. 1] or args[subParam] saved.sub1dab = args.sub1dab args.sub1dab = args.ctdab1 or args.ctdab or config.firstnonum and args.county saved.area = args.area args.area = not (config.nosub1dab and args.sub1dab) and (config.sub2area or args.area1 or config.firstnonum and args.area) local locns = roadDataModule.locations(args, "jctint") -- Restore parameters. args[subType] = saved[subType] args.sub1dab = saved.sub1dab args.area = saved.area return locns[subType] end end -- end transition code

local function trackedArray(arr) local origArr = arr arr = {} local mt = { __index = function(t, k)			local result = origArr[k] origArr[k] = nil t[k] = result return result end }	setmetatable(arr, mt) return arr end

function p._jctint(args) local sub1config = sub1Config[args.state] or "county" -- Tracked parameters local msgs = {} if (args.township or args.township1) and args[sub1config] and not (args.ctdab or args.ctdab1) then insert(msgs, format("", "D")) elseif not (args.location3 or args.township3 or args.town3) and args.ctdab and (args.ctdab1 or args.ctdab2) then insert(msgs, format("", "D")) end if args.township2 and args.township then insert(msgs, format("", "T")) end if args.type == "mplex" then insert(msgs, format("", "M")) end local blanks = {"location", "altunit", "exit", "road", "notes"} for _,param in ipairs(blanks) do		if args[param] == " " then insert(msgs, format("", "B")) break end end local spans = {"cspan", "lspan", "mspan", "auspan", "ospan", "espan", "namespan", "rspan", "nspan", "pspan", "xcspan", "munspan", "uspan", "kmspan"} for _,param in ipairs(spans) do		if args[param] == "1" then insert(msgs, format("", "S")) break end end local trackedParams = { R = "length_ref", X = "indep_city_special", Y = sub1config .. "_special", Z = "location_special" }	for key,param in pairs(trackedParams) do		if args[param] then insert(msgs, format("", key)) end end

-- Track used arguments local origArgs = args args = trackedArray(args)

local lengthUnit = args.unitdef or "mile" -- Extra parameters local moduleArgs = {} -- Parameters to be renamed local paramSubst = { region_special = "state_special", regionspan = "sspan", sub1 = sub1config, sub1_note = sub1config .. "_note", sub1span = sub1span[args.state] or "cspan", sub1dab = "ctdab", sub2 = "location", sub2span = "lspan", unit = lengthUnit, unit2 = lengthUnit .. "2",		unit_ref = {lengthUnit .. "_ref", "length_ref" --TODO transition}, unit2_ref = {lengthUnit .. "2_ref", "length2_ref" --TODO transition}, uspan = {"mspan", "kmspan"}, place = {"place", "bridge", "tunnel"}, pspan = pspan[args.state] or "pspan" }	-- Redirect undefined arguments to passed arguments local mt = { __index = function(t, k)			if paramSubst[k] then -- Renamed parameter local src = paramSubst[k] if type(src) == "table" then for _,param in ipairs(src) do						if args[param] then return args[param] end end else if args[src] then return args[src] end end end return args[k] end }	setmetatable(moduleArgs, mt)

moduleArgs.country = "USA" -- TODO transition -- begin transition code moduleArgs.primary_topic = "no" moduleArgs.sub1name = sub1name[args.state] or "County" moduleArgs.region_special = region_special[args.state] moduleArgs.region = mw.loadData("Module:Jct/statename")[args.state] -- Independent city local indepCityText = sub_special(moduleArgs, {"indep_city"}, "indep_city", "sub2") if not indepCityText and args.indep_city then local indepCity = args.indep_city local spec = indep_city[args.state] and (indep_city[args.state][indepCity] or indep_city[args.state].default) if spec then local link = format("%s%s%s",				spec.linkprefix or "", indepCity, spec.linksuffix or "") local name = format("%s%s%s",				spec.nameprefix or "", indepCity, spec.namesuffix or "") indepCityText = format("%s%s",				spec.prefix or "", link, name) else -- Specialize independent city to the region. local cityLink = format('%s', indepCity, moduleArgs.region, indepCity) indepCityText = "City of " .. cityLink end args.indep_city = nil end moduleArgs.indep_city_special = indepCityText moduleArgs.sub1_special = sub_special(moduleArgs, {sub1config}, sub1config, "sub1") local sub2Config = {} if args.sub2param then insert(sub2Config, args.sub2param) end if sub2params[args.state] then for _,param in ipairs(sub2params[args.state]) do			insert(sub2Config, param) end end insert(sub2Config, "location") moduleArgs.sub2_special = sub_special(moduleArgs, sub2Config, "location", "sub2") -- end transition code moduleArgs.unitdef = args.unitdef or "mi"

-- Crossing if args.xing then local colType local colAlignType if args.xcspan == "3" then colType = "unitary" colAlignType = "unitary_align" elseif args.xcspan == "2" then colType = "indep_city_special" colAlignType = "indep_city_align" else colType = "sub2_special" colAlignType = "sub2_align" end moduleArgs[colType] = args.xing moduleArgs[colAlignType] = "center" end

local coreModule = require("Module:Jctint/core") local coreResult = coreModule._jctint(moduleArgs)

-- Report unused arguments local unusedArgs = {} for key,_ in pairs(origArgs) do		insert(unusedArgs, key) end

local msg if #msgs > 0 then local page = mw.title.getCurrentTitle.prefixedText -- Get transcluding page's title msg = mw.ustring.gsub(concat(msgs), "%%page%%", page) end return coreResult .. (msg or ""), unusedArgs end

function p.jctint(frame) -- Import module function to work with passed arguments local getArgs = require('Module:Arguments').getArgs local args = getArgs(frame)

-- Remove parameters already used in the template definition if args.used_params then for param in mw.text.gsplit(args.used_params, ",") do			args[param] = nil end args.used_params = nil end

local result, unusedArgs = p._jctint(args)

-- Check for overridden arguments local frameArgs = getArgs(frame, {frameOnly = true}) local parentArgs = getArgs(frame, {parentOnly = true}) for key,_ in pairs(frameArgs) do		if parentArgs[key] then insert(unusedArgs, key) end end

-- Report unused arguments local msg if #unusedArgs > 0 then msg = format("" ..				' Module:Jctint/USA warning: Unused argument(s): %s ',				"U", concat(unusedArgs, ", ")) local page = mw.title.getCurrentTitle.prefixedText -- Get transcluding page's title msg = mw.ustring.gsub(msg, "%%page%%", page) end return result .. (msg or "") end

return p