Implements Template:RunningHeader
--[=[
Implements [[Template:RunningHeader]]
]=]
require('strict')
local getArgs = require('Module:Arguments').getArgs
local p = {}
function p._running_header(args)
-- holds tracking categories
local tracking_cats = {}
-- aliases for first 3 parameters
if args.left or args.center or args.centre or args.right then
-- this is fine but it's worth keeping track of
table.insert(tracking_cats, '[[Category:' .. 'Running headers using explicit parameter names' .. ']]')
-- check for duplicates (which are a problem)
if (args[1] and args.left) or (args[2] and args.center) or (args[2] and args.centre) or (args.center and args.centre) or (args[3] and args.right) then
table.insert(tracking_cats, '[[Category:' .. 'Pages using duplicate arguments in template calls' .. ']]')
end
-- use aliases
args[1] = args[1] or args.left
args[2] = args[2] or args.center or args.centre
args[3] = args[3] or args.right
end
-- get number of cells (largest-numbered parameter)
-- can't use #args because that doesn't work consistently on tables that aren't sequences
-- table.maxn also seems not to work
local cell_count = 0
for k, v in pairs(args) do
local i = tonumber(k)
if i and i > cell_count then
cell_count = i
end
end
-- track headers which don't set the contents of every cell
local undefined_entries = false
-- track how many cells have content
local content_entries = 0
for i = 1, cell_count do
if not args[i] then
undefined_entries = true
elseif args[i] and args[i] ~= '' then
content_entries = content_entries + 1
end
end
if undefined_entries then
-- track headers with undefined entries (fine but worth keeping track of)
table.insert(tracking_cats, '[[Category:' .. 'Running headers with undefined entries' .. ']]')
end
if content_entries == 1 then
-- track headers with only one non-blank entry
table.insert(tracking_cats, '[[Category:' .. 'Running headers with only one content entry' .. ']]')
end
if cell_count == 0 or content_entries == 0 then
-- track headers with no entries (pointless)
table.insert(tracking_cats, '[[Category:' .. 'Empty running headers' .. ']]')
elseif cell_count == 1 then
-- track 1-cell headers (fine but worth keeping track of)
table.insert(tracking_cats, '[[Category:' .. 'Running headers with one entry' .. ']]')
elseif cell_count == 2 then
-- track 2-cell headers (fine but worth keeping track of)
table.insert(tracking_cats, '[[Category:' .. 'Running headers with two entries' .. ']]')
elseif cell_count > 4 then
-- track headers with more than 4 cells (fine but worth keeping track of)
table.insert(tracking_cats, '[[Category:' .. 'Running headers with more than four entries' .. ']]')
end
-- TEMPORARY FOR MIGRATION: enforce 3-cell minimum
cell_count = math.max(cell_count, 3)
-- assemble cells
local cells = {}
-- classes
local base_class = 'wst-rh'
local cell_class = base_class .. '-cell'
local extra_cell_classes = {
[3] = {'wst-rh-left', 'wst-rh-center', 'wst-rh-right'}
}
extra_cell_classes = extra_cell_classes[cell_count] or {}
for i = 1, cell_count do
cells[i] = mw.html.create('div')
:addClass(cell_class)
:wikitext(args[i] or '')
if extra_cell_classes[i] then
cells[i]:addClass(extra_cell_classes[i])
end
cells[i] = tostring(cells[i])
end
-- assemble header
local header_class = table.concat({
base_class,
base_class .. '-' .. cell_count,
args.class or (base_class .. '-default')
}, ' ')
local header_div = mw.html.create('div')
:addClass(header_class)
:wikitext(table.concat(cells))
return tostring(header_div) .. table.concat(tracking_cats)
end
function p.running_header(frame)
local args = getArgs(frame, {trim = true, removeBlanks = false})
return p._running_header(args)
end
return p