Latest revision |
Your text |
Line 1: |
Line 1: |
| -- This module implements {{aligned table}} | | -- This module implements {{aligned table}} |
| + | |
| local p = {} | | local p = {} |
− |
| |
− | local function isnotempty(s)
| |
− | return s and s:match( '^%s*(.-)%s*$' ) ~= ''
| |
− | end
| |
| | | |
| function p.table(frame) | | function p.table(frame) |
Line 12: |
Line 9: |
| local colstyle = {} | | local colstyle = {} |
| local cols = tonumber(args['cols']) or 2 | | local cols = tonumber(args['cols']) or 2 |
− | | + | local class = args['class'] or '' |
− | -- create the root table
| + | local style = args['style'] or '' |
− | local root = mw.html.create('table') | + | local leftright = args['leftright'] or '' |
− | | + | local fullwidth = args['fullwidth'] or '' |
− | -- add table style for fullwidth | + | |
− | if isnotempty(args['fullwidth']) then
| + | if leftright ~= '' then |
− | root
| + | colstyle[1] = 'text-align:left;' |
− | :css('width', '100%')
| + | colstyle[2] = 'text-align:right;' |
− | :css('border-collapse', 'collapse')
| + | end |
− | :css('border-spacing', '0px 0px')
| + | if fullwidth ~= '' then |
− | :css('border', 'none')
| + | style = 'width:100%; border-collapse: collapse; border-spacing: 0px; border:none;' .. style |
− | end
| |
− | | |
− | -- add table classes
| |
− | if isnotempty(args['class']) then | |
− | root:addClass(args['class']) | |
| end | | end |
− | | + | if class ~= '' then |
− | -- add table style
| + | class = ' class="' .. class .. '"' |
− | if isnotempty(args['style']) then | |
− | root:cssText(args['style']) | |
| end | | end |
− | | + | if style ~= '' then |
− | -- build arrays with the column styles and classes
| + | style = ' style="' .. style .. '"' |
− | if isnotempty(args['leftright']) then | |
− | colstyle[1] = 'text-align:left;' | |
− | colstyle[2] = 'text-align:right;'
| |
| end | | end |
| + | |
| for i = 1,cols do | | for i = 1,cols do |
| colclass[ i ] = colclass[ i ] or '' | | colclass[ i ] = colclass[ i ] or '' |
| colstyle[ i ] = colstyle[ i ] or '' | | colstyle[ i ] = colstyle[ i ] or '' |
− | if isnotempty(args['colstyle']) then | + | if args['align' .. tostring(i)] 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 ] | | colstyle[ i ] = 'text-align:' .. args['align' .. tostring(i)] .. ';' .. colstyle[ i ] |
| end | | end |
− | if isnotempty(args['colnowrap' .. tostring(i)]) then | + | if args['nowrap' .. tostring(i)] and args['nowrap' .. 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 ] | | colstyle[ i ] = 'white-space:nowrap;' .. colstyle[ i ] |
| end | | end |
− | if isnotempty(args['colwidth' .. tostring(i)]) then | + | if args['style' .. 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)] | | colstyle[ i ] = colstyle[ i ] .. args['style' .. tostring(i)] |
| end | | end |
− | if isnotempty(args['colclass' .. tostring(i)]) then | + | if args['class' .. 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)] | | colclass[ i ] = args['class' .. tostring(i)] |
| end | | end |
| end | | end |
− | -- compute the maximum cell index | + | |
− | local cellcount = 0
| |
| for k, v in pairs( args ) do | | for k, v in pairs( args ) do |
| if type( k ) == 'number' then | | if type( k ) == 'number' then |
− | cellcount = math.max(cellcount, k) | + | i = math.fmod(k-1,cols) + 1 |
− | end
| + | local j = (k - i) / cols + 1 |
− | end
| + | if args['class' .. tostring(j) .. '.' .. tostring(i)] then |
− | -- compute the number of rows
| + | entries[ k ] = '<td class="' .. args['class' .. tostring(j) .. '.' .. tostring(i)] .. '" style="' .. colstyle[i] .. '">' .. v .. '</td>' |
− | 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
| |
− | -- loop over the cells in the row
| |
− | 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 | | else |
− | cell = row:tag('td') | + | entries[ k ] = '<td class="' .. colclass[i] .. '" style="' .. colstyle[i] .. '">' .. v .. '</td>' |
| end | | end |
− | if args['class' .. tostring(j) .. '.' .. tostring(i)] then | + | if i == 1 then |
− | cell:addClass(args['class' .. tostring(j) .. '.' .. tostring(i)])
| + | entries[ k ] = '<tr style="vertical-align:top">' .. entries[ k ] |
− | 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'])
| |
− | elseif args['rowevenclass'] and math.fmod(j,2) == 0 then
| |
− | cell:addClass(args['rowevenclass'])
| |
− | elseif args['rowoddclass'] and math.fmod(j,2) == 1 then | |
− | cell:addClass(args['rowoddclass'])
| |
− | end
| |
− | if colclass[i] ~= '' then
| |
− | cell:addClass(colclass[i])
| |
− | end
| |
| end | | end |
− | if args['style' .. tostring(j) .. '.' .. tostring(i)] then | + | if i == cols then |
− | cell:cssText(args['style' .. tostring(j) .. '.' .. tostring(i)]) | + | entries[ k ] = entries[k] .. '</tr>' |
− | 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 | | end |
− | cell:wikitext(mw.ustring.gsub(args[cols*(j - 1) + i] or '', '^(.-)%s*$', '%1') or '')
| + | end |
− | end
| + | end |
− | end
| + | return '<table' .. class .. style ..'>\n' .. table.concat( entries, '\n' ) .. '\n</table>' |
− | -- return the root table
| + | |
− | return tostring(root)
| + | end |
− | end | |
| | | |
| return p | | return p |