A modult a Modul:BS-daten/doc lapon tudod dokumentálni

require('strict')
local p = {}

-- TODO: add other types
local electricity_types = {
	Q1412243 = '[[25 kV-os villamos vontatás|25 kV]] [[Váltakozó áram|~]]',
	Q1415234 = '[[15 kV-os villamos vontatás|15 kV]] [[Váltakozó áram|~]]'
}

local function get_param(args, params)
	for _, n in ipairs(params) do
		if args[n] then
			return args[n]
		end
	end
end

local function formatStatements(...)
	formatStatements = require('Modul:Wikidata').formatStatements
	return formatStatements(...)
end

local function wd(args)
	args['felsorolás'] = 'table'
	return formatStatements(nil, args)
end

local function image(rows, file, size, alt, capture)
	if not file then
		return
	end
	local link = ('[[Fájl:%s|%s%s]]'):format(file, size or '250px', alt and '|'..alt or '')
	capture = capture and ('<div style="font-size:smaller;">%s</div>'):format(capture) or ''
	table.insert(rows, ('<tr style="text-align:center;"><td colspan="2">%s%s</td></tr>'):format(link, capture))
end

local function data_cell(rows, name, value, ext)
	if value then
		local pl = ''
		if type(value) == 'table' then
			if #value == 0 then
				return
			end
			if ext then
				for i, _ in ipairs(value) do
					value[i] = value[i] .. ' ' .. ext
				end
			end
			if #value == 1 then
				value = value[1]
			else
				pl = ' class="plainlist"'
				value = '\n* ' .. table.concat(value, '\n* ') .. '\n'
				value = mw.getCurrentFrame():extensionTag('templatestyles', '', {src = 'Plainlist/style.css'}) .. value
			end
		else
			if ext then
				value = value .. ' ' .. ext
			end
		end
		table.insert(rows, ('<tr style="vertical-align:top;"><td>%s:</td><td%s>%s</td></tr>'):format(name, pl, value))
	end
end

local function data_field(args, rows, params, name, ext, wd_config)
	local param = get_param(args, params)
	if param == '-' then
		-- Wikidata opt-out
		return
	end
	if (not param) and wd_config then
		if type(wd_config) == 'table' then
			wd_config.entityId = wd_config.entityId or args.entityId
			param = wd(wd_config)
		else
			param = wd{ property = wd_config, entityId = args.entityId }
		end
	end
	data_cell(rows, name, param, ext)
end

local function get_images(args, rows)
	local file = args['logó']
	local size = args['logóméret']
	local description = args['logóaláírás']
	if not file then
		file, description = require('Modul:Infobox').image(nil, nil, 'P154', args.entityId)
	end
	if file and file ~= '-' then
		image(rows, file, size, description, description)
	end

	file = args.BILDPFAD_FOTO or args['kép']
	size = args.PIXEL_FOTO or args['képméret']
	description = args.TEXT_FOTO or args['képaláírás']
	if not file then
		file, description = require('Modul:Infobox').image(nil, nil, 'P18', args.entityId)
	end
	if file and file ~= '-' then
		image(rows, file, size, description, description)
	end

	file = args.BILDPFAD_KARTE or args['térkép']
	size = args.PIXEL_KARTE or args['térképméret']
	if not file then
		file = wd{ property = 'P15', first = true, entityId = args.entityId }[1]
	end
	if file and file ~= '-' then
		local name = args['név'] or require('Module:String').simpletitle()
		local az = mw.getContentLanguage():ucfirst(require('Modul:Nyelvtani modul').az(name))
		image(rows, file, size, ('%s %s útvonala'):format(az, name))
	end
end

local function get_electrification(args, rows)
	local list = {}
	local dc = get_param(args, {'STROMG', 'egyenfeszültség'})
	if dc and dc ~= '-' then
		table.insert(list, dc .. ' [[Egyenáram|=]]')
	end
	local ac = get_param(args, {'STROMW', 'váltakozó feszültség'})
	if ac and ac ~= '-' then
		table.insert(list, ac .. ' [[Váltakozó áram|~]]')
	end
	local three = get_param(args, {'STROMD', 'háromfázisú feszültség'})
	if three and three ~= '-' then
		table.insert(list, three .. ' [[Háromfázisú feszültség|∆]]')
	end
	if #list > 0 then
		data_cell(rows, 'Feszültség', list)
	elseif dc ~= '-' and ac ~= '-' and three ~= '-' then
		local entity = mw.wikibase.getEntity(args.entityId)
		if not entity then
			return
		end
		local statements = entity:getBestStatements('P930')
		for _, v in ipairs(statements) do
			if v.mainsnak and v.mainsnak.snaktype == 'value' and electricity_types[v.mainsnak.datavalue.value.id] then
				data_cell(rows, 'Feszültség', {electricity_types[v.mainsnak.datavalue.value.id]})
			end
		end
	end
end

local function get_gradient(args, rows)
	local value = get_param(args, {'NEIGUNG', 'legnagyobb emelkedés'})
	local adhesion = get_param(args, {'NEIGUNGA', 'legnagyobb adhéziós emelkedés'})
	if value == '-' or adhesion == '-' then
		return
	end
	if value and adhesion then
		value = ('<small>Adhéziós</small> %s&nbsp;[[ezrelék|‰]]<br/><small>Fogasléc</small> %s'):format(value, adhesion)
		data_cell(rows, 'Maximális emelkedés', value, '‰')
	elseif value then
		data_cell(rows, 'Maximális emelkedés', value, '[[ezrelék|‰]]')
	else
		local entity = mw.wikibase.getEntity(args.entityId)
		if not entity then
			return
		end
		local statements = entity:getBestStatements('P2595')
		local values = {}
		local lang = mw.getContentLanguage()
		for _, v in ipairs(statements) do
			if v.mainsnak and v.mainsnak.datavalue and v.mainsnak.datavalue.value then
				value = v.mainsnak.datavalue.value
				-- per mille
				if value.unit == 'http://www.wikidata.org/entity/Q181011' then
					value = tonumber(value.amount)
				-- per cent
				elseif value.unit == 'http://www.wikidata.org/entity/Q11229' then
					value = tonumber(value.amount)
					if value then
						value = 10 * value
					end
				elseif value.unit == '1' then
					value = tonumber(value.amount)
					if value then
						value = 1000 * value
					end
				else
					value = nil
				end
				if value then
					table.insert(values, ('%s ‰'):format(lang:formatNum(value)))
				end
			end
		end
		if #values > 0 then
			values[1] = values[1]:gsub('‰', '[[ezrelék|‰]]')
		end
		data_cell(rows, 'Maximális emelkedés', values)
	end
end

function p.main(frame)
	local args = require('Modul:Arguments').getArgs(frame)
	local rows = {}
	local function data(...)
		data_field(args, rows, ...)
	end
	get_images(args, rows)
	data({'NETZKATEGORIE', 'hálózatkategória'}, 'Hálózatkategória')
	data({'STRECKENKLASSE', 'osztály'}, 'Osztály')
	data({'DE-KBS', 'Kurbuchstrecke-vonalszám'}, 'Vonalszám')
	data({'STRECKENNR', 'vonalszám'}, 'Vonal', nil, 'P1671')
	data({'LÄNGE', 'hossz'}, 'Hossz', 'km', {property = 'P2043', unit = 'km'})
	-- if no parameter given, fall back to the width (P2049)
	-- of the item in the track gauge (P1064) statement
	data({'SPURWEITE', 'nyomtávolság'}, '[[Nyomtávolság]]', 'mm',
		{property = 'P2049', unit = 'mm', entityId = wd{property = 'P1064', format = 'raw', entityId = args.entityId}[1] or ''})
	get_electrification(args, rows)
	data({'üzemeltető'}, 'Üzemeltető', nil, {property = 'P137', excludespecial = true, showQualifiers = true})
	get_gradient(args, rows)
	data({'RADIUS', 'legkisebb ívsugár'}, 'Legkisebb ívsugár', 'm')
	data({'ZAHNSTANGE', 'fogassínrendszer'}, 'Fogassínrendszer')
	data({'V-MAX', 'legnagyobb sebesség'}, 'Maximális sebesség', 'km/h', {property = 'P3086', unit = 'km/h'})
	local commons = mw.getCurrentFrame():expandTemplate{
		title = 'Infobox/Commons',
		args = {args.wikicommons, args['név'], [5] = 'width:250px;', [6] = args.entityId}
	}
	if commons and commons ~= '' then
		table.insert(rows, commons)
	end
	return table.concat(rows, '\n')
end

return p