Module:Jctint/USA
Documentation for this module may be created at Module:Jctint/USA/doc
Documentation for this module may be created at Module:Jctint/USA/doc
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 (U.S. state)|Georgia]]",
NY = "[[New York (state)|New York]]",
WA = "[[Washington (state)|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"
}
}
}
local sub1Config = {
LA = "parish"
}
local sub1name = {
LA = "Parish"
}
local sub1span = {
LA = {"cspan", "pspan"}
}
local sub2params = {
NY = {"town"},
WI = {"town", "township"}
}
local subConfig = {
county = {
group = "county"
},
parish = {
group = "parish"
},
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, "<br>")
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 "<br>" 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, " [[Quadripoint#Multipoints of greater numerical complexity|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("[[Category:Jctint template tracking category|%s %%page%%]]", "D"))
elseif not (args.location3 or args.township3 or args.town3) and args.ctdab and (args.ctdab1 or args.ctdab2) then
insert(msgs, format("[[Category:Jctint template tracking category|%s %%page%%]]", "D"))
end
if args.township2 and args.township then
insert(msgs, format("[[Category:Jctint template tracking category|%s %%page%%]]", "T"))
end
if args.type == "mplex" then
insert(msgs, format("[[Category:Jctint template tracking category|%s %%page%%]]", "M"))
end
local blanks = {"location", "altunit", "exit", "road", "notes"}
for _,param in ipairs(blanks) do
if args[param] == " " then
insert(msgs, format("[[Category:Jctint template tracking category|%s %%page%%]]", "B"))
break
end
end
local spans = {"cspan", "lspan", "mspan", "auspan", "ospan", "espan", "namespan", "rspan", "nspan", "pspan", "xcspan"}
for _,param in ipairs(spans) do
if args[param] == "1" then
insert(msgs, format("[[Category:Jctint template tracking category|%s %%page%%]]", "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("[[Category:Jctint template tracking category|%s %%page%%]]", 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]]},
uspan = "mspan",
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|%s]]",
spec.prefix or "", link, name)
else
-- Specialize independent city to the region.
local cityLink = format('[[%s, %s|%s]]', indepCity, moduleArgs.region, indepCity)
indepCityText = "[[Independent city (United States)|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("[[Category:Jctint template tracking category|%s %%page%%]]" ..
'<tr style="display: none;"><td>Module:Jctint/USA warning: Unused argument(s): %s</td></tr>',
"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
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.