Module:Designation
Appearance
| This module is rated as beta. It is considered ready for widespread use, but as it is still relatively new, it should be applied with some caution to ensure results are as expected. |
| This module is currently protected from editing. See the protection policy and protection log for more details. Please discuss any changes on the talk page; you may submit an edit request to ask an administrator to make an edit if it is uncontroversial or supported by consensus. You may also request that this page be unprotected. |
This module has been developed to implement Template:Designation and all its sub-templates. Data is held in two subpages in JSON format:
- Module:Designation/list - list of designations with text/link, abbreviation and colours
- Module:Designation/lookup - list of recognised aliases for each designation
Usage
{{#invoke:Designation|text}}implements Template:Designation/text{{#invoke:Designation|color}}implements Template:Designation/colour{{#invoke:Designation|color2}}implements Template:Designation/colour2{{#invoke:Designation|abbr}}implements Template:Designation/abbreviation{{#invoke:Designation|divbox}}implements Template:Designation/divbox{{#invoke:Designation|doc_table}}implements Template:Designation/Supported designations
Additional functions
The header, number and label functions have been written for the convenience of Template:Infobox NRHP.
Tracking categories
require('strict')
local p = {}
local sandbox-- = '/sandbox' -- COMMENT OUT this defintion on the live version
local validate = function(args)
local former = false
if args.delisted=='yes' then
former = true
end
local par
if args and args[1] and args[1]~='' then
par = args[1]:lower()
if par:sub(1, 6)=='former' then
former = true
par = par:sub(7) -- strip off "former" from start
end
local list = mw.loadJsonData('Module:Designation/list' .. (sandbox or ''))
if list[par] then -- lookup not needed
return list[par], former
else -- attempt lookup
local lookup = mw.loadJsonData('Module:Designation/lookup' .. (sandbox or ''))
if lookup[par] then -- successful lookup
par = lookup[par]
return list[par], former
else
local category = mw.title.getCurrentTitle().namespace==0 and '[[Category:Articles using Template:Designation with invalid designation]]' or ''
return 'Invalid designation' .. category
end
end
else
return 'No parameter'
end
end
local get_data = function(frame)
local getArgs = require('Module:Arguments').getArgs
local args = getArgs(frame, {wrappers = {
'Template:Designation',
'Template:Designation/text',
'Template:Designation/colour',
'Template:Designation/colour2',
'Template:Designation/divbox',
'Template:Designation/abbreviation'
}})
return validate(args)
end
local text = function(frame, data, former)
local text = data.text
if data.lang then
text = frame:expandTemplate{title = 'lang', args = {
code = data.lang,
text = text
}}
end
return text and ((former and 'Former ' or '') .. text)
end
p.text = function(frame)
local data, former = get_data(frame)
if type(data)=='string' then
return data
end
return text(frame, data, former)
end
local colour = function(data, former, index)
local color
if former then
color = 'DDDDDD'
elseif data[index] then
color = data[index]
else
color = 'A8EDEF' -- default colour
end
return color and ('#' .. color)
end
p.color = function(frame)
local data, former = get_data(frame)
if type(data)=='string' then
return data
end
return mw.text.nowiki(colour(data, former, 'col'))
end
p.color2 = function(frame)
local data, former = get_data(frame)
if type(data)=='string' then
return data
end
return mw.text.nowiki(colour(data, former, 'col2'))
end
p.abbr = function(frame)
local data, former = get_data(frame)
if type(data)=='string' then
return data
end
return former and '???' or data.abbr or '???'
end
local box = function(data, color, text)
local div = mw.html.create('div')
:css('line-height', '1.5')
:css('text-align', 'center')
if type(data)=='string' then
local invalid = mw.html.create('span')
:css('color', 'red')
:wikitext('Error: ' .. data)
div:node(invalid)
else
div:css('border-style', 'solid')
:css('border-width', '4px')
:css('border-color', color)
:wikitext(text)
end
return div
end
p.divbox = function(frame)
local data, former = get_data(frame)
local color = colour(data, former, 'col2')
local text = text(frame, data, former)
return tostring(box(data, color, text))
end
p.doc_table = function(frame)
local scope = frame.args and frame.args.scope
local scopes = {}
for s in mw.text.gsplit(scope, ",", true) do
scopes[mw.text.trim(s:lower())] = true
end
local lookup = mw.loadJsonData('Module:Designation/lookup' .. (sandbox or ''))
local rev_lookup = {}
for alias, code in pairs(lookup) do
if rev_lookup[code] then
table.insert(rev_lookup[code], alias)
else
rev_lookup[code] = {alias}
end
end
local list = mw.loadJsonData('Module:Designation/list' .. (sandbox or ''))
local header = mw.html.create('tr')
:tag('th'):wikitext('Code'):done()
:tag('th'):wikitext('Designation'):done()
:tag('th'):css('width', '250px'):wikitext('Bordered version'):done()
:tag('th'):wikitext('Scope'):done()
:tag('th'):wikitext('Aliases'):done()
local tab = mw.html.create('table')
:addClass('wikitable')
:addClass('sortable')
:node(header)
for code, data in pairs(list) do
if scopes[data.scope:lower()] then
local des = mw.html.create('td')
:css('text-align', 'center')
:css('background', '#' .. (data.col or 'A8EDEF'))
:wikitext(data.text)
local border = mw.html.create('td')
:node(box(data, '#'..(data.col2 or 'A8EDEF'), data.text))
local row = mw.html.create('tr')
:tag('th'):wikitext(code):done()
:node(des)
:node(border)
:tag('td'):css('text-align', 'center'):wikitext(data.scope):done()
:tag('td'):wikitext(rev_lookup[code] and table.concat(rev_lookup[code], ', ')):done()
tab:node(row)
end
end
return tostring(tab)
end
local check_params = function(args, n)
local desp = {root = args['designated_other' .. n]}
local suffixes = {'name', 'color', 'textcolor', 'link', 'num_position', 'number', 'abbr'}
for _, s in ipairs(suffixes) do
desp[s] = args['designated_other' .. n .. '_' .. s]
end
local data = desp.root and validate{[1]=desp.root}
return desp, data
end
p.header = function(frame)
local desp, data = check_params(frame:getParent().args, frame.args[1])
local makediv = function(text, bgcolor, num, textcolor)
local autolink = require('Module:Link if exists')._main
local link = autolink{[1]=text}
local span = mw.html.create('span')
:css('color', textcolor)
:wikitext(link)
local div = mw.html.create('div')
:css('width', '100%')
:css('text-align', 'center')
:css('line-height', '1.5')
:css('color', 'var(--color-base)')
:css('background', bgcolor)
:node(span)
:wikitext(num)
return tostring(div)
end
local num = ''
local position = desp.num_position and desp.num_position:lower()
if desp.number and desp.number~='' and (position=='both' or position=='top') then
local abbr = frame:expandTemplate{title = 'abbr', args = {[1]='No.', [2]='Number'}}
num = ' ' .. abbr .. ' ' .. desp.number
end
if data and type(data)=='table' then
return makediv(data.text, '#' .. (data.col or 'A8EDEF'), num)
elseif desp.name then
return makediv(desp.name, desp.color or 'FFFFFF', num, desp.textcolor)
end
end
p.label = function(frame)
local desp, data = check_params(frame:getParent().args, frame.args[1])
local abbr = (data and data.abbr) or desp.abbr or '???'
local category = abbr=='???' and mw.title.getCurrentTitle().namespace==0 and '[[Category:Articles using Template:Designation with undefined abbreviation]]' or ''
return frame.args[2] .. ' ' .. abbr .. category
end
p.number = function(frame)
local desp, data = check_params(frame:getParent().args, frame.args[1])
local out = ''
local position = desp.num_position and desp.num_position:lower()
if position~='top' then
local noabbr = frame:expandTemplate{title = 'abbr', args = {[1]='No.', [2]='Number'}}
local abbr = data and data.abbr or desp.abbr or '???'
local category = abbr=='???' and mw.title.getCurrentTitle().namespace==0 and '[[Category:Articles using Template:Designation with undefined abbreviation]]' or ''
out = abbr .. ' ' .. noabbr .. category
end
return out
end
return p