Module:Message box: Difference between revisions

m
1 revision imported: importing from sister site
(more ambox stuff - still a little broken)
m (1 revision imported: importing from sister site)
 
(79 intermediate revisions by 18 users not shown)
Line 1:
-- 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}}.
 
-- Load necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
local nsDetect = require('Module:NamespaceNo detectglobals')
local getArgs
local categoryHandler = require('Module:Category handler')._main
local yesno = require('Module:Yesno')
 
-- Get a language object for formatDate and ucfirst.
local p = {}
local lang = mw.language.getContentLanguage()
 
-- Define constants
local function getTitleObject(page)
local CONFIG_MODULE = 'Module:Message box/configuration'
if type(page) == 'string' then
 
-- Get the title object, passing the function through pcall
--------------------------------------------------------------------------------
-- in case we are over the expensive function count limit.
-- Helper functions
local success
--------------------------------------------------------------------------------
success, page = pcall(mw.title.new, page)
 
if not success then
local function getTitleObject(...)
page = nil
-- Get the title object, passing the function through pcall
end
-- in case we are over the expensive function count limit.
end
local success, title = return page or pcall(mw.title.getCurrentTitle(new, ...)
if success then
return title
end
end
 
local function p.buildunion(datat1, argst2)
-- GetReturns the titleunion objectof and thetwo namespacearrays.
local titlevals = mw.title.getCurrentTitle(){}
for i, v in ipairs(t1) do
local nsid = title.namespace
vals[v] = true
end
-- Commenting this out for now - this will require tinkering with Namespace detect to differentiate between
for i, v in ipairs(t2) do
-- invalid titles and pages where the expensive parser function count has been exceeded.
vals[v] = true
--[[
end
local title = nsDetect.getPageObject(args.page)
local namespaceret = nsDetect.main{}
for k in pairs(vals) do
page = args.page,
table.insert(ret, k)
demospace = args.demospace,
end
main = 'main',
table.sort(ret)
talk = 'talk',
return ret
file = 'file',
end
category = 'category',
other = 'other'
}
]]
 
local function getArgNums(args, prefix)
------------------------ Process config data ----------------------------
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
 
--------------------------------------------------------------------------------
-- Type data.
-- Box class definition
local typeData = data.types[args.type]
--------------------------------------------------------------------------------
local invalidType = args.type and not typeData and true or false
typeData = typeData or data.types[data.default]
 
local MessageBox = {}
-- Process data for collapsible text fields
MessageBox.__index = MessageBox
local text, talk, fix, date, info
if data.useCollapsibleTextFields then
text = args.issue
talk = args.talk
fix = args.fix
date = args.date
info = args.info
else
text = args.text
end
 
function MessageBox.new(boxType, args, cfg)
-- Find whether we are using a small message box and process our data accordingly.
args = args or {}
local isSmall = data.allowSmall and (args.small == 'yes' or args.small == true) and true or false
local obj = {}
local smallClass, image, imageRight, imageSize
if isSmall then
smallClass = data.smallClass or 'mbox-small'
image = args.smallimage or args.image
imageRight = args.smallimageright or args.imageright
text = args.smalltext or text
imageSize = data.imageSmallSize or '30x30px'
else
image = args.image
imageRight = args.imageright
imageSize = '40x40px'
end
 
-- Set the title object and the namespace.
------------------------ Get the box structure ----------------------------
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
 
-- Set the config for our box type.
local root = htmlBuilder.create() -- Includes error messages and categories added after the box.
obj.cfg = cfg[boxType]
local substCheck = root.tag('b').addClass('error')
if not obj.cfg then
local box = root.tag('table')
local rowns = boxobj.title.tag('tr')namespace
-- boxType is "mbox" or invalid input
local imageLeftCell = row.tag('td').addClass('mbox-image')
if ns == 0 then
local textCell = row.tag('td').addClass('mbox-text')
obj.cfg = cfg.ambox -- main namespace
local imageRightCell = row.tag('td').addClass('mbox-imageright')
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
 
-- Set the arguments, and remove all blank arguments except for the ones
------------------------ Build the box ----------------------------
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
 
-- Define internal data structure.
-- Do the subst check.
obj.categories = {}
if data.substCheck and args.subst == 'SUBST' then
obj.classes = {}
if type(args.name) == 'string' then
substCheck
.wikitext(mw.ustring.format(
'Template <code>%s%s%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'),
args.name,
mw.text.nowiki('}}')
))
end
root.wikitext('[[Category:Pages with incorrectly substituted templates]]') -- This puts the category at the *end* of the output, rather than after the subst error message.
end
 
return setmetatable(obj, MessageBox)
-- Build the box.
end
box
.attr('id', args.id)
for i, class in ipairs(data.classes) do
box
.addClass(class)
end
box
.addClass(isSmall and smallClass)
.addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks')
.addClass(typeData.class)
.addClass(args.class)
.cssText(args.style)
.attr('role', 'presentation')
 
function MessageBox:addCat(ns, cat, sort)
-- Add the left-hand image.
if not cat then
local imageCheckBlank = data.imageCheckBlank
return nil
if image ~= 'none' and not imageCheckBlank or image ~= 'none' and imageCheckBlank and image ~= 'blank' then
end
if not isSmall and data.imageCellDiv then
if sort then
imageLeftCell = imageLeftCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageLeftCell so that the image is inside it.
cat = string.format('[[Category:%s|%s]]', cat, sort)
end
else
imageLeftCell
cat = string.format('[[Category:%s]]', cat)
.wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize))
end
elseif data.imageEmptyCell then
self.categories[ns] = self.categories[ns] or {}
row.tag('td')
table.insert(self.categories[ns], cat)
.addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width.
end
.cssText(data.imageEmptyCellStyle and 'border:none;padding:0px;width:1px')
end
 
function MessageBox:addClass(class)
-- Add the text.
if not class then
if data.useCollapsibleTextFields then
return nil
textCell
end
.cssText(args.textstyle)
table.insert(self.classes, class)
local textCellSpan = textCell.tag('span')
end
textCellSpan
.addClass('mbox-text-span')
.wikitext(text)
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(talk)
.wikitext(fix)
.done()
end
textCellSpan
.wikitext(date and mw.ustring.format(" <small>''(%s)''</small>", date))
if not isSmall then
textCellSpan
.tag('span')
.addClass('hide-when-compact')
.wikitext(info and ' ' .. info)
end
else
textCell
.cssText(args.textstyle)
.wikitext(text)
end
 
function MessageBox:setParameters()
-- Add the right-hand image.
local args = self.args
if imageRight and not (data.imageRightNone and imageRight == 'none') then
local cfg = self.cfg
if not isSmall and data.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
.wikitext(imageRight)
end
 
-- Add theGet belowtype rowdata.
if data self.belowtype and= args.below thentype
local typeData = cfg.types[self.type]
box.tag('tr')
self.invalidTypeError = cfg.showInvalidTypeError
.tag('td')
and self.type
.attr('colspan', args.imageright and '3' or '2')
and not typeData
.addClass('mbox-text')
typeData = typeData or cfg.types[cfg.default]
.cssText(args.textstyle)
self.typeClass = typeData.class
.wikitext(args.below)
self.typeImage = typeData.image
end
 
-- Find if the box has been wrongly substituted.
------------------------ Add error messages and categories ----------------------------
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
 
-- Find whether we are using a small message box.
-- Add error message and tracking category for invalid type parameters.
self.isSmall = cfg.allowSmall and (
if invalidType then
cfg.smallParam and args.small == cfg.smallParam
local catsort = (nsid == 0 and 'Main:' or '') .. title.prefixedText
or not cfg.smallParam and yesno(args.small)
root
)
.tag('div')
.css('text-align', 'center')
.wikitext(mw.ustring.format('This message box is using an invalid "type=%s" parameter and needs fixing.', args.type or ''))
.done()
.wikitext(mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort))
end
 
-- Add attributes, classes and styles.
-- Categorise template pages.
self.id = args.id
if data.category and nsid == 10 and not title.isSubpage and not yesno(args.nocat) then
if yesno(args.plainlinks) ~= false then
root.wikitext(mw.ustring.format('[[Category:%s]]', data.category))
self:addClass('plainlinks')
end
end
return tostring(root)
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
 
-- Set text style.
self.textstyle = args.textstyle
 
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
self.name = args.name
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
 
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
 
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
self.talk = talkText
end
end
 
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <small>''(%s)''</small>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
 
-- 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.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
 
-- Set the below row.
self.below = cfg.below and args.below
 
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
end
 
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
or 'Imbox notice.png', imageSize)
end
end
 
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
end
 
function p._amboxMessageBox:setMainspaceCategories(args)
local dataargs = {}self.args
local cfg = self.cfg
data.types = {
 
speedy = {
if not cfg.allowMainspaceCategories then
class = 'ambox-speedy',
return nil
image = 'Ambox speedy deletion.png'
end
},
 
delete = {
local nums = {}
class = 'ambox-delete',
for _, prefix in ipairs{'cat', 'category', 'all'} do
image = 'Ambox deletion.png'
args[prefix .. '1'] = args[prefix]
},
nums = union(nums, getArgNums(args, prefix))
content = {
end
class = 'ambox-content',
 
image = 'Ambox content.png'
-- The following is roughly equivalent to the old {{Ambox/category}}.
},
local date = args.date
style = {
date = type(date) == 'string' and date
class = 'ambox-style',
local preposition = 'from'
image = 'Edit-clear.svg'
for _, num in ipairs(nums) do
},
local mainCat = args['cat' .. tostring(num)]
move = {
or args['category' .. tostring(num)]
class = 'ambox-move',
local allCat = args['all' .. tostring(num)]
image = 'Ambox move.png'
mainCat = type(mainCat) == 'string' and mainCat
},
allCat = type(allCat) == 'string' and allCat
protection = {
if mainCat and date and date ~= '' then
class = 'ambox-protection',
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
image = 'Ambox protection.png'
self:addCat(0, catTitle)
},
catTitle = getTitleObject('Category:' .. catTitle)
notice = {
if not catTitle or not catTitle.exists then
class = 'ambox-notice',
self:addCat(0, 'Articles with invalid date parameter in template')
image = 'Ambox notice.png'
end
}
elseif mainCat and (not date or date == '') then
}
self:addCat(0, mainCat)
data.default = 'notice'
end
data.allowSmall = true
if allCat then
data.substCheck = true
self:addCat(0, allCat)
data.classes = {'metadata', 'plainlinks', 'ambox'}
end
data.smallClass = 'mbox-small-left'
end
data.imageEmptyCell = true
data.imageCheckBlank = true
data.imageSmallSize = '20x20px'
data.imageCellDiv = true
data.useCollapsibleTextFields = true
data.imageRightNone = true
return p.build(data, args)
end
 
function p._fmboxMessageBox:setTemplateCategories(args)
local dataargs = {}self.args
local cfg = self.cfg
data.types = {
 
warning = {
-- Add template categories.
class = 'fmbox-warning',
if cfg.templateCategory then
image = 'Cmbox deletion.png'
if cfg.templateCategoryRequireName then
},
if self.isTemplatePage then
editnotice = {
self:addCat(10, cfg.templateCategory)
class = 'fmbox-editnotice',
end
image = 'Imbox notice.png'
elseif not self.title.isSubpage then
},
self:addCat(10, cfg.templateCategory)
system = {
end
class = 'fmbox-system',
end
image = 'Imbox notice.png'
 
}
-- Add template error categories.
}
if cfg.templateErrorCategory then
data.default = 'system'
local templateErrorCategory = cfg.templateErrorCategory
data.classes = { 'plainlinks', 'fmbox' }
local templateCat, templateSort
data.imageEmptyCell = false
if not self.name and not self.title.isSubpage then
data.imageRightNone = false
templateCat = templateErrorCategory
return p.build(data, args)
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
 
function p._omboxMessageBox:setAllNamespaceCategories(args)
-- Set categories for all namespaces.
local data = {}
if self.invalidTypeError then
data.types = {
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
speedy = {
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
class = 'ombox-speedy',
end
image = 'Imbox speedy deletion.png'
if self.isSubstituted then
},
self:addCat('all', 'Pages with incorrectly substituted templates')
delete = {
end
class = 'ombox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'ombox-content',
image = 'Imbox content.png'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Imbox move.png'
},
protection = {
class = 'ombox-protection',
image = 'Imbox protection.png'
},
notice = {
class = 'ombox-notice',
image = 'Imbox notice.png'
}
}
data.default = 'notice'
data.classes = {'plainlinks', 'ombox'}
data.allowSmall = true
data.imageEmptyCell = true
data.imageRightNone = true
return p.build(data, args)
end
 
function p._imboxMessageBox:setCategories(args)
if self.title.namespace == 0 then
local data = {}
self:setMainspaceCategories()
data.types = {
elseif self.title.namespace == 10 then
speedy = {
self:setTemplateCategories()
class = 'imbox-speedy',
end
image = 'Imbox speedy deletion.png'
self:setAllNamespaceCategories()
},
delete = {
class = 'imbox-delete',
image = 'Imbox deletion.png'
},
content = {
class = 'imbox-content',
image = 'Imbox content.png'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Imbox move.png'
},
protection = {
class = 'imbox-protection',
image = 'Imbox protection.png'
},
license = {
class = 'imbox-license',
image = 'Imbox license.png'
},
featured = {
class = 'imbox-featured',
image = 'Imbox featured.png'
},
notice = {
class = 'imbox-notice',
image = 'Imbox notice.png'
}
}
data.default = 'notice'
data.classes = {'imbox'}
data.classPlainlinksYesno = true
data.imageEmptyCell = true
data.below = true
return p.build(data, args)
end
 
function p._cmboxMessageBox:renderCategories(args)
-- Convert category tables to strings and pass them through
local data = {}
-- [[Module:Category handler]].
data.types = {
return categoryHandler{
speedy = {
main = table.concat(self.categories[0] or {}),
class = 'cmbox-speedy',
template = table.concat(self.categories[10] or {}),
image = 'Cmbox deletion.png'
all = table.concat(self.categories.all or {}),
},
nocat = self.args.nocat,
delete = {
page = self.args.page
class = 'cmbox-delete',
}
image = 'Cmbox deletion.png'
},
content = {
class = 'cmbox-content',
image = 'Cmbox content.png'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Cmbox move.png'
},
protection = {
class = 'cmbox-protection',
image = 'Cmbox protection.png'
},
notice = {
class = 'cmbox-notice',
image = 'Cmbox notice.png'
}
}
data.default = 'notice'
data.classes = {'plainlinks', 'cmbox'}
return p.build(data, args)
end
 
function p._tmboxMessageBox:export(args)
local dataroot = {}mw.html.create()
 
data.types = {
-- Add the subst check error.
speedy = {
if self.isSubstituted and self.name then
class = 'tmbox-speedy',
root:tag('b')
image = 'Imbox speedy deletion.png'
:addClass('error')
},
:wikitext(string.format(
delete = {
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
class = 'tmbox-delete',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
image = 'Imbox deletion.png'
))
},
end
content = {
 
class = 'tmbox-content',
-- Create the box table.
image = 'Imbox content.png'
local boxTable = root:tag('table')
},
boxTable:attr('id', self.id or nil)
style = {
for i, class in ipairs(self.classes or {}) do
class = 'tmbox-style',
boxTable:addClass(class or nil)
image = 'Edit-clear.svg '
end
},
boxTable
move = {
:cssText(self.style or nil)
class = 'tmbox-move',
:attr('role', 'presentation')
image = 'Imbox move.png'
 
},
if self.attrs then
protection = {
boxTable:attr(self.attrs)
class = 'tmbox-protection',
end
image = 'Imbox protection.png'
 
},
-- Add the left-hand image.
notice = {
local row = boxTable:tag('tr')
class = 'tmbox-notice',
if self.imageLeft then
image = 'Imbox notice.png'
local imageLeftCell = row:tag('td'):addClass('mbox-image')
}
if self.imageCellDiv then
}
-- If we are using a div, redefine imageLeftCell so that the image
data.default = 'notice'
-- is inside it. Divs use style="width: 52px;", which limits the
data.classes = {'plainlinks', 'tmbox'}
-- image width to 52px. If any images in a div are wider than that,
data.allowSmall = true
-- they may overlap with the text or cause other display problems.
data.imageRightNone = true
imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
data.imageEmptyCellStyle = true
end
data.category = 'Talk message boxes'
imageLeftCell:wikitext(self.imageLeft or nil)
return p.build(data, args)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
:cssText(self.imageEmptyCellStyle or nil)
end
 
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) and not self.isSmall then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('small')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
 
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):css('width', '52px')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
 
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
 
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:css('text-align', 'center')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
 
-- Add categories.
root:wikitext(self:renderCategories() or nil)
 
return tostring(root)
end
 
--------------------------------------------------------------------------------
local function makeWrapper(func)
-- Exports
return function (frame)
--------------------------------------------------------------------------------
-- If called via #invoke, use the args passed into the invoking
 
-- template, or the args passed to #invoke if any exist. Otherwise
local p, mt = {}, {}
-- assume args are being passed directly in from the debug console
 
-- or from another Lua module.
function p._exportClasses()
local origArgs
-- For testing.
if frame == mw.getCurrentFrame() then
return {
origArgs = frame:getParent().args
MessageBox = MessageBox
for k, v in pairs(frame.args) do
}
origArgs = frame.args
break
end
else
origArgs = frame
end
-- Trim whitespace and remove blank arguments.
local args = {}
for k, v in pairs(origArgs) do
if type(v) == 'string' then
v = mw.text.trim(v)
end
if v ~= '' or k == 'talk' or k == 'sect' or k == 'date' then
args[k] = v
end
end
return func(args)
end
end
 
function p.main(boxType, args, cfgTables)
p.ambox = makeWrapper(p._ambox)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
p.fmbox = makeWrapper(p._fmbox)
box:setParameters()
p.imbox = makeWrapper(p._imbox)
box:setCategories()
p.ombox = makeWrapper(p._ombox)
return box:export()
p.cmbox = makeWrapper(p._cmbox)
end
p.tmbox = makeWrapper(p._tmbox)
 
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
 
return setmetatable(p, mt)