Moduuli:Ryhmätaulu

Tämän moduulin ohjeistuksen voi tehdä sivulle Moduuli:Ryhmätaulu/ohje

-- This module implements {{Ryhmätaulu}} and {{Ryhmätaulu/ala}}.

local p = {}

local function formatItem( data )
	if data == nil then
		return ''
	end
    if not type( data ) == 'string' then
        return ''
    end
    return mw.ustring.format( '%s', data )
end

local function isempty(s)
  return s == nil or s == ''
end

local function addrow(parent, thstyle, tdstyle, rhead, lcontent, iscol)
	if (isempty(rhead) == true and isempty(lcontent) == true) then
		return
	end
	
	local row = parent:tag('tr')
	if (isempty(rhead) == false) then
		local thead = row:tag('th')

		-- if header is full length (c == 1)
		-- should align text to center but also apply other styles from normal heads
		if (isempty(thstyle) == false) then
			thead:cssText(thstyle)
		end

		-- col-header not in "ala"-table?
		if (iscol == true) then
			thead:attr('colspan', 2)
		end
		thead:wikitext(rhead)

		-- don't add cell if row is full length heading
		if (iscol == false) then
			local tcell = row:tag('td')
			if (isempty(tdstyle) == false) then
				tcell:cssText(tdstyle)
			end
			tcell:wikitext(lcontent)
		end
	end

end

local function buildList( args )

	local rootnode = mw.html.create()
	local listataulu = rootnode:tag('table')
	if args['luokka'] then
		listataulu
			:addClass(args['luokka'])
	end
	local tyylit = args['tyylit'] or ''
	listataulu:cssText('text-align: left;' .. tyylit)
	if args['leveys'] then
		listataulu:attr('width', args['leveys'])
	end
	if args['reunus'] then
		listataulu:attr('border', args['reunus'])
	end
	-- spacing and padding should not be necessary any more
	if args['spacing'] then
		listataulu:attr('cellspacing', args['spacing'] or 0)
	end
	if args['padding'] then
		listataulu:attr('cellpadding', args['padding'] or 0)
	end

	-- otsikko koko luettelolle jos annettu
	if (args['otsikko']) then
		local otsikko = listataulu:tag('tr')
		otsikko
			:tag('caption')
				:wikitext(args['otsikko'])
	end
	
	local thstyle = args['th'] or ''
	local tdstyle = args['td'] or ''

	local rivi = 1
	while (rivi <= 50) do
		local rn = args['r' .. tostring(rivi)] or ''
		local ln = args['l' .. tostring(rivi)] or ''
		local cn = args['c' .. tostring(rivi)] or ''

		-- skip empty rows
		if (isempty(rn) == false or isempty(ln) == false ) then
			local iscol = false
			if (isempty(cn) == false) then
				iscol = true
			end
			addrow(listataulu, thstyle, tdstyle, rn, ln, iscol)
		end

		rivi = rivi +1
	end

	return tostring(rootnode)
end

function p.main( frame )
    local origArgs
    if frame == mw.getCurrentFrame() then
        origArgs = frame:getParent().args
        for k, v in pairs( frame.args ) do
            origArgs = frame.args
            break
        end
    else
        origArgs = frame
    end
    
    local args = {}
    for k, v in pairs( origArgs ) do
        if type( k ) == 'number' or v ~= '' then
            args[ k ] = v
        end
    end
    return buildList( args )
end

-- for "ryhmätaulu/ala" if necessary
function p.ala( frame )
    return p.main( frame )
end

return p