Module:Message box: Difference between revisions

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.
(spread comment over two lines, as modules do not wrap lines)
(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.)
Line 1:
-- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}},
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
 
-- Require necessary modules.
Line 122:
nsVals[i] = format('"%s"', val)
end
error(
error( 'invalid ns parameter passed to box:addCat; valid values are ' .. mw.text.listToText(nsVals, nil, ' or '))
.. mw.text.listToText(nsVals, nil, ' or ')
)
end
self[tname] = self[tname] or {}
Line 136 ⟶ 139:
self.classes = self.classes or {}
tinsert(self.classes, class)
end
 
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
 
Line 158 ⟶ 167:
end
tinsert(boxTypes, '"mbox"')
error(format(
error(format( 'invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
tostring(boxType),
mw.text.listToText(boxTypes)
), 2)
end
return cfg
Line 164 ⟶ 177:
 
function box:removeBlankArgs(cfg, args)
-- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
-- cfg.allowBlankParams.
local newArgs = {}
for k, v in pairs(args) do
Line 181 ⟶ 195:
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
and self.type
and not typeData
and true
or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
Line 206 ⟶ 224:
self.id = args.id
end
self:addClass(
self:addClass( cfg.usePlainlinksParam and yesno(args.plainlinks or true) and 'plainlinks')
)
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
Line 212 ⟶ 232:
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
if yesno(args.hidden) then
self:addClass('infobox editsection')
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,
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory and cfg.templateCategoryRequireName are set.
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields or cfg.templateCategory and cfg.templateCategoryRequireName then
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
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) or false
and (mw.title.equals(self.templateTitletitle, self.title) or self.title:isSubpageOf(self.templateTitle))
or false
end
 
-- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
Line 261 ⟶ 289:
-- Get the self.talk value.
local talk = args.talk
if talk == '' -- Show talk links on the template page or template subpages if the talk parameter is blank.
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
and (mw.title.equals(self.templateTitle, self.title) or self.title:isSubpageOf(self.templateTitle))
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
Line 270 ⟶ 303:
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,
-- assume that it's a section heading, and make a link to the talk page of the current page with that section heading.
-- 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)
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 = format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
self.talk = talkText
Line 303 ⟶ 350:
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
Line 328 ⟶ 375:
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall and (cfg.imageSmallSize or '30x30px') or '40x40px'
and (cfg.imageSmallSize or '30x30px')
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
or '40x40px'
self.imageLeft = format('[[File:%s|%s|link=|alt=]]', self.typeImage or 'Imbox notice.png', imageSize)
or 'Imbox notice.png', imageSize)
end
end
Line 360 ⟶ 410:
local preposition = 'from'
for _, num in ipairs(self.categoryParamNums) do
local mainCat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
Line 369 ⟶ 420:
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat('main', 'Articles with invalid date parameter in template')
'main',
'Articles with invalid date parameter in template'
)
end
elseif mainCat and (not date or date == '') then
Line 426 ⟶ 480:
end
 
-- Convert category tables to strings and pass them through [[Module:Category handler]].
-- [[Module:Category handler]].
self.categories = categoryHandler{
main = tconcat(self.mainCats or {}),
Line 462 ⟶ 517:
.cssText(self.style)
.attr('role', 'presentation')
for attr, val in pairs(self.attrs or {}) do
boxTable
.attr(attr, val)
end
 
-- Add the left-hand image.
Line 468 ⟶ 527:
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.
-- is inside it. Divs use style="width: 52px;", which limits the image width to 52px. If any
-- image width to 52px. If any images in a div are wider than that, they may overlap with the text or cause
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell.tag('div').css('width', '52px')
end
Line 477 ⟶ 536:
.wikitext(self.imageLeft)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and some don't.
-- some don't. The old template code in templates where empty cells are specified gives the following hint:
-- 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')
.addClass('mbox-empty-cell')
Line 488 ⟶ 548:
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
-- collapsible. At the moment, only ambox uses this.
textCell
.cssText(self.textstyle)
Line 522 ⟶ 582:
local imageRightCell = row.tag('td').addClass('mbox-imageright')
if self.imageCellDiv then
imageRightCell = imageRightCell.tag('div').css('width', '52px') -- 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')
end
imageRightCell
Line 543 ⟶ 605:
.tag('div')
.css('text-align', 'center')
.wikitext(format(
.wikitext(format( 'This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
self.type or ''
))
end
 
Anonymous user