Module:MetrocarInfobox

From Tyne and Wear Metro wiki

Documentation for this module may be created at Module:MetrocarInfobox/doc

local p = {}

function p.main(frame)
	local args = frame:getParent().args
	
	local semanticData = {}
	
	local tableElement = mw.html.create( 'table' ):addClass( 'infobox' ):wikitext( '[[Category:Metrocar units]]' )
	local captionElement = tableElement:tag( 'caption' )
	local vehicleIdentifierElement = captionElement:tag( 'span' ):addClass( 'vehicle-identifier' )
	if (args['Unit number']) then
		vehicleIdentifierElement:wikitext( 'Metrocar ' .. args['Unit number'] )
		semanticData['Has vehicle identifier'] = args['Unit number']
	else
		local titleText = mw.title.getCurrentTitle().text
		vehicleIdentifierElement:wikitext( titleText )
		semanticData['Has vehicle identifier'] = titleText
	end
	if args['Official nickname'] then
		captionElement:tag( 'span' ):addClass( 'nickname' )
			:wikitext( args['Official nickname']  )
		semanticData['Has official nickname'] = args['Official nickname']
	end
	
	if args['Photo'] then
		tableElement:tag( 'tr' )
			:tag( 'td' ):attr( 'colspan', '2' )
				:wikitext( '[[File:' .. args['Photo'] .. '|300px]]' )
		semanticData['Has primary image'] = 'File:' .. args['Photo']
	end
	
	if args['Status'] then
		local statusKey = mw.text.trim(args['Status']):lower()
		if statusKey == 'active' then
			statusKey = 'passenger service'
		end
		tableElement:node( require('Module:VehicleStates')._renderStatusRow(statusKey) )
	end
	
    local dates = {}
    if args['Date ex-works'] then
		table.insert(dates, 'Ex-works<sup title="Left the production line">[?]</sup> ' .. args['Date ex-works'])
		semanticData['Has date ex-works'] = args['Date ex-works']
    end
    if args['Date accepted for service'] then
		table.insert(dates, 'Accepted for service ' .. args['Date accepted for service'])
		semanticData['Has date accepted for service'] = args['Date accepted for service']
    end
	if args['Date starting Wabtec refurb'] then
		table.insert(dates, 'Pre-Wabtec<sup title="Left Gosforth for Wabtec refurbishment">[?]</sup> ' .. args['Date starting Wabtec refurb'])
		semanticData['Has date starting Wabtec refurb'] = args['Date starting Wabtec refurb']
    end
	if args['Date ending Wabtec refurb'] then
		table.insert(dates, 'Post-Wabtec<sup title="Arrived back at Gosforth after Wabtec refurbishment">[?]</sup> ' .. args['Date ending Wabtec refurb'])
		semanticData['Has date ending Wabtec refurb'] = args['Date ending Wabtec refurb']
    end
	if args['Date of last known passenger service'] then
		table.insert(dates, 'Last known <abbr title="passenger service">pax</abbr> ' .. args['Date of last known passenger service'])
		semanticData['Has date of last known passenger service'] = args['Date of last known passenger service']
    end
	if args['Date officially withdrawn'] then
		table.insert(dates, 'Officially withdrawn ' .. args['Date officially withdrawn'])
		semanticData['Has date officially withdrawn'] = args['Date officially withdrawn']
    end
	if args['Date disposed'] then
		table.insert(dates, 'Disposed ' .. args['Date disposed'])
		semanticData['Has date disposed'] = args['Date disposed']
    end
    
    if #dates == 1 then
		tableElement:tag( 'tr' )
			:tag( 'td' ):addClass( 'key-dates' )
				:attr( 'colspan', '2' )
				:wikitext( dates[1] )
	elseif #dates > 1 then
		local row = tableElement:tag( 'tr' )
		row:tag( 'th' ):attr( 'scope', 'row' ):wikitext( 'Key dates' )
		local list = row:tag( 'td' )
			:tag( 'ul' ):addClass( 'key-dates' )
        for _, date in ipairs(dates) do
            list:tag('li'):wikitext(date)
        end
	end
	
	if args['Grim reaper vehicles'] then
		local row = tableElement:tag( 'tr' )
		row:tag( 'th' ):attr( 'scope', 'row' ):wikitext( 'Grim reapers' )
		local td = row:tag( 'td' )
	    for i, vehicle in ipairs(mw.text.split(args['Grim reaper vehicles'], '%+')) do
	    	if i > 1 then
	    		td:wikitext( '+' )
    		end
    		vehicle = mw.text.trim(vehicle)
			semanticData['Has grim reaper vehicle'] = semanticData['Has grim reaper vehicle'] or {}
			table.insert(semanticData['Has grim reaper vehicle'], vehicle)
    		if mw.title.new( vehicle ).exists then
		        td:wikitext( '[[' .. vehicle .. ']]' )
        	else
		        td:wikitext( vehicle )
    		end
	    end
	end
	
	if args['Held liveries'] then
		local row = tableElement:tag( 'tr' )
		row:tag( 'th' ):attr( 'scope', 'row' ):wikitext( 'Held liveries' )
		local list = row:tag( 'td' )
			:tag( 'ol' ):addClass( 'held-liveries ')
	    for livery in mw.text.gsplit(args['Held liveries'], ',') do
	    	livery = mw.text.trim(livery)
	    	semanticData['Has held livery'] = semanticData['Has held livery'] or {}
	    	table.insert(semanticData['Has held livery'], livery)
	    	list:tag( 'li' ):wikitext( livery )
	    end
	end
	
	if args['Held saloon moquettes'] then
		local row = tableElement:tag( 'tr' )
		row:tag( 'th' ):attr( 'scope', 'row' ):wikitext( 'Held saloon moquettes' )
		local list = row:tag( 'td' )
			:tag( 'ol' ):addClass( 'held-liveries ')
	    for moquette in mw.text.gsplit(args['Held saloon moquettes'], ',') do
	    	moquette = mw.text.trim(moquette)
	    	semanticData['Has held saloon moquette'] = semanticData['Has held saloon moquette'] or {}
	    	table.insert(semanticData['Has held saloon moquette'], moquette)
	    	list:tag( 'li' ):wikitext( moquette )
	    end
	end
	
	if args['Cab A moquette'] or args['Cab B moquette'] then
		local row = tableElement:tag( 'tr' )
		local th = row:tag( 'th' ):attr( 'scope', 'row' )
		local td = row:tag( 'td' )
		if args['Cab A moquette'] and args['Cab B moquette'] then
			th:wikitext( 'Cab moquettes' )
			local cabMoquettesTable = td:tag( 'table' ):addClass( 'cab-moquettes' )
			local cabARow = cabMoquettesTable:tag( 'tr' )
			cabARow:tag( 'th' ):attr( 'scope', 'row' ):wikitext( 'A' )
			cabARow:tag( 'td' ):wikitext( args['Cab A moquette'] )
			semanticData['Has cab A moquette'] = args['Cab A moquette']
			local cabBRow = cabMoquettesTable:tag( 'tr' )
			cabBRow:tag( 'th' ):attr( 'scope', 'row' ):wikitext( 'B' )
			cabBRow:tag( 'td' ):wikitext( args['Cab B moquette'] )
			semanticData['Has cab B moquette'] = args['Cab B moquette']
		elseif args['Cab A moquette'] then
			th:wikitext( 'Cab A moquette' )
			td:wikitext( args['Cab A moquette'] )
			semanticData['Has cab A moquette'] = args['Cab A moquette']
		else
			th:wikitext( 'Cab B moquette' )
			td:wikitext( args['Cab B moquette'] )
			semanticData['Has cab B moquette'] = args['Cab B moquette']
		end
	end

	local smwResult = mw.smw.set( semanticData )
	if smwResult ~= true then
		tableElement:tag('tr')
			:tag('td')
			:attr('colspan', '2')
			:css('color', 'red')
			:css('font-weight', 'bold')
			:wikitext('SMW Error: ' .. smwResult.error)
	end
	
    return tableElement
end

return p