This module pulls data from road data strings, such as Module:Road data/strings/USA, and passes it through three functions that draw the necessary route marker images and displays the route name in {{Infobox road}}.

Output examples
Description Output Output (sandbox)
Florida Both

SR 869 marker SR 869 marker

SR 869

SR 869 marker SR 869 marker

SR 869

No parameters
Only |marker_image=

Florida |marker_image=none

SR A1A

SR A1A

Only |name=

Autoroute 10

Autoroute 10

Interstate |name=

I-10 marker

Motorway 10

I-10 marker

Motorway 10

Interstate (Infobox road small)

Interstate 95 marker Interstate 95 marker

Interstate 95

Interstate 95 marker Interstate 95 marker

Interstate 95

France

A 1 marker

A 1

A 1 marker

A 1

UK

A303 marker

A303

A303 marker

A303

BC

Hwy 16 marker

Hwy 16

Hwy 16 marker

Hwy 16

Saskatchewan

Hwy 600 marker

Hwy 600

Hwy 600 marker

Hwy 600

Quebec

A-35 marker

A-35

A-35 marker

A-35

Ontario

Highway 407 marker

Highway 407

Highway 407 marker

Highway 407

ON Secondary

Highway 522 marker

Highway 522

Highway 522 marker

Highway 522

ON Tertiary

Highway 800 marker

Highway 800

Highway 800 marker

Highway 800

NWT

Highway 10 marker

Highway 10

Highway 10 marker

Highway 10

Manitoba

PTH 3 marker

PTH 3

PTH 3 marker

PTH 3

Tennessee Dual

SR 1 marker SR 1 marker

SR 1

SR 1 marker SR 1 marker

SR 1

DE/MD Dual

DE / MD 54 marker DE / MD 54 marker

DE / MD 54

DE / MD 54 marker DE / MD 54 marker

DE / MD 54

Wisconsin

State Trunk Highway 243 marker

State Trunk Highway 243

State Trunk Highway 243 marker

State Trunk Highway 243

North Carolina

NC 106 marker

NC 106

NC 106 marker

NC 106

Nevada BLSR

Utah BLSR

Texas Both

SH 1 marker SH 1 marker

SH 1

SH 1 marker SH 1 marker

SH 1

Texas tollway

Pres. George Bush Turnpike marker

Pres. George Bush Turnpike

Pres. George Bush Turnpike marker

Pres. George Bush Turnpike

1926 USH

1948 USH

U.S. Route 40 marker

U.S. Route 40

U.S. Route 40 marker

U.S. Route 40

Special route

Business plate.svg

US 78 Bus. marker

US 78 Bus.

Business plate.svg

US 78 Bus. marker

US 78 Bus.

Special route (style=small)

Business plate.svg

Bus. US 131 marker

Bus. US 131

Business plate.svg

Bus. US 131 marker

Bus. US 131

Alaska |marker_image=

AK-2

AK-2

DC

DC 295 marker

DC 295

DC 295 marker

DC 295

Mexico

Fed. 40D marker

Fed. 40D

Fed. 40D marker

Fed. 40D

Sonora
GRR

Great River Road marker

Great River Road

Great River Road marker

Great River Road

Tour

Lake Michigan Circle Tour marker

Lake Michigan Circle Tour

Lake Michigan Circle Tour marker

Lake Michigan Circle Tour

Turnpike

Kansas Turnpike marker

Kansas Turnpike

Kansas Turnpike marker

Kansas Turnpike

County road

County Road Z36 marker

County Road Z36

County Road Z36 marker

County Road Z36

Parish road

PR 16 marker

PR 16

PR 16 marker

PR 16

CSAH

County Road 81 marker

County Road 81

County Road 81 marker

County Road 81

Secondary

S-206 marker

S-206

S-206 marker

S-206

Supplemental

Route BB marker

Route BB

Route BB marker

Route BB

Oregon

OR 35 marker

OR 35

OR 35 marker

OR 35

Oregon Highway


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 = "40px"
		else
			bannerSize = "72px"
		end
	
	local shield = parser(args, 'banner')
	local alt = parser(args, 'banner')

	if not shield or shield == '' then
		return nil
	else
		return string.format('[[File:%s|%s|alt=%s]]', 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('[[File:%s|%s|alt=%s]]', v, shield_size(v), alt)
		end
    	return table.concat(res, ' ')
	else
		return string.format('[[File:%s|%s|alt=%s]]', 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:center;')
		if shield == nil or args.marker_image == 'none' 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(frame)
	local args = getArgs(frame)
	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:center; 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(frame)
	local args = getArgs(frame)
	return p._shields(args);
end


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

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

return p