Module:Message box: Difference between revisions
Content added Content deleted
m (1 revision imported from wikipedia:Module:Message_box: nihongo update) |
(Use SVG per edit request) |
||
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 59: | Line 67: | ||
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 74: | Line 84: | ||
-- 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 139: | Line 157: | ||
return nil |
return nil |
||
end |
end |
||
self.classes[class] = 1 |
|||
end |
|||
function MessageBox:removeClass(class) |
|||
if not class then |
|||
return nil |
|||
end |
|||
self.classes[class] = nil |
|||
end |
end |
||
Line 168: | Line 193: | ||
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 |
||
local plainlinks = yesno(args.plainlinks) |
|||
if plainlinks == true then |
|||
self:addClass('plainlinks') |
self:addClass('plainlinks') |
||
elseif plainlinks == false then |
|||
end |
|||
self:removeClass('plainlinks') |
|||
for _, class in ipairs(cfg.classes or {}) do |
|||
self:addClass(class) |
|||
end |
end |
||
if self.isSmall then |
if self.isSmall then |
||
Line 261: | Line 289: | ||
end |
end |
||
if talkTitle and talkTitle.exists then |
if talkTitle and talkTitle.exists then |
||
local talkText = 'Relevant discussion may be found on' |
|||
local talkText |
|||
if talkArgIsTalkPage then |
|||
if self.isSmall then |
|||
talkText = string.format( |
|||
local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk) |
|||
'%s [[%s|%s]].', |
|||
talkText = string.format('([[%s|talk]])', talkLink) |
|||
talkText, |
|||
else |
|||
talk, |
|||
talkText = 'Relevant discussion may be found on' |
|||
talkTitle.prefixedText |
|||
if talkArgIsTalkPage then |
|||
) |
|||
talkText = string.format( |
|||
else |
|||
'%s [[%s|%s]].', |
|||
talkText = string.format( |
|||
talkText, |
|||
'%s the [[%s#%s|talk page]].', |
|||
talk, |
|||
talkText, |
|||
talkTitle.prefixedText |
|||
talkTitle.prefixedText, |
|||
) |
|||
talk |
|||
else |
|||
) |
|||
talkText = string.format( |
|||
end |
|||
'%s the [[%s#%s|talk page]].', |
|||
talkText, |
|||
talkTitle.prefixedText, |
|||
talk |
|||
) |
|||
end |
|||
end |
|||
self.talk = talkText |
self.talk = talkText |
||
end |
end |
||
Line 296: | Line 318: | ||
end |
end |
||
if date then |
if date then |
||
self.date = string.format(" < |
self.date = string.format(" <small class='date-container'>''(<span class='date'>%s</span>)''</small>", date) |
||
end |
end |
||
self.info = args.info |
self.info = args.info |
||
Line 318: | Line 340: | ||
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 330: | Line 355: | ||
or '40x40px' |
or '40x40px' |
||
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage |
self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage |
||
or ' |
or 'Information icon4.svg', imageSize) |
||
end |
end |
||
end |
end |
||
Line 339: | Line 364: | ||
self.imageRight = imageRight |
self.imageRight = imageRight |
||
end |
end |
||
-- set templatestyles |
|||
self.base_templatestyles = cfg.templatestyles |
|||
self.templatestyles = args.templatestyles |
|||
end |
end |
||
Line 429: | Line 450: | ||
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 478: | Line 495: | ||
end |
end |
||
-- Add TemplateStyles |
|||
local frame = mw.getCurrentFrame() |
|||
root:wikitext( |
root:wikitext(mw.getCurrentFrame():extensionTag{ |
||
name = 'templatestyles', |
name = 'templatestyles', |
||
args = { src = self. |
args = { src = TEMPLATE_STYLES:format(self.boxType) }, |
||
}) |
}) |
||
-- 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 |
||
-- 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 class, _ in pairs(self.classes or {}) do |
||
boxTable:addClass(class or nil) |
boxTable:addClass(class or nil) |
||
end |
end |
||
Line 516: | Line 535: | ||
-- 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'):css('width', '52px') |
||
end |
end |
||
imageLeftCell:wikitext(self.imageLeft or nil) |
imageLeftCell:wikitext(self.imageLeft or nil) |
||
Line 526: | Line 545: | ||
row:tag('td') |
row:tag('td') |
||
:addClass('mbox-empty-cell') |
:addClass('mbox-empty-cell') |
||
:cssText(self.imageEmptyCellStyle or nil) |
|||
end |
end |
||
Line 538: | Line 558: | ||
:addClass('mbox-text-span') |
:addClass('mbox-text-span') |
||
:wikitext(self.issue or nil) |
:wikitext(self.issue or nil) |
||
if (self.talk or self.fix) then |
if (self.talk or self.fix) and not self.isSmall then |
||
textCellDiv:tag('span') |
textCellDiv:tag('span') |
||
:addClass('hide-when-compact') |
:addClass('hide-when-compact') |
||
Line 552: | Line 572: | ||
end |
end |
||
if self.removalNotice then |
if self.removalNotice then |
||
textCellDiv:tag(' |
textCellDiv:tag('small') |
||
:addClass('hide-when-compact') |
:addClass('hide-when-compact') |
||
:tag('i') |
:tag('i') |
||
Line 570: | Line 590: | ||
-- 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'):css('width', '52px') |
||
end |
end |
||
imageRightCell |
imageRightCell |
||
Line 589: | Line 609: | ||
if self.invalidTypeError then |
if self.invalidTypeError then |
||
root:tag('div') |
root:tag('div') |
||
: |
:css('text-align', 'center') |
||
: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.', |