Module:Vertical header/sandbox
Appearance
![]() | This is the module sandbox page for Module:Vertical header (diff). |
![]() | This module uses TemplateStyles: |
Implements {{Vertical header}}
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