Module:Message box

-- Adapted from https://www.mediawiki.org/w/index.php?title=Module:Message_box&oldid=2059839

-- This is a meta-module for producing message box templates, including --, , , , , and.

-- Load necessary modules. require('Module:No globals') local getArgs local yesno = require('Module:Yesno')

-- Helper functions

local function getTitleObject(...) -- Get the title object, passing the function through pcall -- in case we are over the expensive function count limit. local success, title = pcall(mw.title.new, ...) if success then return title end end

-- Box class definition

local MessageBox = {} MessageBox.__index = MessageBox

function MessageBox.new(boxType, args, cfg) args = args or {} local obj = {}

-- Set the title object and the namespace. obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle

-- Set the config for our box type. obj.cfg = cfg[boxType] if not obj.cfg then local ns = obj.title.namespace -- boxType is "mbox" or invalid input if 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 obj.args = args

-- Define internal data structure. obj.categories = {} obj.classes = {}

return setmetatable(obj, MessageBox) end

function MessageBox:addClass(class) if not class then return nil end table.insert(self.classes, class) end

function MessageBox:setParameters local args = self.args local cfg = self.cfg

-- Get type data. self.type = args.type local typeData = cfg.types[self.type] self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData typeData = typeData or cfg.types[cfg.default] self.typeClass = typeData.class self.typeImage = typeData.image

-- Find whether we are using a small message box. self.isSmall = cfg.allowSmall and (		cfg.smallParam and args.small == cfg.smallParam		or not cfg.smallParam and yesno(args.small)	)

-- Add attributes, classes and styles. self.id = args.id	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 self.attrs = args.attrs

-- Set text style. self.textstyle = args.textstyle

-- Set the non-collapsible text field. At the moment this is used by all box -- 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

-- 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('', 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:export local root = mw.html.create

-- Create the box table. local boxDiv = root:tag('div') boxDiv:attr('id', self.id or nil) for i, class in ipairs(self.classes or {}) do		boxDiv:addClass(class or nil) end boxDiv :cssText(self.style or nil) :attr('role', 'presentation')

if self.attrs then boxDiv:attr(self.attrs) end

-- Add the left-hand image. if self.imageLeft then local imageLeftDiv = boxDiv:tag('div'):addClass('mbox-image') imageLeftDiv :wikitext(self.imageLeft or nil) end

-- Add the text. local textDiv = boxDiv:tag('div'):addClass('mbox-text') textDiv = textDiv:tag('div'):addClass('mbox-text-content') -- Default text formatting - anything goes. textDiv:newline :cssText(self.textstyle or nil) :wikitext(self.text or nil) :newline

-- Add the right-hand image. if self.imageRight then local imageRightDiv = boxDiv:tag('div'):addClass('mbox-imageright') imageRightDiv :wikitext(self.imageRight 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 local templateStyle = mw.getCurrentFrame:extensionTag( 'templatestyles', '', { src = 'Template:Mbox/styles.css' } );

return templateStyle .. tostring(root) end

-- Exports

local p, mt = {}, {}

function p._exportClasses -- For testing. return { MessageBox = MessageBox } end

function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData('Module:Message box/configuration')) box:setParameters return box:export end

function mt.__index(t, k)	return function (frame) 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)