local p =
local concat = table.concatlocal insert = table.insertlocal format = mw.ustring.formatlocal trim = mw.text.trim
local parserModule = require("Module:Road data/parser")local parser = parserModule.parserlocal util = require("Module:Road data/util")local sizeModuleName = 'Module:Road data/size/sandbox' -- REMOVE SANDBOX
-- Shieldslocal function addContextBanner(route, name, suffix, bannerSpec, size) local bannerModule = 'Module:Road data/banners/' .. string.upper(route.country) local shieldField = name .. 'shield' local shield = parser(route, shieldField)
if shield
nil then suffix = parser(route, 'shield', 'suffix', bannerModule) end
if suffix and suffix ~= then shield = shield .. " " .. suffix end
shield = shield .. ".svg" end end
if shield and shield ~= then -- Add banner plate insert(bannerSpec,) endend
local function bannerSpec(banner, bannerSize, bannerSuffix, route, size) local banners =
if type(banner)
for i, filename in ipairs(banner) do local singleBannerSize = bannerSizeIsNotTable and bannerSize or bannerSize[i] insert(banners,) end elseif banner ~= then insert(banners,) end
if route.dir then addContextBanner(route, 'dir', bannerSuffix, banners, size) end
if route.to then addContextBanner(route, 'to', bannerSuffix, banners, size) end
return bannersend
local function shieldSpec(route, shieldType, size, ignoreUpright) local shieldSpec =
local shield if route.to and shieldType
'main' then shield = parser(route, 'shieldmain') end if not shield and shieldType
then return shieldSpec end
local orientation = parser(route, 'orientation') local shieldSize local shieldSizeIsNotTable
if type(orientation)
for i, shieldOrientation in ipairs(orientation) do insert(shieldSize, (shieldOrientation ~= 'upright' or ignoreUpright) and 'x' .. size or size) end else shieldSize = (orientation ~= 'upright' or ignoreUpright) and 'x' .. size or size shieldSizeIsNotTable = true end local banner = parser(route, 'banner') or local bannerSize = size local bannerSuffix = parser(route, 'bannersuffix') local bannerIsNotTable = type(banner) ~= "table" local bannerSuffixIsNotTable = type(bannerSuffix) ~= "table"
if type(shield)
-- banner.all describes banners that apply to all multiple shields local shieldBanner = bannerIsNotTable and banner or (banner[i] or banner.all or) local shieldBannerSuffix = bannerSuffix and (bannerSuffixIsNotTable and bannerSuffix or bannerSuffix[i])
insert(shieldSpec,) end elseif shield ~= then insert(shieldSpec,) end
return shieldSpecend
local missingShieldslocal shieldExistsCache =
local function shieldExists(shield) local exists = shieldExistsCache[shield]
if exists
if exists then return true end
insert(missingShields, shield) return falseend
local function render(shieldEntry, nonDecorative) local shield = shieldEntry.shield local banners = shieldEntry.banners local exists = shieldExists(shield[1]) if not exists then return end local alt = if nonDecorative then alt = (parser(shieldEntry.route, 'abbr') or ) .. ' marker' end local shieldCode = format("", shield[1], shield[2], alt) if not banners[1] then return shieldCode end
for _, banner in ipairs(banners) do shieldCode = format("
%s", banner[1], banner[2], alt, shieldCode ) end
return '
' .. shieldCode .. ''endfunction p.shield(route, shieldType, sizeOrStyle, nonDecorative) missingShields = local size local ignoreUpright if sizeOrStyle and sizeOrStyle:match('^%d+px$') then size = sizeOrStyle ignoreUpright = false else local sizeModule = require(sizeModuleName) -- REMOVE SANDBOX size = sizeModule._size ignoreUpright = sizeModule._ignoreUpright(sizeOrStyle) end local rendered = for _, entry in ipairs(shieldSpec(route, shieldType, size, ignoreUpright)) do insert(rendered, render(entry, nonDecorative)) end return concat(rendered, ' '), missingShieldsend
-- Linksfunction p.link(route, useName) local abbr, errMsg = parser(route, useName and 'name' or 'abbr')
if not abbr then route.typeerror = true return util.err(errMsg or format("Invalid type: %s", route.type or "(nil)")) end
if route.nolink then return abbr, abbr end
local link = parser(route, 'link') or if link
return format("%s", link, abbr), abbrend
return p