Jump to content

Module:Vertical header/sandbox: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
rewrite this to use template styles
refactor the attribute-getting code and the result-formatting code into separate functions
Line 1: Line 1:
local p = {}
local p = {}

local function escapeQuotes(text)
if not text then
return nil
end
return text:gsub("\"", """)
end


local function getRowCount(text)
local function getRowCount(text)
Line 6: Line 13:
end
end


local function formatAttribute(options)
local function getAttributeData(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("\"", """)
local extraDivStyles = args.style and args.style:gsub("\"", """)

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


if sortPadding then
if options.sortPadding then
table.insert(thClasses, "vertical-header-sortable")
table.insert(thClasses, "vertical-header-sortable")
else
else
Line 37: Line 25:
end
end
if vertAlign == "top" then
if options.vertAlign == "top" then
table.insert(thClasses, "vertical-header-align-top")
table.insert(thClasses, "vertical-header-align-top")
elseif vertAlign == "middle" then
elseif options.vertAlign == "middle" then
table.insert(thClasses, "vertical-header-align-middle")
table.insert(thClasses, "vertical-header-align-middle")
end
end


if manualWidth then
if options.manualWidth then
table.insert(thStyles, "width:" .. manualWidth)
table.insert(thStyles, "width:" .. options.manualWidth)
else
else
local rowCount = getRowCount(text)
local rowCount = getRowCount(options.text)
-- The styles for 1 row are in the default vertical-header class. For
-- 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.
-- 2, 3, or 4 rows, we add special classes to get the correct width.
Line 57: Line 45:
end
end
if noBold then
if options.noBold then
table.insert(divClasses, "vertical-header-nobold")
table.insert(divClasses, "vertical-header-nobold")
end
end
table.insert(thStyles, extraThStyles)
table.insert(thStyles, options.extraThStyles)
table.insert(divStyles, options.extraDivStyles)


return thClasses, thStyles, divClasses, divStyles
result = 'class="%"'
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

local function formatOutput(text, thClasses, thStyles, divClasses, divStyles)
thAttributes = {}
table.insert(thAttributes, formatAttribute{attrName = "class", attrs = thClasses, separator = " "})
table.insert(thAttributes, formatAttribute{attrName = "style", attrs = thStyles})
local div = mw.html.create("div")
local div = mw.html.create("div")
Line 69: Line 76:
div:addClass(class)
div:addClass(class)
end
end
div:cssText(extraDivStyles)
for _, cssText in ipairs(divStyles) do
div:cssText(cssText)
end
div:wikitext(text)
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))
return string.format("%s | %s", table.concat(thAttributes, " "), tostring(div))
end

function p._cell(args)
local text = args[1]
local thClasses, thStyles, divClasses, divStyles = getAttributeData{
text = text,
sortPadding = args.stp,
vertAlign = args.va,
manualWidth = args.mw,
noBold = args.nb,
extraThStyles = escapeQuotes(args.cellstyle),
extraDivStyles = escapeQuotes(args.style)
}
return formatOutput(text, thClasses, thStyles, divClasses, divStyles)
end
end



Revision as of 07:27, 2 August 2020

local p = {}

local function escapeQuotes(text)
	if not text then
		return nil
	end
	return text:gsub("\"", """)
end

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

local function getAttributeData(options)
	local thClasses = {"vertical-header", "nowrap"}
	local thStyles = {}
	local divClasses = {}
	local divStyles = {}

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

	if options.manualWidth then
		table.insert(thStyles, "width:" .. options.manualWidth)
	else
		local rowCount = getRowCount(options.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 options.noBold then
		table.insert(divClasses, "vertical-header-nobold")
	end
	
	table.insert(thStyles, options.extraThStyles)
	table.insert(divStyles, options.extraDivStyles)

	return thClasses, thStyles, divClasses, divStyles
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

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

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

function p._cell(args)
	local text = args[1]
	local thClasses, thStyles, divClasses, divStyles = getAttributeData{
		text = text,
		sortPadding = args.stp,
		vertAlign = args.va,
		manualWidth = args.mw,
		noBold = args.nb,
		extraThStyles = escapeQuotes(args.cellstyle),
		extraDivStyles = escapeQuotes(args.style)
	}
	return formatOutput(text, thClasses, thStyles, divClasses, divStyles)
end

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

return p