Dokumentaci tohoto modulu lze vytvořit na stránce Nápověda:Modul:Sloveso (cs)

local p = {}

-- Inserts arguments evaluating to true to the end of sequence
local function insertValid(sequence, ...)
	local args = {...}
	local count = select('#', ...)
	for i = 1, count do
		table.insert(sequence, args[i] or nil)
	end
	return sequence
end

local function concatValid(separator, ...)
	local result = {}
	insertValid(result, ...)
	return table.concat(result, separator)
end

local function count(...)
	local result = 0
	for key, value in pairs({...}) do
		if value then
			result = result + 1
		end
	end
	return result
end

local function countAndFormat(format, ...)
	local cnt = count(...)
	return cnt > 0 and string.format(format, cnt) or nil
end

function p.casovani(frame)
	local args = frame:getParent().args
	local styling = 'class="konjugace verbum floatleft" style="clear: none;"'
	
	local function getArg(name)
		return args[name] or '{{{' .. name .. '}}}'
	end
	
	local dok = args.dok == "ano"
	local pre = args.pre ~= "skrýt"
	local fut = (args.fut or "") ~= ""
	local imp = args.imp ~= "skrýt"
	local act = args.act ~= "skrýt"
	local pas = args.pas ~= "skrýt"
	local ptra = args.ptra ~= "skrýt"
	local mtra = args.mtra ~= "skrýt"
	
	local result = {}
	local ncols
	
	-- Údržbové kategorie
	insertValid(result,
		not pre and '[[Kategorie:Monitoring:Sloveso (cs)/pre/skrýt]]',
		not imp and '[[Kategorie:Monitoring:Sloveso (cs)/imp/skrýt]]',
		not act and '[[Kategorie:Monitoring:Sloveso (cs)/act/skrýt]]',
		not pas and '[[Kategorie:Monitoring:Sloveso (cs)/pas/skrýt]]',
		not ptra and '[[Kategorie:Monitoring:Sloveso (cs)/ptra/skrýt]]',
		not mtra and '[[Kategorie:Monitoring:Sloveso (cs)/mtra/skrýt]]')

	-- Oznamovací a rozkazovací způsob	
	ncols = count(pre, fut, imp)
	if ncols > 0 then
		local function radek(osoba, parPre, parFut, parImp)
			return concatValid('\n',
				'!' .. osoba .. '.',
				pre and '|' .. parPre,
				fut and '|' .. parFut,
				imp and '|' .. (parImp or 'style="text-align:center"|—'),
				'|-')
		end
		
		insertValid(result,
			'{| ' .. styling,
			'|+ Oznamovací a rozkazovací způsob',
			'|-',
			'!rowspan="3"|Číslo',
			'!rowspan="3"|Osoba',
			'!colspan="' .. ncols .. '"|Způsob a čas',
			'|-',
			countAndFormat('!colspan="%s" style="vertical-align: top;"|oznamovací', pre, fut),
			imp and '!rowspan="2" style="vertical-align: top;"|rozkazovací',
			'|-',
			pre and (dok and '!budoucí' or '!přítomný'),
			fut and '!budoucí',
			'|-',
			'!rowspan="3"|jednotné',
			radek(1, getArg("spre1"), getArg("sfut1")),
			radek(2, getArg("spre2"), getArg("sfut2"), getArg("simp2")),
			radek(3, getArg("spre3"), getArg("sfut3")),
			'!rowspan="3"|množné',
			radek(1, getArg("ppre1"), getArg("pfut1"), getArg("pimp1")),
			radek(2, getArg("ppre2"), getArg("pfut2"), getArg("pimp2")),
			radek(3, getArg("ppre3"), getArg("pfut3")),
			'|}')
	end
	
	-- Příčestí a přechodníky
	ncols = count(act, pas, ptra, mtra)
	if ncols > 0 then
		insertValid(result,
			'{| ' .. styling,
			'|+ Příčestí a přechodníky',
			'|-',
			'!rowspan="2"|Číslo',
			'!rowspan="2" colspan="2"|Rod',
			countAndFormat('!colspan="%s"|Příčestí\n', act, pas),
			countAndFormat('!colspan="%s"|Přechodník\n', ptra, mtra),
			'|-',
			act and '!činné',
			pas and '!trpné',
			ptra and (dok and '!budoucí' or '!přítomný'),
			mtra and '!minulý',
			'|-',
			'!rowspan="3"|jednotné',
			'!colspan="2"|mužský',
			act and '|' .. getArg("sactm"),
			pas and '|' .. getArg("spasm"),
			ptra and '|' .. getArg("ptram"),
			mtra and '|' .. getArg("mtram"),
			'|-',
			'!colspan="2"|ženský',
			act and '|' .. getArg("sactf"),
			pas and '|' .. getArg("spasf"),
			ptra and '|rowspan="2"|' .. getArg("ptraf"),
			mtra and '|rowspan="2"|' .. getArg("mtraf"),
			'|-',
			'!colspan="2"|střední',
			act and '|' .. getArg("sactn"),
			pas and '|' .. getArg("spasn"),
			'|-',
			'!rowspan="4"|množné',
			'!colspan="2"|m. životný',
			act and '|' .. getArg("pactm"),
			pas and '|' .. getArg("ppasm"),
			ptra and '|rowspan="4"|' .. getArg("ptrap"),
			mtra and '|rowspan="4"|' .. getArg("mtrap"),
			'|-',
			'!colspan="2"|m. neživ.',
			act and '|rowspan="2"|' .. getArg("pactf"),
			pas and '|rowspan="2"|' .. getArg("ppasf"),
			'|-',
			'!colspan="2"|ženský',
			'|-',
			'!colspan="2"|střední',
			act and '|' .. getArg("sactf"),
			pas and '|' .. getArg("spasf"),
			'|}')
	end
	
	insertValid(result, '<div style="clear:both"></div>')
	return table.concat(result, '\n')
end

return p