Module:Aligned table: Difference between revisions

    From Nonbinary Wiki
    (strip trailing whitespace from cells, leading whitespace is needed for list markup, but should be safe to remove trailing space)
    (try new optional noblankrows feature)
    Line 12: Line 12:
    local colstyle = {}
    local colstyle = {}
    local cols = tonumber(args['cols']) or 2
    local cols = tonumber(args['cols']) or 2
    local noblankrows = args['noblankrows'] or ''


    -- create the root table
    -- create the root table
    Line 113: Line 114:
    row:css('vertical-align', 'top')
    row:css('vertical-align', 'top')
    end
    end
    -- loop over the cells in each row
    -- skip blank rows, if feature is enabled
    local showrow = 1
    if isnotempty(noblankrows) then
    showrow = 0
    for i=1,cols do
    if isnotempty(args[cols*(j - 1) + i] or '') then
    showrow = 1
    break
    end
    end
    end
    -- loop over the cells in the row
    if showrow then
    for i=1,cols do
    for i=1,cols do
    local cell
    local cell
    Line 148: Line 161:
    end
    end
    cell:wikitext(mw.ustring.gsub(args[cols*(j - 1) + i] or '','%s*$', ''))
    cell:wikitext(mw.ustring.gsub(args[cols*(j - 1) + i] or '','%s*$', ''))
    end
    end
    end
    end
    end

    Revision as of 12:58, 24 August 2016

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

    -- This module implements {{aligned table}}
    local p = {}
    
    local function isnotempty(s)
    	return s and s:match( '^%s*(.-)%s*$' ) ~= ''
    end
    
    function p.table(frame)
    	local args = (frame.args[3] ~= nil) and frame.args or frame:getParent().args
    	local entries = {}
    	local colclass = {}
    	local colstyle = {}
    	local cols = tonumber(args['cols']) or 2
    	local noblankrows = args['noblankrows'] or ''
    
    	-- create the root table
    	local root = mw.html.create('table')
    
    	-- add table style for fullwidth
    	if isnotempty(args['fullwidth']) then
    		root
    			:css('width', '100%')
    			:css('border-collapse', 'collapse')
    			:css('border-spacing', '0px 0px')
    			:css('border', 'none')
    	end
    
    	-- add table classes
    	if isnotempty(args['class']) then
    		root:addClass(args['class'])
    	end
    
    	-- add table style
    	if isnotempty(args['style']) then
    		root:cssText(args['style'])
    	end
    
    	-- build arrays with the column styles and classes
    	if isnotempty(args['leftright']) then
    		colstyle[1] = 'text-align:left;'
    		colstyle[2] = 'text-align:right;'
    	end
    	for i = 1,cols do
    		colclass[ i ] = colclass[ i ] or ''
    		colstyle[ i ] = colstyle[ i ] or ''
    		if isnotempty(args['colstyle']) then
    			colstyle[ i ] = args['colstyle'] .. ';' .. colstyle[ i ]
    		end
    		if isnotempty(args['colalign' .. tostring(i)]) then
    			colstyle[ i ] = 'text-align:' .. args['colalign' .. tostring(i)] .. ';' .. colstyle[ i ]
    		elseif isnotempty(args['col' .. tostring(i) .. 'align']) then
    			colstyle[ i ] = 'text-align:' .. args['col' .. tostring(i) .. 'align'] .. ';' .. colstyle[ i ]
    		elseif isnotempty(args['align' .. tostring(i)]) then
    			colstyle[ i ] = 'text-align:' .. args['align' .. tostring(i)] .. ';' .. colstyle[ i ]
    		end
    		if isnotempty(args['colnowrap' .. tostring(i)]) then
    			colstyle[ i ] = 'white-space:nowrap;' .. colstyle[ i ]
    		elseif isnotempty(args['col' .. tostring(i) .. 'nowrap']) then
    			colstyle[ i ] = 'white-space:nowrap;' .. colstyle[ i ]
    		elseif isnotempty(args['nowrap' .. tostring(i)]) then
    			colstyle[ i ] = 'white-space:nowrap;' .. colstyle[ i ]
    		end
    		if isnotempty(args['colwidth' .. tostring(i)]) then
    			colstyle[ i ] = 'width:' .. args['colwidth' .. tostring(i)] .. ';' .. colstyle[ i ]
    		elseif isnotempty(args['col' .. tostring(i) .. 'width']) then
    			colstyle[ i ] = 'width:' .. args['col' .. tostring(i) .. 'width'] .. ';' .. colstyle[ i ]
    		elseif isnotempty(args['colwidth']) then
    			colstyle[ i ] = 'width:' .. args['colwidth'] .. ';' .. colstyle[ i ]
    		end
    		if isnotempty(args['colstyle' .. tostring(i)]) then
    			colstyle[ i ] = colstyle[ i ] .. args['colstyle' .. tostring(i)]
    		elseif isnotempty(args['col' .. tostring(i) .. 'style']) then
    			colstyle[ i ] = colstyle[ i ] .. args['col' .. tostring(i) .. 'style']
    		elseif isnotempty(args['style' .. tostring(i)]) then
    			colstyle[ i ] = colstyle[ i ] .. args['style' .. tostring(i)]
    		end
    		if isnotempty(args['colclass' .. tostring(i)]) then
    			colclass[ i ] =  args['colclass' .. tostring(i)]
    		elseif isnotempty(args['col' .. tostring(i) .. 'class']) then
    			colclass[ i ] =  args['col' .. tostring(i) .. 'class']
    		elseif isnotempty(args['class' .. tostring(i)]) then
    			colclass[ i ] =  args['class' .. tostring(i)]
    		end
    	end
    	-- compute the maximum cell index
    	local cellcount = 0
    	for k, v in pairs( args ) do
    		if type( k ) == 'number' then
    			cellcount = math.max(cellcount, k)
    		end
    	end
    	-- compute the number of rows
    	local rows = math.ceil(cellcount / cols)
    
    	-- build the table content
    	if isnotempty(args['title']) then
    		local caption = root:tag('caption')
    		caption:cssText(args['titlestyle'])
    		caption:wikitext(args['title'])
    	end
    	if isnotempty(args['above']) then
    		local row = root:tag('tr')
    		local cell = row:tag('th')
    		cell:attr('colspan', cols)
    		cell:cssText(args['abovestyle'])
    		cell:wikitext(args['above'])
    	end
    	for j=1,rows do
    		-- start a new row
    		local row = root:tag('tr')
    		if isnotempty(args['rowstyle']) then
    			row:cssText(args['rowstyle'])
    		else
    			row:css('vertical-align', 'top')
    		end
    		-- skip blank rows, if feature is enabled
    		local showrow = 1
    		if isnotempty(noblankrows) then
    			showrow = 0
    			for i=1,cols do
    				if isnotempty(args[cols*(j - 1) + i] or '') then
    					showrow = 1
    					break
    				end
    			end
    		end
    		-- loop over the cells in the row
    		if showrow then
    		for i=1,cols do
    			local cell
    			if isnotempty(args['row' .. tostring(j) .. 'header']) then
    				cell = row:tag('th'):attr('scope','col')
    			elseif isnotempty(args['col' .. tostring(i) .. 'header']) then
    				cell = row:tag('th'):attr('scope','row')
    			else
    				cell = row:tag('td')
    			end
    			if args['class' .. tostring(j) .. '.' .. tostring(i)] then
    				cell:addClass(args['class' .. tostring(j) .. '.' .. tostring(i)])
    			else
    				if args['rowclass' .. tostring(j)] then
    					cell:addClass(args['rowclass' .. tostring(j)])
    				elseif args['row' .. tostring(j) .. 'class'] then
    					cell:addClass(args['row' .. tostring(j) .. 'class'])
    				end
    				if colclass[i] ~= '' then
    					cell:addClass(colclass[i])
    				end
    			end
    			if args['style' .. tostring(j) .. '.' .. tostring(i)] then
    				cell:cssText(args['style' .. tostring(j) .. '.' .. tostring(i)])
    			else
    				if args['rowstyle' .. tostring(j)] then
    					cell:cssText(args['rowstyle' .. tostring(j)])
    				elseif args['row' .. tostring(j) .. 'style'] then
    					cell:cssText(args['row' .. tostring(j) .. 'style'])
    				end
    				if isnotempty(colstyle[i]) then
    					cell:cssText(colstyle[i])
    				end
    			end
    			cell:wikitext(mw.ustring.gsub(args[cols*(j - 1) + i] or '','%s*$', ''))
    		end
    		end
    	end
    	-- return the root table
    	return tostring(root)
    end
    
    return p