Module:Message box: Difference between revisions

Jump to navigation Jump to search
m>Mr. Stradivarius
Allow passing attributes per protected edit request by User:Jackmcbarn. Also remove undocumented "hidden" parameter and format the module so it mostly fits within 80 chars.
No edit summary
Line 1: Line 1:
-- This is a meta-module for producing message box templates, including
-- This is a meta-module for producing message box templates, including
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
 
-- Require necessary modules.
-- Require necessary modules.
local getArgs = require('Module:Arguments').getArgs
local getArgs = require('Module:Arguments').getArgs
Line 7: Line 7:
local categoryHandler = require('Module:Category handler').main
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
local yesno = require('Module:Yesno')
 
-- Load the configuration page.
-- Load the configuration page.
local cfgTables = mw.loadData('Module:Message box/configuration')
local cfgTables = mw.loadData('Module:Message box/configuration')
 
-- Get a language object for formatDate and ucfirst.
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
local lang = mw.language.getContentLanguage()
 
-- Set aliases for often-used functions to reduce table lookups.
-- Set aliases for often-used functions to reduce table lookups.
local format = mw.ustring.format
local format = mw.ustring.format
Line 19: Line 19:
local tconcat = table.concat
local tconcat = table.concat
local trim = mw.text.trim
local trim = mw.text.trim
 
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Helper functions
-- Helper functions
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
 
local function getTitleObject(page, ...)
local function getTitleObject(page, ...)
if type(page) == 'string' then
if type(page) == 'string' then
Line 34: Line 34:
end
end
end
end
 
local function union(t1, t2)
local function union(t1, t2)
-- Returns the union of two arrays.
-- Returns the union of two arrays.
Line 51: Line 51:
return ret
return ret
end
end
 
local function getArgNums(args, prefix)
local function getArgNums(args, prefix)
local nums = {}
local nums = {}
Line 63: Line 63:
return nums
return nums
end
end
 
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Box class definition
-- Box class definition
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
 
local box = {}
local box = {}
box.__index = box
box.__index = box
 
function box.new()
function box.new()
local obj = {}
local obj = {}
Line 76: Line 76:
return obj
return obj
end
end
 
function box.getNamespaceId(ns)
function box.getNamespaceId(ns)
if not ns then return end
if not ns then return end
Line 90: Line 90:
end
end
end
end
 
function box.getMboxType(nsid)
function box.getMboxType(nsid)
-- Gets the mbox type from a namespace number.
-- Gets the mbox type from a namespace number.
Line 108: Line 108:
end
end
end
end
 
function box:addCat(ns, cat, sort)
function box:addCat(ns, cat, sort)
if type(cat) ~= 'string' then return end
if type(cat) ~= 'string' then return end
Line 134: Line 134:
end
end
end
end
 
function box:addClass(class)
function box:addClass(class)
if type(class) ~= 'string' then return end
if type(class) ~= 'string' then return end
Line 140: Line 140:
tinsert(self.classes, class)
tinsert(self.classes, class)
end
end
 
function box:addAttr(attr, val)
function box:addAttr(attr, val)
if type(attr) ~= 'string' or type(val) ~= 'string' then return end
if type(attr) ~= 'string' or type(val) ~= 'string' then return end
Line 146: Line 146:
tinsert(self.attrs, attr)
tinsert(self.attrs, attr)
end
end
 
function box:setTitle(args)
function box:setTitle(args)
-- Get the title object and the namespace.
-- Get the title object and the namespace.
Line 154: Line 154:
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
end
end
 
function box:getConfig(boxType)
function box:getConfig(boxType)
-- Get the box config data from the data page.
-- Get the box config data from the data page.
Line 175: Line 175:
return cfg
return cfg
end
end
 
function box:removeBlankArgs(cfg, args)
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in
-- Only allow blank arguments for the parameter names listed in
Line 190: Line 190:
return newArgs
return newArgs
end
end
 
function box:setBoxParameters(cfg, args)
function box:setBoxParameters(cfg, args)
-- Get type data.
-- Get type data.
Line 203: Line 203:
self.typeClass = typeData.class
self.typeClass = typeData.class
self.typeImage = typeData.image
self.typeImage = typeData.image
 
-- Find if the box has been wrongly substituted.
-- Find if the box has been wrongly substituted.
if cfg.substCheck and args.subst == 'SUBST' then
if cfg.substCheck and args.subst == 'SUBST' then
self.isSubstituted = true
self.isSubstituted = true
end
end
 
-- Find whether we are using a small message box.
-- Find whether we are using a small message box.
if cfg.allowSmall and (
if cfg.allowSmall and (
Line 219: Line 219:
self.isSmall = false
self.isSmall = false
end
end
 
-- Add attributes, classes and styles.
-- Add attributes, classes and styles.
if cfg.allowId then
if cfg.allowId then
Line 237: Line 237:
self.style = args.style
self.style = args.style
self.attrs = args.attrs
self.attrs = args.attrs
 
-- Set text style.
-- Set text style.
self.textstyle = args.textstyle
self.textstyle = args.textstyle
 
-- Find if we are on the template page or not. This functionality is only
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
Line 262: Line 262:
or false
or false
end
end
 
-- Process data for collapsible text fields. At the moment these are only
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
-- used in {{ambox}}.
Line 286: Line 286:
self.issue = tconcat(issues, ' ')
self.issue = tconcat(issues, ' ')
end
end
 
-- Get the self.talk value.
-- Get the self.talk value.
local talk = args.talk
local talk = args.talk
Line 335: Line 335:
end
end
end
end
 
-- Get other values.
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
self.fix = args.fix ~= '' and args.fix or nil
Line 349: Line 349:
self.info = args.info
self.info = args.info
end
end
 
-- Set the non-collapsible text field. At the moment this is used by all box
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
-- types other than ambox, and also by ambox when small=yes.
Line 357: Line 357:
self.text = args.text
self.text = args.text
end
end
 
-- Set the below row.
-- Set the below row.
self.below = cfg.below and args.below
self.below = cfg.below and args.below
 
-- General image settings.
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
Line 367: Line 367:
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
end
 
-- Left image settings.
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
local imageLeft = self.isSmall and args.smallimage or args.image
Line 382: Line 382:
end
end
end
end
 
-- Right image settings.
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
local imageRight = self.isSmall and args.smallimageright or args.imageright
Line 388: Line 388:
self.imageRight = imageRight
self.imageRight = imageRight
end
end
 
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
if cfg.allowMainspaceCategories then
if cfg.allowMainspaceCategories then
Line 433: Line 433:
end
end
end
end
 
-- Add template-namespace categories.
-- Add template-namespace categories.
if cfg.templateCategory then
if cfg.templateCategory then
Line 444: Line 444:
end
end
end
end
 
-- Add template error category.
-- Add template error category.
if cfg.templateErrorCategory then
if cfg.templateErrorCategory then
Line 470: Line 470:
self:addCat('template', templateCat, templateSort)
self:addCat('template', templateCat, templateSort)
end
end
 
-- Categories for all namespaces.
-- Categories for all namespaces.
if self.invalidTypeError then
if self.invalidTypeError then
Line 479: Line 479:
self:addCat('all', 'Pages with incorrectly substituted templates')
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
 
-- Convert category tables to strings and pass them through
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
-- [[Module:Category handler]].
Line 491: Line 491:
}
}
end
end
 
function box:export()
function box:export()
local root = htmlBuilder.create()
local root = htmlBuilder.create()
 
-- Add the subst check error.
-- Add the subst check error.
if self.isSubstituted and self.name then
if self.isSubstituted and self.name then
Line 505: Line 505:
))
))
end
end
 
-- Create the box table.
-- Create the box table.
local boxTable = root.tag('table')
local boxTable = root.tag('table')
Line 521: Line 521:
.attr(attr, val)
.attr(attr, val)
end
end
 
-- Add the left-hand image.
-- Add the left-hand image.
local row = boxTable.tag('tr')
local row = boxTable.tag('tr')
Line 544: Line 544:
.cssText(self.imageEmptyCellStyle)
.cssText(self.imageEmptyCellStyle)
end
end
 
-- Add the text.
-- Add the text.
local textCell = row.tag('td').addClass('mbox-text')
local textCell = row.tag('td').addClass('mbox-text')
Line 577: Line 577:
.wikitext(self.text)
.wikitext(self.text)
end
end
 
-- Add the right-hand image.
-- Add the right-hand image.
if self.imageRight then
if self.imageRight then
Line 589: Line 589:
.wikitext(self.imageRight)
.wikitext(self.imageRight)
end
end
 
-- Add the below row.
-- Add the below row.
if self.below then
if self.below then
Line 599: Line 599:
.wikitext(self.below)
.wikitext(self.below)
end
end
 
-- Add error message for invalid type parameters.
-- Add error message for invalid type parameters.
if self.invalidTypeError then
if self.invalidTypeError then
Line 610: Line 610:
))
))
end
end
 
-- Add categories.
-- Add categories.
root
root
.wikitext(self.categories)
.wikitext(self.categories)
 
return tostring(root)
return tostring(root)
end
end
 
local function main(boxType, args)
local function main(boxType, args)
local outputBox = box.new()
local outputBox = box.new()
Line 626: Line 626:
return outputBox:export()
return outputBox:export()
end
end
 
local function makeWrapper(boxType)
local function makeWrapper(boxType)
return function (frame)
return function (frame)
Line 633: Line 633:
end
end
end
end
 
local p = {
local p = {
main = main,
main = main,
mbox = makeWrapper('mbox')
mbox = makeWrapper('mbox')
}
}
 
for boxType in pairs(cfgTables) do
for boxType in pairs(cfgTables) do
p[boxType] = makeWrapper(boxType)
p[boxType] = makeWrapper(boxType)
end
end
 
return p
return p