Difference between revisions of "Module:Message box"
no edit summary
>Mr. Stradivarius (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: | Line 1: | ||
-- This is a meta-module for producing message box templates, including | -- This is a meta-module for producing message box templates, including | ||
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. | -- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. | ||
-- Require necessary modules. | -- Require necessary modules. | ||
local getArgs = require('Module:Arguments').getArgs | local getArgs = require('Module:Arguments').getArgs | ||
Line 7: | Line 7: | ||
local categoryHandler = require('Module:Category handler').main | local categoryHandler = require('Module:Category handler').main | ||
local yesno = require('Module:Yesno') | local yesno = require('Module:Yesno') | ||
-- Load the configuration page. | -- Load the configuration page. | ||
local cfgTables = mw.loadData('Module:Message box/configuration') | local cfgTables = mw.loadData('Module:Message box/configuration') | ||
-- Get a language object for formatDate and ucfirst. | -- Get a language object for formatDate and ucfirst. | ||
local lang = mw.language.getContentLanguage() | local lang = mw.language.getContentLanguage() | ||
-- Set aliases for often-used functions to reduce table lookups. | -- Set aliases for often-used functions to reduce table lookups. | ||
local format = mw.ustring.format | local format = mw.ustring.format | ||
Line 19: | Line 19: | ||
local tconcat = table.concat | local tconcat = table.concat | ||
local trim = mw.text.trim | local trim = mw.text.trim | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
-- Helper functions | -- Helper functions | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
local function getTitleObject(page, ...) | local function getTitleObject(page, ...) | ||
if type(page) == 'string' then | if type(page) == 'string' then | ||
Line 34: | Line 34: | ||
end | end | ||
end | end | ||
local function union(t1, t2) | local function union(t1, t2) | ||
-- Returns the union of two arrays. | -- Returns the union of two arrays. | ||
Line 51: | Line 51: | ||
return ret | return ret | ||
end | end | ||
local function getArgNums(args, prefix) | local function getArgNums(args, prefix) | ||
local nums = {} | local nums = {} | ||
Line 63: | Line 63: | ||
return nums | return nums | ||
end | end | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
-- Box class definition | -- Box class definition | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
local box = {} | local box = {} | ||
box.__index = box | box.__index = box | ||
function box.new() | function box.new() | ||
local obj = {} | local obj = {} | ||
Line 76: | Line 76: | ||
return obj | return obj | ||
end | end | ||
function box.getNamespaceId(ns) | function box.getNamespaceId(ns) | ||
if not ns then return end | if not ns then return end | ||
Line 90: | Line 90: | ||
end | end | ||
end | end | ||
function box.getMboxType(nsid) | function box.getMboxType(nsid) | ||
-- Gets the mbox type from a namespace number. | -- Gets the mbox type from a namespace number. | ||
Line 108: | Line 108: | ||
end | end | ||
end | end | ||
function box:addCat(ns, cat, sort) | function box:addCat(ns, cat, sort) | ||
if type(cat) ~= 'string' then return end | if type(cat) ~= 'string' then return end | ||
Line 134: | Line 134: | ||
end | end | ||
end | end | ||
function box:addClass(class) | function box:addClass(class) | ||
if type(class) ~= 'string' then return end | if type(class) ~= 'string' then return end | ||
Line 140: | Line 140: | ||
tinsert(self.classes, class) | tinsert(self.classes, class) | ||
end | end | ||
function box:addAttr(attr, val) | function box:addAttr(attr, val) | ||
if type(attr) ~= 'string' or type(val) ~= 'string' then return end | if type(attr) ~= 'string' or type(val) ~= 'string' then return end | ||
Line 146: | Line 146: | ||
tinsert(self.attrs, attr) | tinsert(self.attrs, attr) | ||
end | end | ||
function box:setTitle(args) | function box:setTitle(args) | ||
-- Get the title object and the namespace. | -- Get the title object and the namespace. | ||
Line 154: | Line 154: | ||
self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace | self.nsid = box.getNamespaceId(self.demospace) or self.title.namespace | ||
end | end | ||
function box:getConfig(boxType) | function box:getConfig(boxType) | ||
-- Get the box config data from the data page. | -- Get the box config data from the data page. | ||
Line 175: | Line 175: | ||
return cfg | return cfg | ||
end | end | ||
function box:removeBlankArgs(cfg, args) | function box:removeBlankArgs(cfg, args) | ||
-- Only allow blank arguments for the parameter names listed in | -- Only allow blank arguments for the parameter names listed in | ||
Line 190: | Line 190: | ||
return newArgs | return newArgs | ||
end | end | ||
function box:setBoxParameters(cfg, args) | function box:setBoxParameters(cfg, args) | ||
-- Get type data. | -- Get type data. | ||
Line 203: | Line 203: | ||
self.typeClass = typeData.class | self.typeClass = typeData.class | ||
self.typeImage = typeData.image | self.typeImage = typeData.image | ||
-- Find if the box has been wrongly substituted. | -- Find if the box has been wrongly substituted. | ||
if cfg.substCheck and args.subst == 'SUBST' then | if cfg.substCheck and args.subst == 'SUBST' then | ||
self.isSubstituted = true | self.isSubstituted = true | ||
end | end | ||
-- Find whether we are using a small message box. | -- Find whether we are using a small message box. | ||
if cfg.allowSmall and ( | if cfg.allowSmall and ( | ||
Line 219: | Line 219: | ||
self.isSmall = false | self.isSmall = false | ||
end | end | ||
-- Add attributes, classes and styles. | -- Add attributes, classes and styles. | ||
if cfg.allowId then | if cfg.allowId then | ||
Line 237: | Line 237: | ||
self.style = args.style | self.style = args.style | ||
self.attrs = args.attrs | self.attrs = args.attrs | ||
-- Set text style. | -- Set text style. | ||
self.textstyle = args.textstyle | self.textstyle = args.textstyle | ||
-- Find if we are on the template page or not. This functionality is only | -- Find if we are on the template page or not. This functionality is only | ||
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory | -- used if useCollapsibleTextFields is set, or if both cfg.templateCategory | ||
Line 262: | Line 262: | ||
or false | or false | ||
end | end | ||
-- Process data for collapsible text fields. At the moment these are only | -- Process data for collapsible text fields. At the moment these are only | ||
-- used in {{ambox}}. | -- used in {{ambox}}. | ||
Line 286: | Line 286: | ||
self.issue = tconcat(issues, ' ') | self.issue = tconcat(issues, ' ') | ||
end | end | ||
-- Get the self.talk value. | -- Get the self.talk value. | ||
local talk = args.talk | local talk = args.talk | ||
Line 335: | Line 335: | ||
end | end | ||
end | end | ||
-- Get other values. | -- Get other values. | ||
self.fix = args.fix ~= '' and args.fix or nil | self.fix = args.fix ~= '' and args.fix or nil | ||
Line 349: | Line 349: | ||
self.info = args.info | self.info = args.info | ||
end | end | ||
-- Set the non-collapsible text field. At the moment this is used by all box | -- 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. | -- types other than ambox, and also by ambox when small=yes. | ||
Line 357: | Line 357: | ||
self.text = args.text | self.text = args.text | ||
end | end | ||
-- Set the below row. | -- Set the below row. | ||
self.below = cfg.below and args.below | self.below = cfg.below and args.below | ||
-- General image settings. | -- General image settings. | ||
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false | self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false | ||
Line 367: | Line 367: | ||
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' | self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' | ||
end | end | ||
-- Left image settings. | -- Left image settings. | ||
local imageLeft = self.isSmall and args.smallimage or args.image | local imageLeft = self.isSmall and args.smallimage or args.image | ||
Line 382: | Line 382: | ||
end | end | ||
end | end | ||
-- Right image settings. | -- Right image settings. | ||
local imageRight = self.isSmall and args.smallimageright or args.imageright | local imageRight = self.isSmall and args.smallimageright or args.imageright | ||
Line 388: | Line 388: | ||
self.imageRight = imageRight | self.imageRight = imageRight | ||
end | end | ||
-- Add mainspace categories. At the moment these are only used in {{ambox}}. | -- Add mainspace categories. At the moment these are only used in {{ambox}}. | ||
if cfg.allowMainspaceCategories then | if cfg.allowMainspaceCategories then | ||
Line 433: | Line 433: | ||
end | end | ||
end | end | ||
-- Add template-namespace categories. | -- Add template-namespace categories. | ||
if cfg.templateCategory then | if cfg.templateCategory then | ||
Line 444: | Line 444: | ||
end | end | ||
end | end | ||
-- Add template error category. | -- Add template error category. | ||
if cfg.templateErrorCategory then | if cfg.templateErrorCategory then | ||
Line 470: | Line 470: | ||
self:addCat('template', templateCat, templateSort) | self:addCat('template', templateCat, templateSort) | ||
end | end | ||
-- Categories for all namespaces. | -- Categories for all namespaces. | ||
if self.invalidTypeError then | if self.invalidTypeError then | ||
Line 479: | Line 479: | ||
self:addCat('all', 'Pages with incorrectly substituted templates') | self:addCat('all', 'Pages with incorrectly substituted templates') | ||
end | end | ||
-- Convert category tables to strings and pass them through | -- Convert category tables to strings and pass them through | ||
-- [[Module:Category handler]]. | -- [[Module:Category handler]]. | ||
Line 491: | Line 491: | ||
} | } | ||
end | end | ||
function box:export() | function box:export() | ||
local root = htmlBuilder.create() | local root = htmlBuilder.create() | ||
-- Add the subst check error. | -- Add the subst check error. | ||
if self.isSubstituted and self.name then | if self.isSubstituted and self.name then | ||
Line 505: | Line 505: | ||
)) | )) | ||
end | end | ||
-- Create the box table. | -- Create the box table. | ||
local boxTable = root.tag('table') | local boxTable = root.tag('table') | ||
Line 521: | Line 521: | ||
.attr(attr, val) | .attr(attr, val) | ||
end | end | ||
-- Add the left-hand image. | -- Add the left-hand image. | ||
local row = boxTable.tag('tr') | local row = boxTable.tag('tr') | ||
Line 544: | Line 544: | ||
.cssText(self.imageEmptyCellStyle) | .cssText(self.imageEmptyCellStyle) | ||
end | end | ||
-- Add the text. | -- Add the text. | ||
local textCell = row.tag('td').addClass('mbox-text') | local textCell = row.tag('td').addClass('mbox-text') | ||
Line 577: | Line 577: | ||
.wikitext(self.text) | .wikitext(self.text) | ||
end | end | ||
-- Add the right-hand image. | -- Add the right-hand image. | ||
if self.imageRight then | if self.imageRight then | ||
Line 589: | Line 589: | ||
.wikitext(self.imageRight) | .wikitext(self.imageRight) | ||
end | end | ||
-- Add the below row. | -- Add the below row. | ||
if self.below then | if self.below then | ||
Line 599: | Line 599: | ||
.wikitext(self.below) | .wikitext(self.below) | ||
end | end | ||
-- Add error message for invalid type parameters. | -- Add error message for invalid type parameters. | ||
if self.invalidTypeError then | if self.invalidTypeError then | ||
Line 610: | Line 610: | ||
)) | )) | ||
end | end | ||
-- Add categories. | -- Add categories. | ||
root | root | ||
.wikitext(self.categories) | .wikitext(self.categories) | ||
return tostring(root) | return tostring(root) | ||
end | end | ||
local function main(boxType, args) | local function main(boxType, args) | ||
local outputBox = box.new() | local outputBox = box.new() | ||
Line 626: | Line 626: | ||
return outputBox:export() | return outputBox:export() | ||
end | end | ||
local function makeWrapper(boxType) | local function makeWrapper(boxType) | ||
return function (frame) | return function (frame) | ||
Line 633: | Line 633: | ||
end | end | ||
end | end | ||
local p = { | local p = { | ||
main = main, | main = main, | ||
mbox = makeWrapper('mbox') | mbox = makeWrapper('mbox') | ||
} | } | ||
for boxType in pairs(cfgTables) do | for boxType in pairs(cfgTables) do | ||
p[boxType] = makeWrapper(boxType) | p[boxType] = makeWrapper(boxType) | ||
end | end | ||
return p | return p |