Jump to content

Module:2-ary truth table

From Wikipedia, the free encyclopedia

local p = {}

function p.main(frame)
	local args = require('Module:Arguments').getArgs(frame)

	-- table_headings includes the headings and the class for the heading
	local table_headings = {
		{frame:extensionTag("math",args['A'] or 'A',{}), ''},
		{frame:extensionTag("math",args['B'] or 'B',{}), ''}
	}
	-- truth_table is the transpose of the rendered table
	local truth_table = {
		{false, false, true, true},
		{false, true, false, true}
	}
	-- thick_border marks which columns have a thick left border
	local thick_border = {false, false, true}

	-- pre-process the inputs, saving data in the tables defined above
	local col = 3
	while args[6*(col-2) - 1] do
		thick_border[col + 1] = string.lower(args[6*(col-2)] or '') == 'thick'
		table_headings[col] = {args[6*(col-2) - 1], 'unsortable'}
		truth_table[col] = {}
		for i = 1,4 do
			truth_table[col][i] = (tonumber(args[6*(col-3) + i]) or 0) == 1
		end
		col = col + 1
	end
	local total_cols = col - 1

	-- start building the html table
	root = mw.html.create('table')
		:addClass('wikitable')
		:addClass('sortable')
		:addClass('two-ary-tt')

	-- add headings
	local row = root:tag('tr')
	for col = 1,total_cols do
		local headings = table_headings[col]
		row:tag('th')
			:addClass(headings[2] ~= '' and headings[2] or nil)
			:addClass(thick_border[col] and 'border' or nil)
			:wikitext(headings[1])
	end

	-- add rows
	for i = 1,4 do
		row = root:tag('tr')
		for j = 1,total_cols do
			local val = truth_table[j][i]
			row:tag('td')
				:addClass((j < 3) and 'bold' or nil)
				:addClass(thick_border[j] and 'border' or nil)
				:addClass(val and 't' or 'f')
				:wikitext(val and 'T' or 'F')
		end
	end

	-- get the templatestyles
	local templatestyles = frame:extensionTag{
		name = 'templatestyles', args = { src = 'Template:2-ary truth table/style.css' }
	}
	
	-- return the templatestyles plus the html table
	return templatestyles .. tostring(root)
end

return p