Több kép[mi ez?] • [dokumentáció: mutat, szerkeszt] • [tesztek: létrehozás]

local p = {}

local function getArgs(frame)
	local images = {}
	function processNumbered(typ, i, v)
		i = tonumber(i)
		if not typ or not i then
			return
		end
		if type(images[i]) == 'table' then
			images[i][typ] = v
		else
			images[i] = { [typ] = v }
		end
	end
	local arguments = require('Modul:Arguments').getArgs(frame)
	local args = {
		config	= {
			align		= arguments['igazítás'],
			vertical	= (arguments['irány'] and arguments['irány'] ~= 'vízszintes'),
			width		= tonumber(arguments['szélesség']),
		},
		header	= nil,
		footer	= nil,
		images	= {}
	}
	if arguments['fejléc'] then
		args.header = {
			text		= arguments['fejléc'],
			align		= arguments['fejléc_igazítás'] or 'center',
			background	= arguments['fejléc_háttér']
		}
	end
	if arguments['lábléc'] then
		args.footer = {
			text		= arguments['lábléc'],
			align		= arguments['lábléc_igazítás'] or 'left',
			background	= arguments['lábléc_háttér']
		}
	end
	
	for n, v in pairs(arguments) do
		local i
		i = string.match(n, '^kép(%d+)$')
		if i then
			processNumbered('file', i, v)
		end
		i = string.match(n, '^szélesség(%d+)$')
		if i then
			processNumbered('width', i, v)
		end
		i = string.match(n, '^szöveg(%d+)$')
		if i then
			processNumbered('caption', i, v)
		end
	end
	for _, v in ipairs(images) do
		if args.config.width then
			v.width = args.config.width
		end
		if v.file and v.width then
			table.insert(args.images, v)
		end
	end
	return args
end

local function fixArgs(args)
	if type(args) ~= 'table' then
		args = {}
	end
	if type(args.config) ~= 'table' then
		args.config = {}
	end
	if type(args.images) ~= 'table' then
		args.images = {}
	end
	if args.header and not args.header.text then
		args.header = nil
	end
	if args.header and not args.header.align then
		args.header.align = 'center'
	end
	if args.footer and not args.footer.text then
		args.footer = nil
	end
	if args.footer and not args.footer.align then
		args.footer.align = 'left'
	end
	local images = args.images
	args.images = {}
	for _, v in ipairs(images) do
		if not v.width then
			v.width = args.config.width
		end
		if v.file and v.width then
			table.insert(args.images, v)
		end
	end
	return args
end

function createBox(content, args)
	local outerClasses = {
		left	= 'tleft',
		center	= 'tnone',
		centre	= 'tnone',
		right	= 'tright'
	}
	local box_width = 0
	if args.config.vertical then
		if args.config.width then
			box_width = args.config.width + 12
		else
			box_width = args.images[1].width + 12
		end
	else
		if args.config.width then
			box_width = ((args.config.width + 4) * #args.images) + 8
		else
			box_width = (#args.images + 2) * 4
			for _, v in ipairs(args.images) do
				box_width = box_width + v.width
			end
		end
	end
	local outer = mw.html.create('div')
	outer
		:addClass('thumb')
		:addClass(outerClasses[args.config.align] or outerClasses.right)
		:css('width', box_width .. 'px')
	if args.config.align == 'center' or args.config.align == 'centre' then
		outer:css('margin', '0 auto')
	end
	local inner = mw.html.create('div')
	inner:addClass('thumbinner')
	for _, v in ipairs(content) do
		inner:node(v)
	end
	outer:node(inner)
	return outer:done()
end

function image(data, config)
	local outer = mw.html.create('div')
	if not config.vertical then
		outer:css('float', 'left')
	end
	outer:css{
		margin	= '1px',
		width	= (data.width + 2) .. 'px'
	}
	local image = mw.html.create('div')
	image
		:addClass('thumbimage')
		:wikitext(string.format('[[Fájl:%s|%dpx|%s]]', data.file, data.width, data.caption or ''))
	outer:node(image)
	local caption
	if data.caption then
		caption = mw.html.create('div')
		caption
			:addClass('thumbcaption')
			:css('clear', 'left')
			:wikitext(data.caption)
		outer:node(caption)
	end
	return outer
end

local function main(args, wikitext)
	if #args.images < 2 then
		if wikitext then
			return '<strong class="error">{{[[Sablon:Több kép|Több kép]]}}: nincs elég kép</strong>'
		else
			return error('{{[[Sablon:Több kép|Több kép]]}}: nincs elég kép')
		end
	end
	local content = {}
	if args.header then
		local header = mw.html.create('div')
		header
			:css{
				clear			= 'both',
				['font-weight']	= 'bold',
				['text-align']	= args.header.align,
				background		= args.header.background
			}
			:wikitext(args.header.text)
		table.insert(content, header)
	end
	for _, v in ipairs(args.images) do
		table.insert(content, image(v, args.config))
	end
	if args.footer then
		local footer = mw.html.create('div')
		footer
			:addClass('thumbcaption')
			:css{
				clear			= 'left',
				['text-align']	= args.footer.align,
				background		= args.footer.background
			}
			:wikitext(args.footer.text)
		table.insert(content, footer)
	end
	return createBox(content, args)
end

function p._main(args, wikitext)
	args = fixArgs(args)
	return main(args, wikitext)
end

function p.main(frame)
	local args = getArgs(frame)
	return main(args, true)
end

return p