Module:Jct and Module:Jct/sandbox: Difference between pages
Appearance
(Difference between pages)
Content deleted Content added
24 |
BrandonXLF (talk | contribs) Use non-sandbox size module |
||
Line 1: | Line 1: | ||
local p = {} |
local p = {} |
||
-- Change to "" upon deployment. |
|||
local moduleSuffix = "" |
|||
local |
local cityModuleName = "Module:Jct/city" |
||
local statenameModuleName = "Module:Jct/statename" .. moduleSuffix -- TODO transition |
|||
local cityModuleName = "Module:Jct/city" .. moduleSuffix |
|||
local concat = table.concat |
local concat = table.concat |
||
Line 12: | Line 8: | ||
local trim = mw.text.trim |
local trim = mw.text.trim |
||
local parserModule = require( |
local parserModule = require("Module:Road data/parser") |
||
local parser = parserModule.parser |
local parser = parserModule.parser |
||
local util = require("Module:Road data/util") |
local util = require("Module:Road data/util") |
||
local roadDataModule = require("Module:Road data/sandbox") -- REMOVE SANDBOX |
|||
-- Shields |
|||
local defaultShieldSize = 24 |
|||
local function addContextBanner(route, name, suffix, bannerSpec) |
|||
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 |
|||
local shieldSize = defaultShieldSize |
|||
-- Add banner plate. |
|||
insert(bannerSpec, {shield, shieldSize}) |
|||
end |
|||
end |
|||
local function bannerSpec(banner, bannerSize, bannerSuffix, route) |
|||
local banners = {} |
|||
if type(banner) == "table" then |
|||
local bannerSizeIsNotTable = type(bannerSize) ~= "table" |
|||
for i,filename in ipairs(banner) do |
|||
local bannersize = bannerSizeIsNotTable and bannerSize or bannerSize[i] or defaultShieldSize |
|||
insert(banners, {filename, bannersize}) |
|||
end |
|||
elseif banner ~= '' then |
|||
insert(banners, {banner, bannerSize}) |
|||
end |
|||
if route.dir then |
|||
addContextBanner(route, 'dir', bannerSuffix, banners) |
|||
end |
|||
if route.to then |
|||
addContextBanner(route, 'to', bannerSuffix, banners) |
|||
end |
|||
return banners |
|||
end |
|||
local function shieldSpec(route, mainShield, shieldList) |
|||
local shieldSpec = {} |
|||
local shield |
|||
local shieldto = parser(route, 'shieldto') |
|||
if route.to then |
|||
if not shield then shield = shieldto or parser(route, 'shield') or '' end |
|||
else |
|||
if not shield then shield = parser(route, 'shield') or '' end |
|||
end |
|||
if shield == '' then return shieldSpec end |
|||
local orientation = parser(route, 'orientation') |
|||
local function size(route) |
|||
if orientation == "upright" then |
|||
return defaultShieldSize |
|||
else return "x" .. defaultShieldSize |
|||
end |
|||
end |
|||
local shieldsize = size(route) |
|||
local banner = parser(route, 'banner') or {} |
|||
local bannersize = defaultShieldSize |
|||
local bannersuffix = parser(route, 'bannersuffix') |
|||
local bannerIsNotTable = type(banner) ~= "table" |
|||
local bannersizeIsNotTable = type(bannersize) ~= "table" |
|||
local bannersuffixIsNotTable = type(bannersuffix) ~= "table" |
|||
if type(shield) == "table" then |
|||
for i,filename in ipairs(shield) do |
|||
local size = shieldsize or shieldsize[i] |
|||
if size == "" then size = nil end |
|||
-- banner.all describes banners that apply to all multiple shields. |
|||
local shieldBanner = bannerIsNotTable and banner or (banner[i] or banner.all or {}) |
|||
-- Banner size is default if the corresponding entry |
|||
-- in bannerSize table is not set. |
|||
local shieldBannerSize = |
|||
bannersizeIsNotTable and bannersize |
|||
or (bannersize[i] or bannersize.all or defaultShieldSize) |
|||
local shieldBannerSuffix = bannersuffix and (bannersuffixIsNotTable and bannersuffix or bannersuffix[i]) |
|||
insert(shieldSpec, { |
|||
shield = {filename, size}, |
|||
banners = bannerSpec(shieldBanner, shieldBannerSize, shieldBannerSuffix, route) |
|||
}) |
|||
end |
|||
elseif shield ~= '' then |
|||
if shieldsize == "" then shieldsize = nil end |
|||
insert(shieldSpec, { |
|||
shield = {shield, shieldsize}, |
|||
banners = bannerSpec(banner, bannersize, bannersuffix, route) |
|||
}) |
|||
end |
|||
return shieldSpec |
|||
end |
|||
local missingShields |
|||
local shieldExistsCache = {} |
|||
local function render(shieldEntry, scale, showLink) |
|||
local shield = shieldEntry.shield |
|||
local banners = shieldEntry.banners |
|||
local size |
|||
if shield[2] then |
|||
local width, height = mw.ustring.match(shield[2], "(%d*)x?(%d*)") |
|||
width = tonumber(width) |
|||
height = tonumber(height) |
|||
local sizeparts = {} |
|||
if width then |
|||
insert(sizeparts, format("%d", width * scale)) |
|||
end |
|||
if height then |
|||
insert(sizeparts, format("x%d", height * scale)) |
|||
end |
|||
size = concat(sizeparts) |
|||
else |
|||
size = format("%s%d", landscape and "x" or "", defaultShieldSize * scale) |
|||
end |
|||
local shieldCode = format("[[File:%s|%spx|link=|alt=]]", shield[1], size) |
|||
if not banners[1] then return shieldCode end |
|||
for _,banner in ipairs(banners) do |
|||
shieldCode = format("[[File:%s|%spx|link=|alt=]]<br>%s", |
|||
banner[1], |
|||
defaultShieldSize, |
|||
shieldCode) |
|||
end |
|||
return '<span style="display: inline-block; vertical-align: baseline; line-height: 0; text-align: center;">' .. shieldCode .. '</span>' |
|||
end |
|||
function p.shield(route, scale, showLink, mainShield, shieldList) |
|||
missingShields = {} |
|||
scale = scale or 1 |
|||
local rendered = {} |
|||
for _,entry in ipairs(shieldSpec(route, mainShield, shieldList)) do |
|||
insert(rendered, render(entry, scale, showLink)) |
|||
end |
|||
return concat(rendered), missingShields |
|||
end |
|||
-- Links/abbreviations |
|||
function p.link(route) |
|||
local nolink = route.nolink |
|||
local abbr = parser(route, 'abbr') |
|||
if nolink then |
|||
return abbr |
|||
else |
|||
local link = parser(route, 'link') |
|||
if not link or link == '' then |
|||
return abbr |
|||
else |
|||
return format("[[%s|%s]]", link, abbr) |
|||
end |
|||
end |
|||
end |
|||
------------------------------------------- |
|||
-- Links/abbreviations |
-- Links/abbreviations |
||
local function routeText(route, jctname, frame) |
local function routeText(route, jctname, frame, routeMap) |
||
local link |
local link |
||
local type = route.type |
local type = route.type |
||
Line 198: | Line 20: | ||
link = route.route |
link = route.route |
||
else |
else |
||
link = |
link = roadDataModule.link(route) |
||
end |
end |
||
Line 208: | Line 30: | ||
local mainText = jctname and name or routeText |
local mainText = jctname and name or routeText |
||
local parenText = jctname and routeText or name |
local parenText = jctname and routeText or name |
||
if routeMap then |
|||
return frame:expandTemplate{ title = 'BSsplit', args = {mainText, parenText, align = 'left', valign = 'middle' } } |
|||
end |
|||
return format('%s (%s)', mainText, parenText) |
return format('%s (%s)', mainText, parenText) |
||
Line 215: | Line 41: | ||
end |
end |
||
local function extra(args) |
local function extra(args, sizeStyle) |
||
local extraTypes = mw.loadData('Module:Road data/extra') |
local extraTypes = mw.loadData('Module:Road data/extra') |
||
local extraIcon = extraTypes[string.lower(args.extra or '')] |
local extraIcon = extraTypes[string.lower(args.extra or '')] |
||
if not extraIcon then return '' end |
if not extraIcon then return '' end |
||
local size = |
local size = require('Module:Road data/size')._size{ style = sizeStyle } |
||
local countryIcon = extraIcon[args.country] or extraIcon.default |
local countryIcon = extraIcon[args.country] or extraIcon.default |
||
if type(countryIcon) == 'table' then |
if type(countryIcon) == 'table' then |
||
Line 301: | Line 127: | ||
for num,route in ipairs(routes) do |
for num,route in ipairs(routes) do |
||
if not (args.noshield or route.noshield) then |
if not (args.noshield or route.noshield) then |
||
local shield, missingShields = |
local shield, missingShields = roadDataModule.shield(route, nil, 'jct') |
||
insert(shields, shield) |
insert(shields, shield) |
||
if missingShields[1] then |
if missingShields[1] then |
||
Line 313: | Line 139: | ||
toErr = toErr or route.toerror or false |
toErr = toErr or route.toerror or false |
||
end |
end |
||
local |
local extraOutput = extra(args, 'jct') |
||
local graphics = concat(shields, ' ') .. (extraOutput ~= '' and ' ' or '') .. extraOutput .. ' ' |
|||
local linkText = concat(links) |
local linkText = concat(links) |
||
local cities = '' |
local cities = '' |
||
Line 426: | Line 253: | ||
local args = getArgs(frame, {removeBlanks = true}) |
local args = getArgs(frame, {removeBlanks = true}) |
||
return p._roadlink(args, frame) |
return p._roadlink(args, frame) |
||
end |
|||
function p._jctrdt(args, frame) |
|||
local routes = parseArgs(args) |
|||
local shields = {} |
|||
local links = {} |
|||
frame = frame or mw.getCurrentFrame() |
|||
for num,route in ipairs(routes) do |
|||
if not (args.noshield or route.noshield) then |
|||
local shield = roadDataModule.shield(route, nil, 'rdt') |
|||
insert(shields, shield) |
|||
end |
|||
local prefix = prefix(route.to, num) |
|||
if prefix ~= '' then insert(links, prefix) end |
|||
insert(links, routeText(route, args.jctname, frame, true)) |
|||
end |
|||
local graphics = concat(shields, ' ') .. ' ' |
|||
local linkText = concat(links) |
|||
local cities = '' |
|||
if args.city1 or args.location1 then |
|||
local citiesPrefix |
|||
if args.citiesprefix then |
|||
citiesPrefix = args.citiesprefix ~= '' and format(" %s ", args.citiesprefix) or '' |
|||
else |
|||
citiesPrefix = ' ' |
|||
end |
|||
local cityModule = require(cityModuleName) |
|||
cities = citiesPrefix .. cityModule.city(args) |
|||
end |
|||
return graphics .. linkText .. cities |
|||
end |
|||
function p.jctrdt(frame) |
|||
-- Import module function to work with passed arguments |
|||
local getArgs = require('Module:Arguments').getArgs |
|||
local args = getArgs(frame, {removeBlanks = false}) |
|||
return p._jctrdt(args, frame) |
|||
end |
end |
||