Editing Module:Message box

Jump to: navigation, search

Warning: You are not logged in.

Your IP address will be recorded in this page's edit history.
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision Your text
Line 2: Line 2:
 
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
 
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
  
-- Load necessary modules.
+
-- Require necessary modules.
require('Module:No globals')
+
local getArgs = require('Module:Arguments').getArgs
local getArgs
+
local htmlBuilder = require('Module:HtmlBuilder')
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.
 +
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.
 +
local format = mw.ustring.format
 +
local tinsert = table.insert
 +
local tconcat = table.concat
 +
local trim = mw.text.trim
  
 
--------------------------------------------------------------------------------
 
--------------------------------------------------------------------------------
Line 15: Line 24:
 
--------------------------------------------------------------------------------
 
--------------------------------------------------------------------------------
  
local function getTitleObject(...)
+
local function getTitleObject(page, ...)
-- Get the title object, passing the function through pcall
+
if type(page) == 'string' then
-- in case we are over the expensive function count limit.
+
-- Get the title object, passing the function through pcall  
local success, title = pcall(mw.title.new, ...)
+
-- in case we are over the expensive function count limit.
if success then
+
local success, title = pcall(mw.title.new, page, ...)
return title
+
if success then
 +
return title
 +
end
 
end
 
end
 
end
 
end
Line 35: Line 46:
 
local ret = {}
 
local ret = {}
 
for k in pairs(vals) do
 
for k in pairs(vals) do
table.insert(ret, k)
+
tinsert(ret, k)
 
end
 
end
 
table.sort(ret)
 
table.sort(ret)
Line 46: Line 57:
 
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
 
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
 
if num then
 
if num then
table.insert(nums, tonumber(num))
+
tinsert(nums, tonumber(num))
 
end
 
end
 
end
 
end
Line 57: Line 68:
 
--------------------------------------------------------------------------------
 
--------------------------------------------------------------------------------
  
local MessageBox = {}
+
local box = {}
MessageBox.__index = MessageBox
+
box.__index = box
  
function MessageBox.new(boxType, args, cfg)
+
function box.new()
args = args or {}
+
 
local obj = {}
 
local obj = {}
 +
setmetatable(obj, box)
 +
return obj
 +
end
  
-- Set the title object and the namespace.
+
function box.getNamespaceId(ns)
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
+
if not ns then return end
 +
if type(ns) == 'string' then
 +
ns = lang:ucfirst(mw.ustring.lower(ns))
 +
if ns == 'Main' then
 +
ns = 0
 +
end
 +
end
 +
local nsTable = mw.site.namespaces[ns]
 +
if nsTable then
 +
return nsTable.id
 +
end
 +
end
  
-- Set the config for our box type.
+
function box.getMboxType(nsid)
obj.cfg = cfg[boxType]
+
-- Gets the mbox type from a namespace number.
if not obj.cfg then
+
if nsid == 0 then
local ns = obj.title.namespace
+
return 'ambox' -- main namespace
-- boxType is "mbox" or invalid input
+
elseif nsid == 6 then
if ns == 0 then
+
return 'imbox' -- file namespace
obj.cfg = cfg.ambox -- main namespace
+
elseif nsid == 14 then
elseif ns == 6 then
+
return 'cmbox' -- category namespace
obj.cfg = cfg.imbox -- file namespace
+
else
elseif ns == 14 then
+
local nsTable = mw.site.namespaces[nsid]
obj.cfg = cfg.cmbox -- category namespace
+
if nsTable and nsTable.isTalk then
 +
return 'tmbox' -- any talk namespace
 
else
 
else
local nsTable = mw.site.namespaces[ns]
+
return 'ombox' -- other namespaces or invalid input
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
 
end
 
end
 +
end
  
-- Set the arguments, and remove all blank arguments except for the ones
+
function box:addCat(ns, cat, sort)
-- listed in cfg.allowBlankParams.
+
if type(cat) ~= 'string' then return end
do
+
local nsVals = {'main', 'template', 'all'}
local newArgs = {}
+
local tname
for k, v in pairs(args) do
+
for i, val in ipairs(nsVals) do
if v ~= '' then
+
if ns == val then
newArgs[k] = v
+
tname = ns .. 'Cats'
end
+
 
end
 
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
+
end
newArgs[param] = args[param]
+
if not tname then
 +
for i, val in ipairs(nsVals) do
 +
nsVals[i] = format('"%s"', val)
 
end
 
end
obj.args = newArgs
+
error(
 +
'invalid ns parameter passed to box:addCat; valid values are '
 +
.. mw.text.listToText(nsVals, nil, ' or ')
 +
)
 
end
 
end
 +
self[tname] = self[tname] or {}
 +
if type(sort) == 'string' then
 +
tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))
 +
else
 +
tinsert(self[tname], format('[[Category:%s]]', cat))
 +
end
 +
end
  
-- Define internal data structure.
+
function box:addClass(class)
obj.categories = {}
+
if type(class) ~= 'string' then return end
obj.classes = {}
+
self.classes = self.classes or {}
 +
tinsert(self.classes, class)
 +
end
  
return setmetatable(obj, MessageBox)
+
function box:addAttr(attr, val)
 +
if type(attr) ~= 'string' or type(val) ~= 'string' then return end
 +
self.attrs = self.attrs or {}
 +
tinsert(self.attrs, attr)
 
end
 
end
  
function MessageBox:addCat(ns, cat, sort)
+
function box:setTitle(args)
if not cat then
+
-- Get the title object and the namespace.
return nil
+
self.pageTitle = getTitleObject(args.page ~= '' and args.page)
 +
self.title = self.pageTitle or mw.title.getCurrentTitle()
 +
self.demospace = args.demospace ~= '' and args.demospace or nil
 +
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace
 +
end
 +
 
 +
function box:getConfig(boxType)
 +
-- Get the box config data from the data page.
 +
if boxType == 'mbox' then
 +
boxType = box.getMboxType(self.nsid)
 
end
 
end
if sort then
+
local cfg = cfgTables[boxType]
cat = string.format('[[Category:%s|%s]]', cat, sort)
+
if not cfg then
else
+
local boxTypes = {}
cat = string.format('[[Category:%s]]', cat)
+
for k, v in pairs(dataTables) do
 +
tinsert(boxTypes, format('"%s"', k))
 +
end
 +
tinsert(boxTypes, '"mbox"')
 +
error(format(
 +
'invalid message box type "%s"; valid types are %s',
 +
tostring(boxType),
 +
mw.text.listToText(boxTypes)
 +
), 2)
 
end
 
end
self.categories[ns] = self.categories[ns] or {}
+
return cfg
table.insert(self.categories[ns], cat)
+
 
end
 
end
  
function MessageBox:addClass(class)
+
function box:removeBlankArgs(cfg, args)
if not class then
+
-- Only allow blank arguments for the parameter names listed in
return nil
+
-- cfg.allowBlankParams.
 +
local newArgs = {}
 +
for k, v in pairs(args) do
 +
if v ~= '' then
 +
newArgs[k] = v
 +
end
 +
end
 +
for i, param in ipairs(cfg.allowBlankParams or {}) do
 +
newArgs[param] = args[param]
 
end
 
end
table.insert(self.classes, class)
+
return newArgs
 
end
 
end
  
function MessageBox:setParameters()
+
function box:setBoxParameters(cfg, args)
local args = self.args
+
local cfg = self.cfg
+
 
+
 
-- Get type data.
 
-- Get type data.
 
self.type = args.type
 
self.type = args.type
Line 140: Line 198:
 
and self.type
 
and self.type
 
and not typeData
 
and not typeData
 +
and true
 +
or false
 
typeData = typeData or cfg.types[cfg.default]
 
typeData = typeData or cfg.types[cfg.default]
 
self.typeClass = typeData.class
 
self.typeClass = typeData.class
Line 145: Line 205:
  
 
-- Find if the box has been wrongly substituted.
 
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
+
if cfg.substCheck and args.subst == 'SUBST' then
 +
self.isSubstituted = true
 +
end
  
 
-- Find whether we are using a small message box.
 
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
+
if cfg.allowSmall and (
 
cfg.smallParam and args.small == cfg.smallParam
 
cfg.smallParam and args.small == cfg.smallParam
 
or not cfg.smallParam and yesno(args.small)
 
or not cfg.smallParam and yesno(args.small)
 
)
 
)
 +
then
 +
self.isSmall = true
 +
else
 +
self.isSmall = false
 +
end
  
 
-- Add attributes, classes and styles.
 
-- Add attributes, classes and styles.
Line 193: Line 260:
 
self.isTemplatePage = self.templateTitle
 
self.isTemplatePage = self.templateTitle
 
and mw.title.equals(self.title, self.templateTitle)
 
and mw.title.equals(self.title, self.templateTitle)
 +
or false
 
end
 
end
  
Line 213: Line 281:
 
text = type(text) == 'string' and text or nil
 
text = type(text) == 'string' and text or nil
 
local issues = {}
 
local issues = {}
table.insert(issues, sect)
+
tinsert(issues, sect)
table.insert(issues, issue)
+
tinsert(issues, issue)
table.insert(issues, text)
+
tinsert(issues, text)
self.issue = table.concat(issues, ' ')
+
self.issue = tconcat(issues, ' ')
 
end
 
end
  
Line 224: Line 292:
 
-- parameter is blank.
 
-- parameter is blank.
 
if talk == ''
 
if talk == ''
and self.templateTitle
+
and self.templateTitle  
 
and (
 
and (
 
mw.title.equals(self.templateTitle, self.title)
 
mw.title.equals(self.templateTitle, self.title)
Line 250: Line 318:
 
local talkText = 'Relevant discussion may be found on'
 
local talkText = 'Relevant discussion may be found on'
 
if talkArgIsTalkPage then
 
if talkArgIsTalkPage then
talkText = string.format(
+
talkText = format(
 
'%s [[%s|%s]].',
 
'%s [[%s|%s]].',
 
talkText,
 
talkText,
Line 257: Line 325:
 
)
 
)
 
else
 
else
talkText = string.format(
+
talkText = format(
 
'%s the [[%s#%s|talk page]].',
 
'%s the [[%s#%s|talk page]].',
 
talkText,
 
talkText,
Line 277: Line 345:
 
end
 
end
 
if date then
 
if date then
self.date = string.format(" <small>''(%s)''</small>", date)
+
self.date = format(" <small>''(%s)''</small>", date)
 
end
 
end
 
self.info = args.info
 
self.info = args.info
Line 294: Line 362:
  
 
-- General image settings.
 
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
+
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
 
self.imageEmptyCell = cfg.imageEmptyCell
 
self.imageEmptyCell = cfg.imageEmptyCell
 
if cfg.imageEmptyCellStyle then
 
if cfg.imageEmptyCellStyle then
Line 310: Line 378:
 
and (cfg.imageSmallSize or '30x30px')
 
and (cfg.imageSmallSize or '30x30px')
 
or '40x40px'
 
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
+
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage
 
or 'Imbox notice.png', imageSize)
 
or 'Imbox notice.png', imageSize)
 
end
 
end
Line 320: Line 388:
 
self.imageRight = imageRight
 
self.imageRight = imageRight
 
end
 
end
end
 
  
function MessageBox:setMainspaceCategories()
+
-- Add mainspace categories. At the moment these are only used in {{ambox}}.
local args = self.args
+
if cfg.allowMainspaceCategories then
local cfg = self.cfg
+
if args.cat then
 
+
args.cat1 = args.cat
if not cfg.allowMainspaceCategories then
+
end
return nil
+
self.catNums = getArgNums(args, 'cat')
end
+
if args.category then
 
+
args.category1 = args.category
local nums = {}
+
end
for _, prefix in ipairs{'cat', 'category', 'all'} do
+
self.categoryNums = getArgNums(args, 'category')
args[prefix .. '1'] = args[prefix]
+
if args.all then
nums = union(nums, getArgNums(args, prefix))
+
args.all1 = args.all
end
+
end
 
+
self.allNums = getArgNums(args, 'all')
-- The following is roughly equivalent to the old {{Ambox/category}}.
+
self.categoryParamNums = union(self.catNums, self.categoryNums)
local date = args.date
+
self.categoryParamNums = union(self.categoryParamNums, self.allNums)
date = type(date) == 'string' and date
+
-- The following is roughly equivalent to the old {{Ambox/category}}.
local preposition = 'from'
+
local date = args.date
for _, num in ipairs(nums) do
+
date = type(date) == 'string' and date
local mainCat = args['cat' .. tostring(num)]
+
local preposition = 'from'
or args['category' .. tostring(num)]
+
for _, num in ipairs(self.categoryParamNums) do
local allCat = args['all' .. tostring(num)]
+
local mainCat = args['cat' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
+
or args['category' .. tostring(num)]
allCat = type(allCat) == 'string' and allCat
+
local allCat = args['all' .. tostring(num)]
if mainCat and date and date ~= '' then
+
mainCat = type(mainCat) == 'string' and mainCat
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
+
allCat = type(allCat) == 'string' and allCat
self:addCat(0, catTitle)
+
if mainCat and date and date ~= '' then
catTitle = getTitleObject('Category:' .. catTitle)
+
local catTitle = format('%s %s %s', mainCat, preposition, date)
if not catTitle or not catTitle.exists then
+
self:addCat('main', catTitle)
self:addCat(0, 'Articles with invalid date parameter in template')
+
catTitle = getTitleObject('Category:' .. catTitle)
 +
if not catTitle or not catTitle.exists then
 +
self:addCat(
 +
'main',
 +
'Articles with invalid date parameter in template'
 +
)
 +
end
 +
elseif mainCat and (not date or date == '') then
 +
self:addCat('main', mainCat)
 +
end
 +
if allCat then
 +
self:addCat('main', allCat)
 
end
 
end
elseif mainCat and (not date or date == '') then
 
self:addCat(0, mainCat)
 
end
 
if allCat then
 
self:addCat(0, allCat)
 
 
end
 
end
 
end
 
end
end
 
 
function MessageBox:setTemplateCategories()
 
local args = self.args
 
local cfg = self.cfg
 
  
-- Add template categories.
+
-- Add template-namespace categories.
 
if cfg.templateCategory then
 
if cfg.templateCategory then
 
if cfg.templateCategoryRequireName then
 
if cfg.templateCategoryRequireName then
 
if self.isTemplatePage then
 
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
+
self:addCat('template', cfg.templateCategory)
 
end
 
end
 
elseif not self.title.isSubpage then
 
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
+
self:addCat('template', cfg.templateCategory)
 
end
 
end
 
end
 
end
  
-- Add template error categories.
+
-- Add template error category.
 
if cfg.templateErrorCategory then
 
if cfg.templateErrorCategory then
 
local templateErrorCategory = cfg.templateErrorCategory
 
local templateErrorCategory = cfg.templateErrorCategory
Line 400: Line 468:
 
end
 
end
 
end
 
end
self:addCat(10, templateCat, templateSort)
+
self:addCat('template', templateCat, templateSort)
 
end
 
end
end
 
  
function MessageBox:setAllNamespaceCategories()
+
-- Categories for all namespaces.
-- Set categories for all namespaces.
+
 
if self.invalidTypeError then
 
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
+
local allSort = (self.nsid == 0 and 'Main:' or '') .. self.title.prefixedText
 
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
 
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
 
end
 
end
Line 413: Line 479:
 
self:addCat('all', 'Pages with incorrectly substituted templates')
 
self:addCat('all', 'Pages with incorrectly substituted templates')
 
end
 
end
end
 
 
function MessageBox:setCategories()
 
if self.title.namespace == 0 then
 
self:setMainspaceCategories()
 
elseif self.title.namespace == 10 then
 
self:setTemplateCategories()
 
end
 
self:setAllNamespaceCategories()
 
end
 
  
function MessageBox:renderCategories()
 
 
-- Convert category tables to strings and pass them through
 
-- Convert category tables to strings and pass them through
 
-- [[Module:Category handler]].
 
-- [[Module:Category handler]].
return categoryHandler{
+
self.categories = categoryHandler{
main = table.concat(self.categories[0] or {}),
+
main = tconcat(self.mainCats or {}),
template = table.concat(self.categories[10] or {}),
+
template = tconcat(self.templateCats or {}),
all = table.concat(self.categories.all or {}),
+
all = tconcat(self.allCats or {}),
nocat = self.args.nocat,
+
nocat = args.nocat,
page = self.args.page
+
demospace = self.demospace,
 +
page = self.pageTitle and self.pageTitle.prefixedText or nil
 
}
 
}
 
end
 
end
  
function MessageBox:export()
+
function box:export()
local root = mw.html.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
root:tag('b')
+
root
:addClass('error')
+
.tag('b')
:wikitext(string.format(
+
.addClass('error')
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
+
.wikitext(format(
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
+
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
))
+
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
 +
))
 
end
 
end
  
 
-- Create the box table.
 
-- Create the box table.
local boxTable = root:tag('table')
+
local boxTable = root.tag('table')
boxTable:attr('id', self.id or nil)
+
boxTable
 +
.attr('id', self.id)
 
for i, class in ipairs(self.classes or {}) do
 
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
+
boxTable
 +
.addClass(class)
 
end
 
end
 
boxTable
 
boxTable
:cssText(self.style or nil)
+
.cssText(self.style)
:attr('role', 'presentation')
+
.attr('role', 'presentation')
 
+
for attr, val in pairs(self.attrs or {}) do
if self.attrs then
+
boxTable
boxTable:attr(self.attrs)
+
.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')
 
if self.imageLeft then
 
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
+
local imageLeftCell = row.tag('td').addClass('mbox-image')
 
if self.imageCellDiv then
 
if self.imageCellDiv then
 
-- If we are using a div, redefine imageLeftCell so that the image
 
-- If we are using a div, redefine imageLeftCell so that the image
Line 472: Line 531:
 
-- image width to 52px. If any images in a div are wider than that,
 
-- image width to 52px. If any images in a div are wider than that,
 
-- they may overlap with the text or cause other display problems.
 
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
+
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')  
 
end
 
end
imageLeftCell:wikitext(self.imageLeft or nil)
+
imageLeftCell
 +
.wikitext(self.imageLeft)
 
elseif self.imageEmptyCell then
 
elseif self.imageEmptyCell then
 
-- Some message boxes define an empty cell if no image is specified, and
 
-- Some message boxes define an empty cell if no image is specified, and
Line 480: Line 540:
 
-- specified gives the following hint: "No image. Cell with some width
 
-- specified gives the following hint: "No image. Cell with some width
 
-- or padding necessary for text cell to have 100% width."
 
-- or padding necessary for text cell to have 100% width."
row:tag('td')
+
row.tag('td')
:addClass('mbox-empty-cell')
+
.addClass('mbox-empty-cell')  
:cssText(self.imageEmptyCellStyle or nil)
+
.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')
 
if self.useCollapsibleTextFields then
 
if self.useCollapsibleTextFields then
 
-- The message box uses advanced text parameters that allow things to be
 
-- The message box uses advanced text parameters that allow things to be
 
-- collapsible. At the moment, only ambox uses this.
 
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
+
textCell
local textCellSpan = textCell:tag('span')
+
.cssText(self.textstyle)
 +
local textCellSpan = textCell.tag('span')
 
textCellSpan
 
textCellSpan
:addClass('mbox-text-span')
+
.addClass('mbox-text-span')
:wikitext(self.issue or nil)
+
.wikitext(self.issue)
 
if not self.isSmall then
 
if not self.isSmall then
textCellSpan:tag('span')
+
textCellSpan
:addClass('hide-when-compact')
+
.tag('span')
:wikitext(self.talk and (' ' .. self.talk) or nil)
+
.addClass('hide-when-compact')
:wikitext(self.fix and (' ' .. self.fix) or nil)
+
.wikitext(self.talk and ' ' .. self.talk)
 +
.wikitext(self.fix and ' ' .. self.fix)
 
end
 
end
textCellSpan:wikitext(self.date and (' ' .. self.date) or nil)
+
textCellSpan
 +
.wikitext(self.date and ' ' .. self.date)
 
if not self.isSmall then
 
if not self.isSmall then
 
textCellSpan
 
textCellSpan
:tag('span')
+
.tag('span')
:addClass('hide-when-compact')
+
.addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
+
.wikitext(self.info and ' ' .. self.info)
 
end
 
end
 
else
 
else
 
-- Default text formatting - anything goes.
 
-- Default text formatting - anything goes.
 
textCell
 
textCell
:cssText(self.textstyle or nil)
+
.cssText(self.textstyle)
:wikitext(self.text or nil)
+
.wikitext(self.text)
 
end
 
end
  
 
-- Add the right-hand image.
 
-- Add the right-hand image.
 
if self.imageRight then
 
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
+
local imageRightCell = row.tag('td').addClass('mbox-imageright')
 
if self.imageCellDiv then
 
if self.imageCellDiv then
 
-- If we are using a div, redefine imageRightCell so that the image
 
-- If we are using a div, redefine imageRightCell so that the image
 
-- is inside it.
 
-- is inside it.
imageRightCell = imageRightCell:tag('div'):css('width', '52px')
+
imageRightCell = imageRightCell.tag('div').css('width', '52px')
 
end
 
end
 
imageRightCell
 
imageRightCell
:wikitext(self.imageRight or nil)
+
.wikitext(self.imageRight)
 
end
 
end
  
 
-- Add the below row.
 
-- Add the below row.
 
if self.below then
 
if self.below then
boxTable:tag('tr')
+
boxTable.tag('tr')
:tag('td')
+
.tag('td')
:attr('colspan', self.imageRight and '3' or '2')
+
.attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
+
.addClass('mbox-text')
:cssText(self.textstyle or nil)
+
.cssText(self.textstyle)
:wikitext(self.below or nil)
+
.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
root:tag('div')
+
root
:css('text-align', 'center')
+
.tag('div')
:wikitext(string.format(
+
.css('text-align', 'center')
'This message box is using an invalid "type=%s" parameter and needs fixing.',
+
.wikitext(format(
self.type or ''
+
'This message box is using an invalid "type=%s" parameter and needs fixing.',
))
+
self.type or ''
 +
))
 
end
 
end
  
 
-- Add categories.
 
-- Add categories.
root:wikitext(self:renderCategories() or nil)
+
root
 +
.wikitext(self.categories)
  
 
return tostring(root)
 
return tostring(root)
 
end
 
end
  
--------------------------------------------------------------------------------
+
local function main(boxType, args)
-- Exports
+
local outputBox = box.new()
--------------------------------------------------------------------------------
+
outputBox:setTitle(args)
 
+
local cfg = outputBox:getConfig(boxType)
local p, mt = {}, {}
+
args = outputBox:removeBlankArgs(cfg, args)
 
+
outputBox:setBoxParameters(cfg, args)
function p._exportClasses()
+
return outputBox:export()
-- For testing.
+
return {
+
MessageBox = MessageBox
+
}
+
 
end
 
end
  
function p.main(boxType, args, cfgTables)
+
local function makeWrapper(boxType)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData('Module:Message box/configuration'))
+
box:setParameters()
+
box:setCategories()
+
return box:export()
+
end
+
 
+
function mt.__index(t, k)
+
 
return function (frame)
 
return function (frame)
if not getArgs then
+
local args = getArgs(frame, {trim = false, removeBlanks = false})
getArgs = require('Module:Arguments').getArgs
+
return main(boxType, args)
end
+
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
+
 
end
 
end
 
end
 
end
  
return setmetatable(p, mt)
+
local p = {
 +
main = main,
 +
mbox = makeWrapper('mbox')
 +
}
 +
 
 +
for boxType in pairs(cfgTables) do
 +
p[boxType] = makeWrapper(boxType)
 +
end
 +
 
 +
return p
 

Please note that all contributions to The Crowdsourced Resource-Based Economy Knowledgebase are considered to be released under the Creative Commons Zero (Public Domain) (see RBEMWiki:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!

Cancel | Editing help (opens in new window)
Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox
Share