Module:Jcon/sandbox: Difference between revisions
Appearance
Content deleted Content added
BrandonXLF (talk | contribs) Support custom size |
BrandonXLF (talk | contribs) Use sizes from sizeModule |
||
Line 7: | Line 7: | ||
local parser = require('Module:Road data/parser').parser |
local parser = require('Module:Road data/parser').parser |
||
local roadData = require('Module:Road data/sandbox') -- REMOVE SANDBOX |
local roadData = require('Module:Road data/sandbox') -- REMOVE SANDBOX |
||
local sizeModule = require('Module:Road data/size/sandbox') -- REMOVE SANDBOX |
|||
local data = mw.loadData('Module:Jcon/data/sandbox') -- REMOVE SANDBOX |
local data = mw.loadData('Module:Jcon/data/sandbox') -- REMOVE SANDBOX |
||
Line 26: | Line 27: | ||
-- Generate wikitext to show a MTO sign |
-- Generate wikitext to show a MTO sign |
||
local function showSign(fileName, |
local function showSign(fileName, size, args) |
||
local |
local sizeDef = type(size) == 'table' and size or sizeModule.getDef(size) |
||
local signSize = sizeModule.getType(sizeDef, 'upright') |
|||
fileName = data.signs[fileName] -- Get the file name from the sign definition |
fileName = data.signs[fileName] -- Get the file name from the sign definition |
||
return '[[File:' .. fileName .. '|alt=|link=|' .. |
return '[[File:' .. fileName .. '|alt=|link=|' .. signSize .. ']]' -- Return the file wikitext |
||
end |
end |
||
Line 51: | Line 53: | ||
-- Generate the text part of the output |
-- Generate the text part of the output |
||
local function getText(parserArgs, args, noSelfRedirect) |
local function getText(parserArgs, args, noSelfRedirect) |
||
local linkParserArgs = {} |
|||
⚫ | |||
for k, v in pairs(parserArgs) do linkParserArgs[k] = v end |
|||
⚫ | |||
⚫ | |||
local display = '' |
local display = '' |
||
Line 70: | Line 76: | ||
-- Process routes present in the provided arguments |
-- Process routes present in the provided arguments |
||
local function processRoutes(roadType, showShield, showText, args, prefix, name) |
local function processRoutes(roadType, size, showShield, showText, args, prefix, name) |
||
local shield = '' -- Generated shield wikitext |
local shield = '' -- Generated shield wikitext |
||
local text = '' -- Generated text/link wikitext |
local text = '' -- Generated text/link wikitext |
||
Line 97: | Line 103: | ||
if showShield then |
if showShield then |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
local routeShield = roadData.shield(parserArgs, yesno(args.shield) and 'list', size) -- Generate route shield |
local routeShield = roadData.shield(parserArgs, yesno(args.shield) and 'list', size) -- Generate route shield |
||
Line 109: | Line 110: | ||
end |
end |
||
end |
end |
||
⚫ | |||
if showText then |
if showText then |
||
Line 157: | Line 156: | ||
local showText = not yesno(args.notext) |
local showText = not yesno(args.notext) |
||
local shieldAfter = yesno(args.picaft or args['pic aft']) |
local shieldAfter = yesno(args.picaft or args['pic aft']) |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
local shield = nil -- Generated shield wikitext |
local shield = nil -- Generated shield wikitext |
||
Line 163: | Line 167: | ||
if data.signs[roadType] then |
if data.signs[roadType] then |
||
-- Handle MTO signs |
-- Handle MTO signs |
||
shield = showSign(roadType, args) |
shield = showSign(roadType, size, args) |
||
text = args[2] or '' |
text = args[2] or '' |
||
elseif ON[roadType] then |
elseif ON[roadType] then |
||
-- Handle numbered roads |
-- Handle numbered roads |
||
shield, text = processRoutes(roadType, showShield, showText, args, 'con', args[3]) |
shield, text = processRoutes(roadType, size, showShield, showText, args, 'con', args[3]) |
||
-- Handle to and via parameters |
-- Handle to and via parameters |
||
local toShield, toText = processRoutes(roadType, showShield, showText, args, 'to', args.toname) |
local toShield, toText = processRoutes(roadType, size, showShield, showText, args, 'to', args.toname) |
||
local viaShield, viaText = processRoutes(roadType, showShield, showText, args, 'via', args.vianame) |
local viaShield, viaText = processRoutes(roadType, size, showShield, showText, args, 'via', args.vianame) |
||
if toShield ~= '' then |
if toShield ~= '' then |
||
Line 197: | Line 201: | ||
if shield ~= '' then shield = shield .. ' ' end -- Add space after existing shields |
if shield ~= '' then shield = shield .. ' ' end -- Add space after existing shields |
||
-- Add the MTO sign if provided |
-- Add the MTO sign if provided |
||
shield = shield .. showSign(args.sign, args) |
shield = shield .. showSign(args.sign, size, args) |
||
end |
end |
||
Line 203: | Line 207: | ||
if showShield then |
if showShield then |
||
if shield ~= '' then shield = shield .. ' ' end -- Add space after existing shields |
if shield ~= '' then shield = shield .. ' ' end -- Add space after existing shields |
||
shield = shield .. showSign('tch', args) -- Add the TCH shield |
shield = shield .. showSign('tch', size, args) -- Add the TCH shield |
||
end |
end |
||
Line 250: | Line 254: | ||
local type = normalizeType(args[1]) |
local type = normalizeType(args[1]) |
||
local route = args[2] |
local route = args[2] |
||
local size = args.size or '36px' |
|||
if not ON[type] then return '' end |
if not ON[type] then return '' end |
||
Line 262: | Line 265: | ||
-- Arguments for the road data parser |
-- Arguments for the road data parser |
||
local parserArgs = { |
local parserArgs = { |
||
ignoreifexists = true, |
|||
country = 'CAN', |
country = 'CAN', |
||
province = 'ON', |
province = 'ON', |
||
Line 276: | Line 278: | ||
end |
end |
||
-- Generate route text |
|||
local routeText = getText(parserArgs, { fulltext = true }, true) |
local routeText = getText(parserArgs, { fulltext = true }, true) |
||
Revision as of 19:53, 25 August 2024
![]() | This is the module sandbox page for Module:Jcon (diff). |
![]() | This module is rated as ready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
![]() | This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
![]() | This module depends on the following other modules: |
This module implements Template:Jcon and Template:Shieldlist.
require('strict')
local p = {}
local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local parser = require('Module:Road data/parser').parser
local roadData = require('Module:Road data/sandbox') -- REMOVE SANDBOX
local sizeModule = require('Module:Road data/size/sandbox') -- REMOVE SANDBOX
local data = mw.loadData('Module:Jcon/data/sandbox') -- REMOVE SANDBOX
local ON = mw.loadData('Module:Road data/strings/CAN/ON')
-- Normalize the given road type
local function normalizeType(roadType)
roadType = (roadType or ''):lower() -- Make the road type lowercase
for index, placeType in ipairs(data.placeTypes) do
roadType = roadType -- Remove the place types from the road type
:gsub('^' .. placeType .. ' of ', '')
:gsub(' ' .. placeType .. '$', '')
:gsub(' ' .. placeType .. ' road$', '')
end
return data.typeMap[roadType] or roadType
end
-- Generate wikitext to show a MTO sign
local function showSign(fileName, size, args)
local sizeDef = type(size) == 'table' and size or sizeModule.getDef(size)
local signSize = sizeModule.getType(sizeDef, 'upright')
fileName = data.signs[fileName] -- Get the file name from the sign definition
return '[[File:' .. fileName .. '|alt=|link=|' .. signSize .. ']]' -- Return the file wikitext
end
-- Display a link, accounting for presentation arguments
local function displayLink(link, display, args, followNoLink, noSelfRedirect)
local titleObj = mw.title.new(link)
local noLink = followNoLink and yesno(args.nolink)
local showRed = yesno(args.showred)
if
(not noLink)
and (showRed or (titleObj and titleObj.exists))
and not (noSelfRedirect and titleObj and titleObj.redirectTarget == mw.title.getCurrentTitle())
then
return '[[' .. link .. '|' .. display .. ']]' -- Return the link
else
return display -- Fallback to returning the display text
end
end
-- Generate the text part of the output
local function getText(parserArgs, args, noSelfRedirect)
local linkParserArgs = {}
for k, v in pairs(parserArgs) do linkParserArgs[k] = v end
linkParserArgs.ignoreifexists = true
local link = parser(linkParserArgs, 'link', nil)
local display = ''
if yesno(args.fulltext) then
-- Display the full link title when requested
display = parser(parserArgs, 'name', nil)
else
display = parser(parserArgs, 'abbr', nil)
end
return displayLink(link, display, args, true, noSelfRedirect)
end
-- Gets the wikitext link for a place
local function getPlace(place, args)
return displayLink(place .. ', Ontario', place, args)
end
-- Process routes present in the provided arguments
local function processRoutes(roadType, size, showShield, showText, args, prefix, name)
local shield = '' -- Generated shield wikitext
local text = '' -- Generated text/link wikitext
local conNumber = prefix ~= 'con' and 1 or 0 -- The number of the entry being processed
local paramName = prefix ~= 'con' and prefix or 2 -- Route number parameter name
local typeParam = prefix ~= 'con' and prefix .. 'type' or nil -- Road type override parameter name
local dirParam = prefix ~= 'con' and prefix .. 'dir' or 'dir' -- Direction parameter name
while args[paramName] do
local routeRoadType = roadType -- Local copy of the road info
if typeParam and args[typeParam] then
-- Override the road info if one is provided
routeRoadType = normalizeType(args[typeParam])
end
-- Arguments for the road data parser
local parserArgs = {
to = prefix == 'to',
country = 'CAN',
province = 'ON',
type = routeRoadType,
route = args[paramName]
}
if showShield then
local routeShield = roadData.shield(parserArgs, yesno(args.shield) and 'list', size) -- Generate route shield
if routeShield ~= '' then
if shield ~= '' then shield = shield .. ' ' end -- Add space after existing shields
shield = shield .. routeShield -- Add the shield
end
end
if showText then
local routeText = getText(parserArgs, args) -- Generate route text
if routeText ~= '' then
if text ~= '' then text = text .. ' / ' end -- Add " / " after existing text
text = text .. routeText -- Add route text
end
end
if args[dirParam] then
text = text .. ' ' .. args[dirParam] -- Add the direction
end
conNumber = conNumber + 1 -- Move on to the next concurrency
local suffix = conNumber == 1 and '' or conNumber -- Calculate the next parameter suffix
-- Update the parameter names
paramName = prefix .. suffix
typeParam = prefix .. 'type' .. suffix
dirParam = prefix .. 'dir' .. suffix
end
if name and yesno(args.namefirst) then
text = name .. ' (' .. text .. ')' -- Output name before text when namefirst is set to yes
elseif name then
text = text .. ' (' .. name .. ')' -- Add the name to the produced text
end
return shield, text -- Return generated shield and text wikitext
end
-- Entry function for {{jcon}}
function p.jcon(frame)
local args = getArgs(frame)
if yesno(args.ot) then
-- Set correct arguments if output should be only text
args.nosh = 'yes'
args.nolink = 'yes'
end
local roadType = normalizeType(args[1]) -- The first road type
local showShield = not yesno(args.nosh)
local showText = not yesno(args.notext)
local shieldAfter = yesno(args.picaft or args['pic aft'])
-- Use custom size definition when provided
local size = args.size
and { banner = args.size, upright = args.size, default = 'x' .. args.size }
or 'jct'
local shield = nil -- Generated shield wikitext
local text = nil -- Generated text/name wikitext
if data.signs[roadType] then
-- Handle MTO signs
shield = showSign(roadType, size, args)
text = args[2] or ''
elseif ON[roadType] then
-- Handle numbered roads
shield, text = processRoutes(roadType, size, showShield, showText, args, 'con', args[3])
-- Handle to and via parameters
local toShield, toText = processRoutes(roadType, size, showShield, showText, args, 'to', args.toname)
local viaShield, viaText = processRoutes(roadType, size, showShield, showText, args, 'via', args.vianame)
if toShield ~= '' then
shield = shield .. (shield == '' and '' or ' ') .. toShield -- Add to shields to output
end
if toText ~= '' then
text = text .. (text == '' and 'To ' or ' to ') .. toText -- Add to text
end
if viaShield ~= '' then
-- Add via shields to the output
shield = shield .. (shield == '' and '' or ' <span style="vertical-align:middle;">Via</span> ') .. viaShield
end
if viaText ~= '' then
-- Add via text to the output
text = text .. (text == '' and 'Via ' or ' via ') .. viaText
end
else
return '​' -- Return ZWSP if road type is not supported
end
if args.sign and showShield then
if shield ~= '' then shield = shield .. ' ' end -- Add space after existing shields
-- Add the MTO sign if provided
shield = shield .. showSign(args.sign, size, args)
end
if yesno(args.tch) then
if showShield then
if shield ~= '' then shield = shield .. ' ' end -- Add space after existing shields
shield = shield .. showSign('tch', size, args) -- Add the TCH shield
end
if showText then
if text ~= '' then text = text .. ' / ' end -- Add " / " after existing text
text = text .. '[[Trans-Canada Highway|TCH]]' -- Add the TCH text
end
end
local output = '' -- The returned output
if not shieldAfter then
-- Add the shield if it goes first
output = output .. shield
end
if text ~= '' then
if output ~= '' then output = output .. ' ' end -- Add a NBSP after the shield if it exists
output = output .. text -- Add the generated text to the output
end
-- Process control cities
if args.city or args.town then
output = output .. ' – ' .. getPlace(args.city or args.town, args) -- Add the first city
local extraCityNum = 2 -- The number of the additional city being processed
while args['city' .. extraCityNum] or args['town' .. extraCityNum] do
local val = args['city' .. extraCityNum] or args['town' .. extraCityNum]
output = output .. ', ' .. getPlace(val, args) -- Add extra cities
extraCityNum = extraCityNum + 1
end
end
if shieldAfter and shield then
if output ~= '' then output = output .. ' ' end -- Add a space if output already has text
output = output .. shield -- Add the shield if it goes last
end
return output
end
-- Entry function for {{shieldlist}}
function p.shieldlist(frame)
local args = getArgs(frame)
local type = normalizeType(args[1])
local route = args[2]
if not ON[type] then return '' end
-- Add table
local out = '<table style="background: transparent; margin: 0; padding: 0; width: 100%; align: left;">'
-- Add a table row
out = out .. '<tr>'
-- Arguments for the road data parser
local parserArgs = {
country = 'CAN',
province = 'ON',
type = type,
route = route
}
-- Generate route shield
local routeShield = roadData.shield(parserArgs, 'list', 'list')
if routeShield ~= '' then
out = out .. '<td style="background: transparent; border: 0px; margin: 0px; padding: 0px;">' .. routeShield .. '</td>'
end
-- Generate route text
local routeText = getText(parserArgs, { fulltext = true }, true)
if routeText ~= '' then
out = out .. '<td style="background: transparent; border: 0px; margin: 0px; padding: 0px; text-align: center;">' .. routeText .. '</td>'
end
out = out .. '</tr></table>' -- Finish the table and table row
return out
end
return p