Difference between revisions of "Module:Jct"
From NSWiki
Line 193: | Line 193: | ||
elseif widthCode == 'wide' then | elseif widthCode == 'wide' then | ||
insert(secondRun, "[[File:No image wide.svg|25px|link=|alt=]]") | insert(secondRun, "[[File:No image wide.svg|25px|link=|alt=]]") | ||
− | elseif widthCode == ' | + | elseif widthCode == 'CS1926' then |
insert(secondRun, "[[File:No image wide.svg|21px|link=|alt=]]") | insert(secondRun, "[[File:No image wide.svg|21px|link=|alt=]]") | ||
elseif widthCode == 'SD' then | elseif widthCode == 'SD' then | ||
Line 233: | Line 233: | ||
insert(secondRun, format("[[File:%s|20px|link=|alt=]]", bannerFile)) | insert(secondRun, format("[[File:%s|20px|link=|alt=]]", bannerFile)) | ||
end | end | ||
− | elseif widthCode == ' | + | elseif widthCode == 'CS1926' then |
insert(secondRun, format("[[File:%s|20px|link=|alt=]][[File:No image.svg|1px|link=|alt=]]", bannerFile)) | insert(secondRun, format("[[File:%s|20px|link=|alt=]][[File:No image.svg|1px|link=|alt=]]", bannerFile)) | ||
elseif v.state == 'CA' then | elseif v.state == 'CA' then | ||
local route = v.route | local route = v.route | ||
local type = v.type | local type = v.type | ||
− | if type == ' | + | if type == 'CS-Bus' then |
if #route >= 3 then | if #route >= 3 then | ||
insert(secondRun, format("[[File:No image.svg|1px|link=|alt=]][[File:%s|20px|link=|alt=]][[File:No image.svg|2px|link=|alt=]]", bannerFile)) | insert(secondRun, format("[[File:No image.svg|1px|link=|alt=]][[File:%s|20px|link=|alt=]][[File:No image.svg|2px|link=|alt=]]", bannerFile)) |
Latest revision as of 22:27, 25 October 2014
Documentation for this module may be created at Module:Jct/doc
local p = {} local concat = table.concat local insert = table.insert local getArgs = require('Module:Arguments').getArgs -- Import module function to work with passed arguments local parserModule = require "Module:Road data/parser" local parser = parserModule.parser -- Shields local rdt local function size(args) local state = args.state or args.province or '' local type = args.type if rdt then return 'x17' elseif state == 'FL' then if type == 'Toll' or type == 'FLTP' or type == 'HEFT' then return '20' elseif type == 'Both' then return '20', 'x20' end elseif state == 'NY' then if type == 'NY 1927' or type == 'NY 1948' or (type == 'Parkway' and args.route == "Robert Moses") or (type == 'CR' and args.county == 'Erie') then return '20' end elseif state == 'AB' then if type == 'AB' or type == 'Hwy' or type == '2ndHwy' then return '18' end elseif state == 'NS' and type == 'Hwy' then return '18' elseif state == 'ON' then if type == 'ON' or type == 'Hwy' or type == 'Highway' or type == 'QEW' then return '24x22' elseif type == 'KLR' then return '21' else local countyTypes = {CH = true, RH = true, District = true, Regional = true, County = true, Municipal = true} if countyTypes[type] then return '19' end end elseif state == 'QC' then if type == 'QC' or type == 'Route' or type == 'A' or type == 'Autoroute' then return '18' end elseif state == 'SK' then if type == 'Hwy' or type == 'SK' then return 'x25' end end return 'x20' end local function shield(args, frame) if args.noshield then return '' end local firstSize, secondSize = size(args) local shield, second = parser(args, 'shield') if not shield or shield == '' then return '' end local function render(shield, size) if frame:callParserFunction('#ifexist', 'Media:' .. shield, '1') ~= '' then return string.format("[[File:%s|%spx|link=|alt=]]", shield, size) else args.shielderr = true local page = mw.title.getCurrentTitle().prefixedText -- Get transcluding page's title return mw.ustring.format("[[Category:Jct template errors|1 %s]]", page) end end local rendered = render(shield, firstSize) if second then local size = secondSize or firstSize rendered = rendered .. render(second, size) end return rendered end -- Links/abbreviations local function link(args) local nolink = args.nolink local abbr = parser(args, 'abbr') if nolink then return abbr else local link = parser(args, 'link') if not link or link == '' then return abbr else return mw.ustring.format("<span class=\"nowrap\">[[%s|%s]]</span>", link, abbr) end end end local function completeLink(args, num) local actualLink = link(args) if not actualLink then local page = mw.title.getCurrentTitle().prefixedText -- Get transcluding page's title actualLink = string.format("<span class=\"error\">Invalid type: %s</span>[[Category:Jct template errors|2 %s]]", args.type, page) end local isTo = args.to local prefix if num == 1 then if isTo then prefix = "To " else prefix = '' end else if isTo then prefix = " to " else prefix = " / " end end local suffix = {} local dir = args.dir if dir then insert(suffix, ' ' .. string.lower(dir)) end local name = args.name if name then insert(suffix, mw.ustring.format(' (%s)', name)) end return prefix .. actualLink .. concat(suffix) end local function namedLink(args, num) local actualLink = link(args) local name = args.name or '' local isTo = args.to local prefix if num == 1 then if isTo then prefix = "To " else prefix = '' end else if isTo then prefix = " to " else prefix = " / " end end local suffix = {} local dir = args.dir if name ~= '' then if dir then insert(suffix, mw.ustring.format(' (%s %s)', actualLink, dir)) else insert(suffix, mw.ustring.format(' (%s)', actualLink)) end else insert(suffix, actualLink) if dir then insert(suffix, ' ' .. string.lower(dir)) end end return prefix .. name .. concat(suffix) end local function banners(routes) local format = string.format local firstRun = {} local hasBanner = false for k,v in ipairs(routes) do local banner if v.shield == '' or v.shielderr then banner = false else banner = parser(v, 'banner') or '' if banner and banner ~= '' then hasBanner = true end end insert(firstRun, banner) end if not hasBanner then return '' end local secondRun = {} for k,v in ipairs(routes) do local bannerFile = firstRun[k] if not bannerFile then elseif bannerFile == '' then local widthCode = parser(v, 'width') or 'square' if type(widthCode) == 'number' then insert(secondRun, "[[File:No image wide.svg|" .. tostring(widthCode) .. "px|link=|alt=]]") elseif widthCode == 'square' then insert(secondRun, "[[File:No image wide.svg|20px|link=|alt=]]") elseif widthCode == 'expand' then local route = v.route local width = (#route >= 3) and '25' or '20' insert(secondRun, format("[[File:No image wide.svg|%spx|link=|alt=]]", width)) elseif widthCode == 'wide' then insert(secondRun, "[[File:No image wide.svg|25px|link=|alt=]]") elseif widthCode == 'CS1926' then insert(secondRun, "[[File:No image wide.svg|21px|link=|alt=]]") elseif widthCode == 'SD' then local route = v.route local width = (#route >= 3) and '23' or '20' insert(secondRun, format("[[File:No image wide.svg|%spx|link=|alt=]]", width)) elseif (v.state == 'CA') or (v.type == 'CA') then local route = v.route local widths = {default = {'20', '25'}, I = {'20', '24'}, CS = {'20', '23'}, SR = {'19', '22'}} local width = widths[widthCode] or widths.default local pixels = (#route >= 3) and width[2] or width[1] insert(secondRun, format("[[File:No image wide.svg|%spx|link=|alt=]]", pixels)) end else local widthCode = parser(v, 'width') or 'square' if widthCode == 'square' then insert(secondRun, format("[[File:%s|20px|link=|alt=]]", bannerFile)) elseif widthCode == 'expand' then local route = v.route if #route >= 3 then insert(secondRun, format("[[File:No image.svg|2px|link=|alt=]][[File:%s|20px|link=|alt=]][[File:No image.svg|3px|link=|alt=]]", bannerFile)) else insert(secondRun, format("[[File:%s|20px|link=|alt=]]", bannerFile)) end elseif widthCode == 'wide' then insert(secondRun, format("[[File:No image.svg|2px|link=|alt=]][[File:%s|20px|link=|alt=]][[File:No image.svg|3px|link=|alt=]]", bannerFile)) elseif widthCode == 'SD' then local route = v.route if #route >= 3 then insert(secondRun, format("[[File:No image.svg|1px|link=|alt=]][[File:%s|20px|link=|alt=]][[File:No image.svg|2px|link=|alt=]]", bannerFile)) else insert(secondRun, format("[[File:%s|20px|link=|alt=]]", bannerFile)) end elseif widthCode == 'MOSupp' then local route = v.route if #route >= 2 then insert(secondRun, format("[[File:No image.svg|2px|link=|alt=]][[File:%s|20px|link=|alt=]][[File:No image.svg|3px|link=|alt=]]", bannerFile)) else insert(secondRun, format("[[File:%s|20px|link=|alt=]]", bannerFile)) end elseif widthCode == 'CS1926' then insert(secondRun, format("[[File:%s|20px|link=|alt=]][[File:No image.svg|1px|link=|alt=]]", bannerFile)) elseif v.state == 'CA' then local route = v.route local type = v.type if type == 'CS-Bus' then if #route >= 3 then insert(secondRun, format("[[File:No image.svg|1px|link=|alt=]][[File:%s|20px|link=|alt=]][[File:No image.svg|2px|link=|alt=]]", bannerFile)) else insert(secondRun, format("[[File:%s|20px|link=|alt=]]", bannerFile)) end elseif type == 'CA-Bus' or type == 'SR-Bus' then if #route >= 3 then insert(secondRun, format("[[File:No image.svg|1px|link=|alt=]][[File:%s|19px|link=|alt=]][[File:No image.svg|2px|link=|alt=]]", bannerFile)) else insert(secondRun, format("[[File:%s|19px|link=|alt=]]", bannerFile)) end end end end end return concat(secondRun) .. '<br>' end local function extra(args) local extraTypes = {rail = "[[File:Rail Sign.svg|20px|alt=|link=]]", ["light-rail"] = "[[File:Light Rail Sign.svg|20px|alt=|link=]]", bus = "[[File:Bus Sign.svg|20px|alt=|link=]]", ferry = "[[File:Ferry Sign.svg|20px|alt=|link=]]", hospital = {default = "[[File:Hospital sign.svg|20px|alt=|link=]]", AUS = "[[File:Western Australia MR-SM-1.svg|20px|alt=|link=]]"}, airport = {default = "[[File:Airport Sign.svg|20px|alt=|link=]]", AUS = "[[File:Western Australia MR-SM-11.svg|20px|alt=|link=]]", GBR = "[[File:Aircraft Airport ecomo.svg|20px|alt=|link=]]", TWN = "[[File:Legenda lotnisko.svg|20px|alt=|link=]]"}} local extraIcon = extraTypes[string.lower(args.extra or '')] if not extraIcon then return '' elseif type(extraIcon) == 'table' then return extraIcon[args.country] or extraIcon.default else return extraIcon end end local function parseArgs(args) local state = args.state or args.province local country if args.country then country = string.upper(args.country) else local countryModule = mw.loadData("Module:Road data/countrymask") country = countryModule[state] or 'UNK' args.country = country end local params = {'denom', 'county', 'township', 'dab', 'nolink', 'noshield', 'to', 'dir', 'name'} local routeArgs = {} local routeCount = 1 while true do local routeType = args[routeCount * 2 - 1] if not routeType then break end local route = {type = routeType, route = args[routeCount * 2]} for _,v in pairs(params) do route[v] = args[v .. routeCount] end route.country = country route.state = state insert(routeArgs, route) routeCount = routeCount + 1 end return routeArgs end function p._jct(args, frame) rdt = args.rdt local routes = parseArgs(args) local extra = extra(args) local shields = {} local links = {} frame = frame or mw.getCurrentFrame() for num,route in ipairs(routes) do local routeShield = shield(route, frame) insert(shields, routeShield) route.shield = routeShield if args.jctname then insert(links, namedLink(route, num)) else insert(links, completeLink(route, num)) end end local bannerText = banners(routes) local shieldText = concat(shields) local linkText = concat(links) local graphics = (not(args.noshield) and (bannerText .. shieldText) or '') .. extra .. ' ' local cities = '' if args.city1 or args.location1 then local cityModule = require "Module:Jct/city" cities = cityModule.city(args) end local roadStr = '' local road = args.road if road then if args.toroad then roadStr = ' to ' .. road else roadStr = ' / ' .. road end end local output = graphics .. linkText .. roadStr .. cities return mw.text.trim(output) end function p.jct(frame) local args = getArgs(frame) return p._jct(args, frame) end return p