Jump to content

Module:Vertical header/sandbox

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Mr. Stradivarius (talk | contribs) at 07:07, 2 August 2020 (rewrite this to use template styles). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
local p = {}

local function getRowCount(text)
	local _, count = text:gsub("<[bB][rR] */? *>", "%0")
	return count + 1
end

local function formatAttribute(options)
	if #options.attrs == 0 then
		return nil
	end
	local separator = options.separator or ""
	return string.format(
		'%s="%s"',
		options.attrName,
		table.concat(options.attrs, separator)
	)
end

function p._cell(args)
	local text = args[1]
	local sortPadding = args.stp
	local vertAlign = args.va
	local manualWidth = args.mw
	local noBold = args.nb
	local extraThStyles = args.cellstyle and args.cellstyle:gsub("\"", "&quot;")
	local extraDivStyles = args.style and args.style:gsub("\"", "&quot;")

	local thClasses = {"vertical-header", "nowrap"}
	local thStyles = {}
	local divClasses = {}

	if sortPadding then
		table.insert(thClasses, "vertical-header-sortable")
	else
		table.insert(thClasses, "unsortable")
	end
	
	if vertAlign == "top" then
		table.insert(thClasses, "vertical-header-align-top")
	elseif vertAlign == "middle" then
		table.insert(thClasses, "vertical-header-align-middle")
	end

	if manualWidth then
		table.insert(thStyles, "width:" .. manualWidth)
	else
		local rowCount = getRowCount(text)
		-- The styles for 1 row are in the default vertical-header class. For
		-- 2, 3, or 4 rows, we add special classes to get the correct width.
		-- In the rare event that there are more than 4 rows, use inline styles.
		if rowCount >= 2 and rowCount <= 4 then
			table.insert(tableClasses, string.format("vertical-header-%drows", rowCount))
		elseif rowCount > 4 then
			table.insert(tableStyles, string.format("width:%.3fem", rowCount * 0.875))
		end
	end
	
	if noBold then
		table.insert(divClasses, "vertical-header-nobold")
	end
	
	table.insert(thStyles, extraThStyles)

	result = 'class="%"'
	
	local div = mw.html.create("div")
	for _, class in ipairs(divClasses) do
		div:addClass(class)
	end
	div:cssText(extraDivStyles)
	div:wikitext(text)
	
	thAttributes = {}
	table.insert(thAttributes, formatAttribute{attrName = "class", attrs = thClasses, separator = " "})
	table.insert(thAttributes, formatAttribute{attrName = "style", attrs = thStyles})

	return string.format("%s | %s", table.concat(thAttributes, " "), tostring(div))
end

function p.cell(frame)
	local args = require("Module:Arguments").getArgs(frame, {
		wrapper="Template:Vertical header"
	})
	return p._cell(args)
end

return p