Module:Message box: Difference between revisions
Content added Content deleted
(Use SVG per edit request) |
(File:Cscr-featured.svg needs a link to the description page for license and attribution. Add the ability for the configuration to specify a flag to accomplish this.) |
||
Line 1: | Line 1: | ||
-- This is a meta-module for producing message box templates, including |
|||
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. |
|||
-- Load necessary modules. |
|||
require('strict') |
require('strict') |
||
local getArgs |
local getArgs |
||
local yesno = require('Module:Yesno') |
local yesno = require('Module:Yesno') |
||
-- Get a language object for formatDate and ucfirst. |
|||
local lang = mw.language.getContentLanguage() |
local lang = mw.language.getContentLanguage() |
||
-- Define constants |
|||
local CONFIG_MODULE = 'Module:Message box/configuration' |
local CONFIG_MODULE = 'Module:Message box/configuration' |
||
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} |
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} |
||
local TEMPLATE_STYLES = 'Module:Message box/%s.css' |
|||
-------------------------------------------------------------------------------- |
-------------------------------------------------------------------------------- |
||
Line 67: | Line 59: | ||
args = args or {} |
args = args or {} |
||
local obj = {} |
local obj = {} |
||
obj.boxType = boxType |
|||
-- Set the title object and the namespace. |
-- Set the title object and the namespace. |
||
Line 84: | Line 74: | ||
-- use template from DEMOSPACES |
-- use template from DEMOSPACES |
||
obj.cfg = cfg[DEMOSPACES[demospace]] |
obj.cfg = cfg[DEMOSPACES[demospace]] |
||
obj.boxType = DEMOSPACES[demospace] |
|||
elseif string.find( demospace, 'talk' ) then |
elseif string.find( demospace, 'talk' ) then |
||
-- demo as a talk page |
-- demo as a talk page |
||
obj.cfg = cfg.tmbox |
obj.cfg = cfg.tmbox |
||
obj.boxType = 'tmbox' |
|||
else |
else |
||
-- default to ombox |
-- default to ombox |
||
obj.cfg = cfg.ombox |
obj.cfg = cfg.ombox |
||
obj.boxType = 'ombox' |
|||
end |
end |
||
elseif ns == 0 then |
elseif ns == 0 then |
||
obj.cfg = cfg.ambox -- main namespace |
obj.cfg = cfg.ambox -- main namespace |
||
obj.boxType = 'ambox' |
|||
elseif ns == 6 then |
elseif ns == 6 then |
||
obj.cfg = cfg.imbox -- file namespace |
obj.cfg = cfg.imbox -- file namespace |
||
obj.boxType = 'imbox' |
|||
elseif ns == 14 then |
elseif ns == 14 then |
||
obj.cfg = cfg.cmbox -- category namespace |
obj.cfg = cfg.cmbox -- category namespace |
||
obj.boxType = 'cmbox' |
|||
else |
else |
||
local nsTable = mw.site.namespaces[ns] |
local nsTable = mw.site.namespaces[ns] |
||
if nsTable and nsTable.isTalk then |
if nsTable and nsTable.isTalk then |
||
obj.cfg = cfg.tmbox -- any talk namespace |
obj.cfg = cfg.tmbox -- any talk namespace |
||
obj.boxType = 'tmbox' |
|||
else |
else |
||
obj.cfg = cfg.ombox -- other namespaces or invalid input |
obj.cfg = cfg.ombox -- other namespaces or invalid input |
||
obj.boxType = 'ombox' |
|||
end |
end |
||
end |
end |
||
Line 157: | Line 139: | ||
return nil |
return nil |
||
end |
end |
||
self.classes |
table.insert(self.classes, class) |
||
end |
|||
function MessageBox:removeClass(class) |
|||
if not class then |
|||
return nil |
|||
end |
|||
self.classes[class] = nil |
|||
end |
end |
||
Line 180: | Line 155: | ||
self.typeClass = typeData.class |
self.typeClass = typeData.class |
||
self.typeImage = typeData.image |
self.typeImage = typeData.image |
||
self.typeImageNeedsLink = typeData.imageNeedsLink |
|||
-- Find if the box has been wrongly substituted. |
-- Find if the box has been wrongly substituted. |
||
Line 193: | Line 169: | ||
self.id = args.id |
self.id = args.id |
||
self.name = args.name |
self.name = args.name |
||
for _, class in ipairs(cfg.classes or {}) do |
|||
self:addClass(class) |
|||
end |
|||
if self.name then |
if self.name then |
||
self:addClass('box-' .. string.gsub(self.name,' ','_')) |
self:addClass('box-' .. string.gsub(self.name,' ','_')) |
||
end |
end |
||
if yesno(args.plainlinks) ~= false then |
|||
if plainlinks == true then |
|||
self:addClass('plainlinks') |
self:addClass('plainlinks') |
||
end |
|||
elseif plainlinks == false then |
|||
for _, class in ipairs(cfg.classes or {}) do |
|||
self:removeClass('plainlinks') |
|||
self:addClass(class) |
|||
end |
end |
||
if self.isSmall then |
if self.isSmall then |
||
Line 289: | Line 262: | ||
end |
end |
||
if talkTitle and talkTitle.exists then |
if talkTitle and talkTitle.exists then |
||
local talkText |
|||
local talkText = 'Relevant discussion may be found on' |
|||
if self.isSmall then |
|||
if talkArgIsTalkPage then |
|||
local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk) |
|||
talkText = string.format( |
|||
talkText = string.format('([[%s|talk]])', talkLink) |
|||
'%s [[%s|%s]].', |
|||
else |
|||
talkText, |
|||
talkText = 'Relevant discussion may be found on' |
|||
talk, |
|||
if talkArgIsTalkPage then |
|||
talkTitle.prefixedText |
|||
talkText = string.format( |
|||
) |
|||
'%s [[%s|%s]].', |
|||
else |
|||
talkText, |
|||
talkText = string.format( |
|||
talk, |
|||
'%s the [[%s#%s|talk page]].', |
|||
talkTitle.prefixedText |
|||
talkText, |
|||
) |
|||
talkTitle.prefixedText, |
|||
else |
|||
talk |
|||
talkText = string.format( |
|||
) |
|||
'%s the [[%s#%s|talk page]].', |
|||
end |
|||
talkText, |
|||
talkTitle.prefixedText, |
|||
talk |
|||
) |
|||
end |
|||
end |
|||
self.talk = talkText |
self.talk = talkText |
||
end |
end |
||
Line 318: | Line 297: | ||
end |
end |
||
if date then |
if date then |
||
self.date = string.format(" < |
self.date = string.format(" <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>", date) |
||
end |
end |
||
self.info = args.info |
self.info = args.info |
||
Line 340: | Line 319: | ||
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv |
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv |
||
self.imageEmptyCell = cfg.imageEmptyCell |
self.imageEmptyCell = cfg.imageEmptyCell |
||
if cfg.imageEmptyCellStyle then |
|||
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' |
|||
end |
|||
-- Left image settings. |
-- Left image settings. |
||
Line 354: | Line 330: | ||
and (cfg.imageSmallSize or '30x30px') |
and (cfg.imageSmallSize or '30x30px') |
||
or '40x40px' |
or '40x40px' |
||
self.imageLeft = string.format('[[File:%s|%s |
self.imageLeft = string.format('[[File:%s|%s%s|alt=]]', self.typeImage |
||
or 'Information icon4.svg', imageSize) |
or 'Information icon4.svg', imageSize, self.typeImageNeedsLink and "" or "|link=" ) |
||
end |
end |
||
end |
end |
||
Line 364: | Line 340: | ||
self.imageRight = imageRight |
self.imageRight = imageRight |
||
end |
end |
||
-- set templatestyles |
|||
self.base_templatestyles = cfg.templatestyles |
|||
self.templatestyles = args.templatestyles |
|||
end |
end |
||
Line 450: | Line 430: | ||
function MessageBox:setAllNamespaceCategories() |
function MessageBox:setAllNamespaceCategories() |
||
-- Set categories for all namespaces. |
-- Set categories for all namespaces. |
||
if self.invalidTypeError then |
|||
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText |
|||
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort) |
|||
end |
|||
if self.isSubstituted then |
if self.isSubstituted then |
||
self:addCat('all', 'Pages with incorrectly substituted templates') |
self:addCat('all', 'Pages with incorrectly substituted templates') |
||
Line 495: | Line 479: | ||
end |
end |
||
local frame = mw.getCurrentFrame() |
|||
-- Add TemplateStyles |
|||
root:wikitext( |
root:wikitext(frame:extensionTag{ |
||
name = 'templatestyles', |
name = 'templatestyles', |
||
args = { src = |
args = { src = self.base_templatestyles }, |
||
}) |
}) |
||
-- Add support for a single custom templatestyles sheet. Undocumented as |
|||
-- need should be limited and many templates using mbox are substed; we |
|||
-- don't want to spread templatestyles sheets around to arbitrary places |
|||
if self.templatestyles then |
|||
root:wikitext(frame:extensionTag{ |
|||
name = 'templatestyles', |
|||
args = { src = self.templatestyles }, |
|||
}) |
|||
end |
|||
-- Create the box table. |
-- Create the box table. |
||
local boxTable |
local boxTable = root:tag('table') |
||
-- Check for fmbox because not all interface messages have mw-parser-output |
|||
-- which is necessary for TemplateStyles. Add the wrapper class if it is and |
|||
-- then start the actual mbox, else start the mbox. |
|||
if self.boxType == 'fmbox' then |
|||
boxTable = root:tag('div') |
|||
:addClass('mw-parser-output') |
|||
:tag('table') |
|||
else |
|||
boxTable = root:tag('table') |
|||
end |
|||
boxTable:attr('id', self.id or nil) |
boxTable:attr('id', self.id or nil) |
||
for |
for i, class in ipairs(self.classes or {}) do |
||
boxTable:addClass(class or nil) |
boxTable:addClass(class or nil) |
||
end |
end |
||
Line 535: | Line 517: | ||
-- 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'): |
imageLeftCell = imageLeftCell:tag('div'):addClass('mbox-image-div') |
||
end |
end |
||
imageLeftCell:wikitext(self.imageLeft or nil) |
imageLeftCell:wikitext(self.imageLeft or nil) |
||
Line 545: | Line 527: | ||
row:tag('td') |
row:tag('td') |
||
:addClass('mbox-empty-cell') |
:addClass('mbox-empty-cell') |
||
:cssText(self.imageEmptyCellStyle or nil) |
|||
end |
end |
||
Line 558: | Line 539: | ||
:addClass('mbox-text-span') |
:addClass('mbox-text-span') |
||
:wikitext(self.issue or nil) |
:wikitext(self.issue or nil) |
||
if (self.talk or self.fix) |
if (self.talk or self.fix) then |
||
textCellDiv:tag('span') |
textCellDiv:tag('span') |
||
:addClass('hide-when-compact') |
:addClass('hide-when-compact') |
||
Line 572: | Line 553: | ||
end |
end |
||
if self.removalNotice then |
if self.removalNotice then |
||
textCellDiv:tag(' |
textCellDiv:tag('span') |
||
:addClass('hide-when-compact') |
:addClass('hide-when-compact') |
||
:tag('i') |
:tag('i') |
||
Line 590: | Line 571: | ||
-- 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'): |
imageRightCell = imageRightCell:tag('div'):addClass('mbox-image-div') |
||
end |
end |
||
imageRightCell |
imageRightCell |
||
Line 609: | Line 590: | ||
if self.invalidTypeError then |
if self.invalidTypeError then |
||
root:tag('div') |
root:tag('div') |
||
: |
:addClass('mbox-invalid-type') |
||
:wikitext(string.format( |
:wikitext(string.format( |
||
'This message box is using an invalid "type=%s" parameter and needs fixing.', |
'This message box is using an invalid "type=%s" parameter and needs fixing.', |