模組:Class
外观
-- 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