Module:Class
Revision as of 18:06, 20 December 2016 by blackwiki>Nihiltres (Fixed logical error, derp)
| This module is rated as ready for general use. It has reached a mature form and is thought to be bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
Usage
This module will implement Template:Class, Template:Class/icon and Template:Class/colour.
{{#invoke:Class|function_name}}
-- This module implements [[Template:Class]], [[Template:Class/icon]] and
-- [[Template:Class/colour]].
local mArguments, mIcon -- modules to lazily load
local definitions = mw.loadData('Module:Class/importDefinitions')
local p = {}
-- Initialize helper function variables
local getDefinition, getRawArgs, makeInvokeFunction, normalizeValue
--------------------------------------------------------------------------------
-- 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 normalizeValue(val)
if type(val) == 'string' then val = val:match('^%s*(.-)%s*$'):lower() end
if val == '' then val = nil end
return val
end
function ucfirst(str)
return mw.ustring.upper(mw.ustring.sub(str, 1, 1)) .. mw.ustring.sub(str, 2)
end
--------------------------------------------------------------------------------
-- Definition helper functions
--------------------------------------------------------------------------------
function getDefinition(code)
local canonicalCode = normalizeValue(code)
local class = definitions[canonicalCode]
while class and class.alias do
canonicalCode = class.alias
class = definitions[class.alias]
end
if not class then
return nil, nil
end
return class, canonicalCode
end
--------------------------------------------------------------------------------
-- Color functions
--------------------------------------------------------------------------------
function p._colour(code)
local class = getDefinition(code)
return class and class.colour or 'transparent'
--^ no defaulting's in definition yet; "transparent"'s a placeholder
end
function p.colour(frame)
local args = getRawArgs(frame, 'Template:Class/colour')
local colour = p._colour(args[1])
-- We need nowiki tags as template output beginning with "#" triggers
-- bug 14974.
return frame:extensionTag('nowiki', colour)
end
--------------------------------------------------------------------------------
-- Icon functions
--------------------------------------------------------------------------------
function p._icon(args)
local class = getDefinition(args.class or args[1])
local icon = class and class.icon
if icon and icon.file then
local span = mw.html.create('span')
span
:cssText(args.style)
:attr('title', ucfirst(class.labels.full))
:wikitext(string.format(
'[[File:%s|%s|16px%s]]',
icon.file,
ucfirst(class.labels.full),
icon.requiresAttribution and '' or '|link=|alt='
--^ recall that '' is truthy in Lua
))
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 classDef, classCode = getDefinition(args.class or args[1])
local cell = mw.html.create(normalizeValue(args.heading) and 'th' or 'td')
--image=yes forces icon, image=no disables it, otherwise checks default
local icon = (
classDef and classDef.icon and --aren't guaranteed to exist
classDef.icon.default and (args.image ~= 'no') or
args.image == 'yes'
)
icon = icon and p.icon(args) .. ' ' or ''
local text = classDef and classDef.labels.short or '???'
--^ "???" is defaulting placeholder
local categoryRoot = (
(
classCode ~= 'unassessed' and
classDef and classDef.categoryRoot
) or
(
(args.category or args.topic) and 'Unassessed'
) or
'Unassessed-Class'
)
--^ Special case for 'unassessed' class because of inconsistent
-- top-level category name; cat. name ought to be fixed :\
local category = string.format(
'Category:%s',
args.fullcategory or (
string.format(
'%s %s',
categoryRoot,
args.category or
string.format(
'%sarticles',
args.topic and (args.topic .. ' ') or ''
)
)
)
)
text = string.format(
'[[:%s|%s]]',
category,
text
) or text
cell
:addClass('assess')
:addClass('assess-' .. (classCode or ''))
:css('text-align', 'center')
:css('white-space', 'nowrap')
:css('font-weight', args.bold ~= 'no' and 'bold' or nil)
:css('background', p._colour(classCode))
:attr('rowspan', tonumber(args.rowspan))
:wikitext(icon, text)
return tostring(cell)
end
p.class = makeInvokeFunction(p._class, 'Template:Class')
return p