Jump to content

Module:Class

Permanently protected module
From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Mr. Stradivarius (talk | contribs) at 04:32, 5 February 2015 (argument function tweaks, plus make an HTML helper function). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

-- This module implements [[Template:Class]], [[Template:Class/icon]] and
-- [[Template:Class/colour]].

local mArguments, mIcon -- modules to lazily load
local data = mw.loadData('Module:Class/data')

local p = {}

-- Initialize helper function variables
local getRawArgs, makeInvokeFunction, trimString, trimValue, normalizeValue
local validateCode, makeCssText

--------------------------------------------------------------------------------
-- Argument helper functions
--------------------------------------------------------------------------------

function getRawArgs(frame, wrapper)
	mArguments = mArguments or require('Module:Arguments')
	return mArguments.getArgs(frame, {
		wrappers = wrapper,
		trim = false,
		removeBlanks = false
	})
end

function makeInvokeFunction(func, wrapper)
	return function (frame)
		local args = getRawArgs(frame, wrapper)
		return func(args)
	end
end

--------------------------------------------------------------------------------
-- String helper functions
--------------------------------------------------------------------------------

function trimString(s)
	return s:match('^%s*(.-)%s*$')
end

function trimValue(val)
	if type(val) == 'string' then
		return trimString(val)
	else
		return val
	end
end

function normalizeValue(val)
	val = trimValue(val)
	if val ~= '' then
		return val
	end
end

function validateCode(code)
	if code then
		return trim(code):lower()
	else
		return ''
	end
end

--------------------------------------------------------------------------------
-- HTML helper functions
--------------------------------------------------------------------------------

-- These are necessary because the original [[Template:Class]] uses something
-- like <span {{{attr|}}}>, meaning that we can't use mw.html. D'oh!

function makeCssText(t)
	local ret = {}
	for key, prop in pairs(t) do
		table.insert(ret, key .. ':' .. prop)
	end
	if #ret > 0 then
		return string.format(' style="%s"', table.concat(ret, ';'))
	else
		return ''
	end
end

--------------------------------------------------------------------------------
-- Color functions
--------------------------------------------------------------------------------

function p._color(code)
	code = validateCode(code)
	return data.colors[code] or data.colors._DEFAULT
end

function p.color(frame)
	local args = getRawArgs(frame, 'Template:Class/colour')
	local color = p._color(args[1])
	-- We need nowiki tags as template output beginning with "#" triggers
	-- bug 14974.
	return frame:extensionTag('nowiki', color)
end

--------------------------------------------------------------------------------
-- Icon functions
--------------------------------------------------------------------------------

function p._icon(args)
	local code = validateCode(args.class or args[1])
	local iconData = data.icons[code]
	if iconData then
		local span = mw.html.create('span')
		span
			:cssText(args.style)
			:attr('title', iconData.title)
			:wikitext(string.format(
				'[[File:%s|%s|16px%s]]',
				iconData.image,
				iconData.tooltip,
				iconData.suppressLink and '|link=|alt=' or ''
			))
		return tostring(span)
	else
		mIcon = require('Module:Icon')
		return mIcon._main{args[1]}
	end
end

p.icon = makeInvokeFunction(p._icon, 'Template:Class/icon')

--------------------------------------------------------------------------------
-- Class functions
--------------------------------------------------------------------------------

function p._class(args)
	local cell = normalizeValue(args.heading) and 'th' or 'td'
	cell = mw.html.create(cell)
	cell
		:addClass('assess')
		:addClass('assess-' .. mw.ustring.lower(trimValue(args[1]) or ''))
		:addClass(fetchArg(args, 'class'))
		:css('text-align', 'center')
		:css('white-space', 'nowrap')
		:css('font-weight', args.bold ~= 'no' and 'bold' or nil)
		:css('background', p._color())
end

p.class = makeInvokeFunction(p._class, 'Template:Class')

return p