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 03:17, 5 February 2015 (split more things out into helper functions). 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, fetchTrimmedArg, fetchNormalizedArg
local trim, validateCode

--------------------------------------------------------------------------------
-- 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

function fetchTrimmedArg(args, key)
	local val = args[key]
	if type(val) == 'string' then
		val = trim(val)
		return val
	else
		return val
	end
end

function fetchNormalizedArg(args, key)
	local val = fetchTrimmedArg(args, key)
	if val ~= '' then
		return val
	end
end

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

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

function validateCode(code)
	if code then
		return trim(code):lower()
	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 = fetchArg(args, 'heading') and 'th' or 'td'
	cell = mw.html.create(cell)
	cell
		:addClass('assess')
		:addClass('assess' .. mw.ustring.lower(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