# Module:Infobox road/route

local p = {}  

local format = mw.ustring.format  
require('strict')  
local getArgs = require('Module:Arguments').getArgs  
local parserModule = require 'Module:Road data/parser'  
local parser = parserModule.parser  

local function banner(args, style)  
if args.marker_image then return nil end  

local bannerSize  
if style == 'small' then  
bannerSize = ""  
else  
bannerSize = ""  
end  

local shield = parser(args, 'banner')  
local alt = parser(args, 'banner')  

if not shield or shield == '' then  
return nil  
else  
return string.format('', shield, bannerSize, alt)  
end  
end  

local function shield(args, style)  

if args.marker_image then return args.marker_image end  

local horizontalSize  
local verticalSize  
if style == 'small' then  
horizontalSize = "90x40px"  
verticalSize = "40x90px"  
else  
horizontalSize = "154x72px"  
verticalSize = "72x154px"  
end  

local shield = parser(args, 'shieldmain') or parser(args, 'shield') or ''  

local label = parser(args, 'name') or parser(args, 'abbr') or ''  
local alt = label .. ' marker'  
local orientation = parser(args, 'orientation')  

local function simpleSize(args)  
if orientation and orientation == 'upright' then  
return verticalSize  
else  
return horizontalSize  
end  
end  

local function shield_size(image_name, orientation)  
local image = 'File:' .. image_name  
local title = mw.title.new(image)  

local width = title.file.width  
local height = title.file.height  

if (orientation and orientation == 'upright') or height > width then  
return verticalSize  
else  
return horizontalSize  
end  
end  

if not shield or shield == '' then  
return nil  
elseif type(shield) == 'table' then  
local res = {}  
local sizes = {}  
for i,v in ipairs(shield) do  
sizes[i] = v  
res[i] = string.format('', v, shield_size(v), alt)  
end  
return table.concat(res, ' ')  
else  
return string.format('', shield, simpleSize(args), alt)  
end  
end  

-- Links/abbreviations  
local function name(args)  
local name = args.name or parser(args, 'name') or parser(args, 'abbr')  
return name  
end  

function p._routeInfo(args)  

local style = args.style  
local banner = banner(args, style)  
local shield = shield(args, style)  
local name = name(args)  

if not args.type and not args.route and not args.name and not args.marker_image then  
local container = nil  
else local container = mw.html.create('div'):cssText('text-align:;')  
if shield == nil or args.marker_image == '' or args.name and not args.marker_image and not args.type and not args.route then  
container:tag('p'):cssText('margin:0.1em;'):wikitext(name)  
elseif args.marker_image ~= * and args.name == * or args.name == nil and not args.type and not args.route then  
container:tag('p'):cssText('margin:0.1em;'):wikitext(shield)  
elseif args.country == 'AUS' then  
container:tag('p'):cssText('margin:0.1em;'):wikitext(name)  
container:tag('p'):cssText('margin:0.1em 0 0 0;'):wikitext(shield)  
else  
container:tag('p'):cssText('margin:0.1em 0 0 0;'):wikitext(banner)  
container:tag('p'):cssText('margin:0 0 0.1em;'):wikitext(shield)  
container:tag('p'):cssText('margin:0.1em;'):wikitext(name)  
end  
return tostring(container)  
end  
end  

function p.routeInfo  
local args = getArgs  
return p._routeInfo(args);  
end  

function p._shields(args)  

local style = args.style  
local banner = banner(args, style)  
local shield = shield(args, style)  

if not args.type and not args.route and not args.name and not args.marker_image then  
local container = nil  
else local container = mw.html.create('div'):cssText('text-align:; display: inline-block; vertical-align: baseline; line-height: 0;')  
container:tag('p'):cssText('margin:0.1em 0 0 0;'):wikitext(banner)  
container:tag('p'):cssText('margin:0 0 0.1em;'):wikitext(shield)  
return tostring(container)  
end  
end  

function p.shields  
local args = getArgs  
return p._shields(args);  
end  

function p._names(args)  
local name = name(args)  
return name  
end  

function p.names  
local args = getArgs  
return p._names(args);  
end  

return p