Module:Road data/sandbox explained

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 -- This route type does not define shield. -- Find shield in the default banner table. shield = parser(route, 'shield', name, bannerModule) if shield and shield ~= then if suffix

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)

"table" then local bannerSizeIsNotTable = type(bannerSize) ~= "table"

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, 'shieldtomain') end if not shield and route.to then shield = parser(route, 'shieldto') end if not shield and shieldType

'main' then shield = parser(route, 'shieldmain') end if not shield and shieldType

'list' then shield = parser(route, 'shieldlist') end if not shield then shield = parser(route, 'shield') or end if shield

then return shieldSpec end

local orientation = parser(route, 'orientation') local shieldSize local shieldSizeIsNotTable

if type(orientation)

"table" then shieldSize = shieldSizeIsNotTable = false

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)

"table" then for i, filename in ipairs(shield) do -- Fallback to default size for the size style local singleShieldSize = shieldSizeIsNotTable and shieldSize or shieldSize[i] or size

-- 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

nil then local file = mw.title.new(shield, 'Media').file exists = file.exists -- Cache result shieldExistsCache[shield] = exists end

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 .. ''end

function 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

then return abbr, abbr end

return format("%s", link, abbr), abbrend

return p