„Modul:Message box” változatai közötti eltérés – Wikiforrás


Article Images

1. sor:

-- This is a meta-module for producing message box templates, including
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.

-- RequireLoad necessary modules.

local htmlBuilder = require('Module:HtmlBuilderstrict')

local getArgs

local categoryHandler = require('Module:Category handler').main

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.

local lang = mw.language.getContentLanguage()

-- Define constants

-- Set aliases for often-used functions to reduce table lookups.

local CONFIG_MODULE = 'Module:Message box/configuration'

local format = mw.ustring.format

local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}

local tinsert = table.insert

local tconcat = table.concat

local trim = mw.text.trim

--------------------------------------------------------------------------------

local box = {}

-- Helper functions

--------------------------------------------------------------------------------

local function getTitleObject(page...)

-- Get the title object, passing the function through pcall

if type(page) == 'string' then

-- Getin thecase titlewe object,are passingover the expensive function through pcallcount limit.

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

end

return title

end

end

end

local function union(t1, t2)

-- Returns the union of two arrays.

local vals = {}

for i, v in ipairs(t1) do

vals[v] = true

end

for i, v in ipairs(t2) do

vals[v] = true

end

local ret = {}

for k in pairs(vals) do

tinsert table.insert(ret, k)

end

table.sort(ret)

return ret

end

local function getArgNums(args, prefix)

local nums = {}

for k, v in pairs(args) do

local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')

if num then

tinsert table.insert(nums, tonumber(num))

end

end

table.sort(nums)

return nums

end

--------------------------------------------------------------------------------

function box.getNamespaceId(ns)

-- Box class definition

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

local MessageBox = {}

function box.getMboxType(nsid)

MessageBox.__index = MessageBox

-- Gets the mbox type from a namespace number.

if nsid == 0 then

return 'ambox' -- main namespace

elseif nsid == 6 then

return 'imbox' -- file namespace

elseif nsid == 14 then

return 'cmbox' -- category namespace

else

local nsTable = mw.site.namespaces[nsid]

if nsTable and nsTable.isTalk then

return 'tmbox' -- any talk namespace

else

return 'ombox' -- other namespaces or invalid input

end

end

end

function box:addCatMessageBox.new(nsboxType, catargs, sortcfg)

args = args or {}

if type(cat) ~= 'string' then return end

local nsValsobj = {'main', 'template', 'all'}

local tname

-- Set the title object and the namespace.

for i, val in ipairs(nsVals) do

obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()

if ns == val then

tname = ns .. 'Cats'

-- Set the config for our box type.

end

obj.cfg = cfg[boxType]

end

if not tnameobj.cfg then

local ns = obj.title.namespace

for i, val in ipairs(nsVals) do

-- boxType is "mbox" or invalid input

nsVals[i] = format('"%s"', val)

if args.demospace and args.demospace ~= '' then

end

-- implement demospace parameter of mbox

error('invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))

local demospace = string.lower(args.demospace)

end

if DEMOSPACES[demospace] then

self[tname] = self[tname] or {}

-- use template from DEMOSPACES

if type(sort) == 'string' then

obj.cfg = cfg[DEMOSPACES[demospace]]

tinsert(self[tname], format('[[Category:%s|%s]]', cat, sort))

elseif string.find( demospace, 'talk' ) then

else

-- demo as a talk page

tinsert(self[tname], format('[[Category:%s]]', cat))

obj.cfg = cfg.tmbox

end

else

end

-- default to ombox

obj.cfg = cfg.ombox

end

elseif ns == 0 then

obj.cfg = cfg.ambox -- main namespace

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

-- 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.

obj.categories = {}

obj.classes = {}

-- For lazy loading of [[Module:Category handler]].

obj.hasCategories = false

return setmetatable(obj, MessageBox)

function box:addClass(class)

if type(class) ~= 'string' then return end

self.classes = self.classes or {}

tinsert(self.classes, class)

end

function boxMessageBox:setTitleaddCat(argsns, cat, sort)

if not cat then

-- Get the title object and the namespace.

return nil

self.pageTitle = getTitleObject(args.page ~= '' and args.page)

end

self.title = self.pageTitle or mw.title.getCurrentTitle()

if sort then

self.demospace = args.demospace ~= '' and args.demospace or nil

cat = string.format('[[Category:%s|%s]]', cat, sort)

self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace

else

cat = string.format('[[Category:%s]]', cat)

end

self.hasCategories = true

self.categories[ns] = self.categories[ns] or {}

table.insert(self.categories[ns], cat)

end

function boxMessageBox:getConfigaddClass(boxTypeclass)

if not class then

-- Get the box config data from the data page.

return nil

if boxType == 'mbox' then

end

boxType = box.getMboxType(self.nsid)

table.insert(self.classes, class)

end

local cfg = cfgTables[boxType]

if not cfg then

local boxTypes = {}

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

return cfg

end

function box:removeBlankArgs(cfg, args)

-- Only allow blank arguments for the parameter names listed in 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

return newArgs

end

function boxMessageBox:setBoxParameterssetParameters(cfg, args)

local args = self.args

-- Get type data.

local cfg = self.type = args.typecfg

local typeData = cfg.types[self.type]

self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false

typeData = typeData or cfg.types[cfg.default]

self.typeClass = typeData.class

self.typeImage = typeData.image

-- Get type data.

-- Find if the box has been wrongly substituted.

self.type = args.type

if cfg.substCheck and args.subst == 'SUBST' then

local typeData = cfg.types[self.type]

self.isSubstituted = true

self.invalidTypeError = cfg.showInvalidTypeError

end

and self.type

and not typeData

typeData = typeData or cfg.types[cfg.default]

self.typeClass = typeData.class

self.typeImage = typeData.image

-- Find whetherif wethe arebox usinghas abeen smallwrongly message boxsubstituted.

self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'

if cfg.allowSmall and (

cfg.smallParam and args.small == cfg.smallParam

or not cfg.smallParam and yesno(args.small)

)

then

self.isSmall = true

else

self.isSmall = false

end

-- Find whether we are using a small message box.

-- Add attributes, classes and styles.

self.isSmall = cfg.allowSmall and (

if cfg.useId then

cfg.smallParam and args.small == cfg.smallParam

self.id = args.id

or not cfg.smallParam and yesno(args.small)

end

)

self:addClass(cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')

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

-- Add attributes, classes and styles.

-- Set text style.

self.textstyleid = args.textstyleid

self.name = args.name

if self.name then

self:addClass('box-' .. string.gsub(self.name,' ','_'))

end

if yesno(args.plainlinks) ~= false then

self:addClass('plainlinks')

end

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.

-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.

self.textstyle = args.textstyle

self.useCollapsibleTextFields = cfg.useCollapsibleTextFields

if self.useCollapsibleTextFields then

self.name = args.name

local nameTitle = getTitleObject(self.name)

self.isTemplatePage = nameTitle and self.title.prefixedText == ('Template:' .. nameTitle.text) and true or false

-- Find if we are on the template page or not. This functionality is only

-- Get the self.issue value.

-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory

if self.isSmall and args.smalltext then

-- and cfg.templateCategoryRequireName are set.

self.issue = args.smalltext

self.useCollapsibleTextFields = cfg.useCollapsibleTextFields

else

if self.useCollapsibleTextFields

local sect

or cfg.templateCategory

if args.sect == '' then

and cfg.templateCategoryRequireName

sect = 'This ' .. (cfg.sectionDefault or 'page')

then

elseif type(args.sect) == 'string' then

if self.name then

sect = 'This ' .. args.sect

local templateName = mw.ustring.match(

end

self.name,

local issue = args.issue

'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'

issue = type(issue) == 'string' and issue or nil

) or self.name

local text = args.text

templateName = 'Template:' .. templateName

text = type(text) == 'string' and text or nil

self.templateTitle = getTitleObject(templateName)

local issues = {}

end

tinsert(issues, sect)

self.isTemplatePage = self.templateTitle

tinsert(issues, issue)

and mw.title.equals(self.title, self.templateTitle)

tinsert(issues, text)

end

self.issue = tconcat(issues, ' ')

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

if talk == '' and self.isTemplatePage then

-- parameter is blank.

talk = '#'

if talk == ''

end

and self.templateTitle

if talk then

and (

-- See if the talk link exists and is for a talk or a content namespace.

mw.title.equals(self.templateTitle, self.title)

local talkTitle = getTitleObject(talk)

or self.title:isSubpageOf(self.templateTitle)

if not talkTitle or not talkTitle.isTalkPage then

)

-- If we couldn't process the talk page link, get the talk page of the current page.

then

local success

talk = '#'

success, talkTitle = pcall(self.title.talkPageTitle, self.title)

elseif talk == '' then

if not success then

talk = nil

talkTitle = nil

end

end

if talk then

end

-- If the talk value is a talk page, make a link to that page. Else

if talkTitle and talkTitle.exists then

-- assume that it's a section heading, and make a link to the talk

local talkText = 'Relevant discussion may be found on'

-- page of the current page with that section heading.

if talkTitle.isTalkPage then

local talkTitle = getTitleObject(talk)

talkText = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)

local talkArgIsTalkPage = true

else

if not talkTitle or not talkTitle.isTalkPage then

talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)

talkArgIsTalkPage = false

end

talkTitle = getTitleObject(

self.talk = talkText

self.title.text,

end

mw.site.namespaces[self.title.namespace].talk.id

end

)

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 = selfargs.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 class='date-container'>''(<span class='date'>%s</span>)''</small>", date)

end

self.info = args.info

if yesno(args.removalnotice) then

end

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,

-- 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 and true or false

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 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

end

self.catNums = getArgNums(args, 'cat')

if args.category then

args.category1 = args.category

end

self.categoryNums = getArgNums(args, 'category')

self.categoryParamNums = union(self.catNums, self.categoryNums)

if args.all then

args.all1 = args.all

end

-- The following is roughly equivalent to the old {{Ambox/category}}.

local date = args.date

date = type(date) == 'string' and date

local preposition = 'from'

for _, num in ipairs(self.categoryParamNums) do

local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]

local allCat = args['all' .. tostring(num)]

mainCat = type(mainCat) == 'string' and mainCat

allCat = type(allCat) == 'string' and allCat

if mainCat and date then

local catTitle = format('%s %s %s', mainCat, preposition, date)

self:addCat('main', catTitle)

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 then

self:addCat('main', mainCat)

end

if allCat then

self:addCat('main', allCat)

end

end

end

if not cfg.allowMainspaceCategories then

-- Add template-namespace categories.

return nil

self.isTemplatePage = type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name)

end

if cfg.templateCategory then

if self.name then

if self.isTemplatePage then

self:addCat('template', cfg.templateCategory)

end

elseif not self.title.isSubpage then

self:addCat('template', cfg.templateCategory)

end

end

-- Add template error category.

if cfg.templateErrorCategory then

local templateErrorCategory = cfg.templateErrorCategory

local templateCat, templateSort

if not self.name and not self.title.isSubpage then

templateCat = templateErrorCategory

elseif type(self.name) == 'string' and self.title.prefixedText == ('Template:' .. self.name) 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('template', templateCat, templateSort)

end

local nums = {}

-- Categories for all namespaces.

for _, prefix in ipairs{'cat', 'category', 'all'} do

if self.invalidTypeError then

args[prefix .. '1'] = args[prefix]

local allSort = (nsid == 0 and 'Main:' or '') .. self.title.prefixedText

nums = union(nums, getArgNums(args, prefix))

self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)

end

if self.isSubstituted then

self:addCat('all', 'Pages with incorrectly substituted templates')

end

-- The following is roughly equivalent to the old {{Ambox/category}}.

-- Convert category tables to strings and pass them through [[Module:Category handler]].

local date = args.date

self.categories = categoryHandler{

date = type(date) == 'string' and date

main = tconcat(self.mainCats or {}),

local preposition = 'from'

template = tconcat(self.templateCats or {}),

for _, num in ipairs(nums) do

all = tconcat(self.allCats or {}),

local mainCat = args['cat' .. tostring(num)]

nocat = args.nocat,

or args['category' .. tostring(num)]

demospace = self.demospace,

local allCat = args['all' .. tostring(num)]

page = self.pageTitle and self.pageTitle.prefixedText or nil

mainCat = type(mainCat) == 'string' and mainCat

}

allCat = type(allCat) == 'string' and allCat

if mainCat and date and date ~= '' then

local catTitle = string.format('%s %s %s', mainCat, preposition, date)

self:addCat(0, catTitle)

catTitle = getTitleObject('Category:' .. catTitle)

if not catTitle or not catTitle.exists then

self:addCat(0, 'Articles with invalid date parameter in template')

end

elseif mainCat and (not date or date == '') then

self:addCat(0, mainCat)

end

if allCat then

self:addCat(0, allCat)

end

end

end

function boxMessageBox:exportsetTemplateCategories()

local rootargs = htmlBuilderself.create()args

local cfg = self.cfg

-- Add the subst checktemplate errorcategories.

if cfg.templateCategory then

if self.isSubstituted and self.name then

if cfg.templateCategoryRequireName then

root

if self.isTemplatePage then

.tag('b')

self:addCat(10, cfg.templateCategory)

.addClass('error')

end

.wikitext(format(

elseif not self.title.isSubpage then

'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',

self:addCat(10, cfg.templateCategory)

mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')

end

))

end

-- Add template error categories.

-- Create the box table.

if cfg.templateErrorCategory then

local boxTable = root.tag('table')

local templateErrorCategory = cfg.templateErrorCategory

boxTable

local templateCat, templateSort

.attr('id', self.id)

if not self.name and not self.title.isSubpage then

for i, class in ipairs(self.classes or {}) do

templateCat = templateErrorCategory

boxTable

elseif self.isTemplatePage then

.addClass(class)

local paramsToCheck = cfg.templateErrorParamsToCheck or {}

end

local count = 0

boxTable

for i, param in ipairs(paramsToCheck) do

.cssText(self.style)

if not args[param] then

.attr('role', 'presentation')

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 MessageBox:setAllNamespaceCategories()

-- Add the left-hand image.

-- Set categories for all namespaces.

local row = boxTable.tag('tr')

if self.imageLeftinvalidTypeError then

local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText

local imageLeftCell = row.tag('td').addClass('mbox-image')

self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)

if self.imageCellDiv then

end

-- If we are using a div, redefine imageLeftCell so that the image is inside it.

if self.isSubstituted then

-- Divs use style="width: 52px;", which limits the image width to 52px. If any

self:addCat('all', 'Pages with incorrectly substituted templates')

-- images in a div are wider than that, they may overlap with the text or cause

end

-- other display problems.

end

imageLeftCell = imageLeftCell.tag('div').css('width', '52px')

end

imageLeftCell

.wikitext(self.imageLeft)

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)

end

function MessageBox:setCategories()

-- Add the text.

if self.title.namespace == 0 then

local textCell = row.tag('td').addClass('mbox-text')

self:setMainspaceCategories()

if self.useCollapsibleTextFields then

elseif self.title.namespace == 10 then

-- The message box uses advanced text parameters that allow things to be collapsible. At the

self:setTemplateCategories()

-- moment, only ambox uses this.

end

textCell

self:setAllNamespaceCategories()

.cssText(self.textstyle)

end

local textCellSpan = textCell.tag('span')

textCellSpan

.addClass('mbox-text-span')

.wikitext(self.issue)

if not self.isSmall then

textCellSpan

.tag('span')

.addClass('hide-when-compact')

.wikitext(self.talk and ' ' .. self.talk)

.wikitext(self.fix and ' ' .. self.fix)

end

textCellSpan

.wikitext(self.date and ' ' .. self.date)

if not self.isSmall then

textCellSpan

.tag('span')

.addClass('hide-when-compact')

.wikitext(self.info and ' ' .. self.info)

end

else

-- Default text formatting - anything goes.

textCell

.cssText(self.textstyle)

.wikitext(self.text)

end

function MessageBox:renderCategories()

-- Add the right-hand image.

if ifnot self.imageRighthasCategories then

-- No categories added, no need to pass them to Category handler so,

local imageRightCell = row.tag('td').addClass('mbox-imageright')

-- if it was invoked, it would return the empty string.

if self.imageCellDiv then

-- So we shortcut and return the empty string.

imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.

return ""

end

end

imageRightCell

-- Convert category tables to strings and pass them through

.wikitext(self.imageRight)

-- [[Module:Category handler]].

end

return require('Module:Category handler')._main{

main = table.concat(self.categories[0] or {}),

template = table.concat(self.categories[10] or {}),

all = table.concat(self.categories.all or {}),

nocat = self.args.nocat,

page = self.args.page

}

end

function MessageBox:export()

-- Add the below row.

local root = mw.html.create()

if self.below then

boxTable.tag('tr')

.tag('td')

.attr('colspan', self.imageRight and '3' or '2')

.addClass('mbox-text')

.cssText(self.textstyle)

.wikitext(self.below)

end

-- Add the subst check error.

-- Add error message for invalid type parameters.

if self.isSubstituted ifand self.invalidTypeErrorname then

root:tag('b')

root

:addClass('error')

.tag('div')

:wikitext(string.format(

.css('text-align', 'center')

'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',

.wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))

mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')

end

))

end

root:wikitext(mw.getCurrentFrame():extensionTag('templatestyles', '', { src = 'Module:Message box/styles.css' }))

-- Add categories.

root

.wikitext(self.categories)

-- Create the box table.

return tostring(root)

local boxTable = root:tag('table')

end

boxTable:attr('id', self.id or nil)

for i, class in ipairs(self.classes or {}) do

boxTable:addClass(class or nil)

end

boxTable

:cssText(self.style or nil)

:attr('role', 'presentation')

if self.attrs then

local function main(boxType, args)

boxTable:attr(self.attrs)

box:setTitle(args)

end

local cfg = box:getConfig(boxType)

args = box:removeBlankArgs(cfg, args)

-- Add the left-hand image.

box:setBoxParameters(cfg, args)

local row = boxTable:tag('tr')

return box:export()

if self.imageLeft then

local imageLeftCell = row:tag('td'):addClass('mbox-image')

if self.imageCellDiv then

-- If we are using a div, redefine imageLeftCell so that the image

-- is inside it. Divs use style="width: 52px;", which limits the

-- 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.

imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')

end

imageLeftCell:wikitext(self.imageLeft or nil)

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(boxType)

-- 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.

local args = {}

for k, v in pairs(origArgs) do

if type(v) == 'string' then

v = trim(v)

end

args[k] = v

end

return main(boxType, args)

end

end

function p.main(boxType, args, cfgTables)

local p = {

local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))

main = main,

box:setParameters()

mbox = makeWrapper('mbox')

box:setCategories()

}

return box:export()

end

function mt.__index(t, k)

for boxType in pairs(cfgTables) do

return function (frame)

p[boxType] = makeWrapper(boxType)

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)