Editing Module:Message box
From MINR.ORG WIKI
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.
The edit can be undone.
Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision | Your text | ||
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}}. |
− | |||
− | + | local htmlBuilder = require('Module:HtmlBuilder') | |
− | require('Module: | + | local nsDetect = require('Module:Namespace detect') |
− | local | ||
− | |||
local yesno = require('Module:Yesno') | local yesno = require('Module:Yesno') | ||
− | + | local p = {} | |
− | local | ||
− | + | local function getTitleObject(page) | |
− | + | if type(page) == 'string' then | |
− | + | -- Get the title object, passing the function through pcall | |
− | + | -- in case we are over the expensive function count limit. | |
− | + | local success | |
− | + | success, page = pcall(mw.title.new, page) | |
− | + | if not success then | |
− | local function getTitleObject( | + | page = nil |
− | + | end | |
− | + | end | |
− | + | return page or mw.title.getCurrentTitle() | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end | end | ||
− | function | + | local function generateBoxStructure() |
− | + | local root = htmlBuilder.create() -- Includes error messages and categories added after the box. | |
− | + | local substCheck = root.tag('b').addClass('error') | |
− | + | local box = root.tag('table') | |
− | + | local row = box.tag('tr') | |
+ | local imageLeftCell = row.tag('td') | ||
+ | return root, substCheck, box, row, imageLeftCell | ||
end | end | ||
− | function | + | function p.build(data, args) |
− | + | -- Get the title object and the namespace. | |
− | + | local title = mw.title.getCurrentTitle() | |
− | + | local nsid = title.namespace | |
− | + | ||
− | + | -- Commenting this out for now - this will require tinkering with Namespace detect to differentiate between | |
− | + | -- invalid titles and pages where the expensive parser function count has been exceeded. | |
− | + | --[[ | |
− | + | local title = nsDetect.getPageObject(args.page) | |
− | + | local namespace = nsDetect.main{ | |
− | + | page = args.page, | |
− | + | demospace = args.demospace, | |
− | + | main = 'main', | |
− | + | talk = 'talk', | |
− | + | file = 'file', | |
− | + | category = 'category', | |
− | + | other = 'other' | |
− | + | } | |
− | + | ]] | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | -- Process config data. | |
− | + | local typeData = data.types[args.type] | |
+ | local invalidType = args.type and not typeData and true or false | ||
+ | typeData = typeData or data.types[data.default] | ||
− | + | local isSmall = data.allowSmall and (args.small == 'yes' or args.small == true) and true or false | |
− | + | local smallClass, image, imageRight, text, imageSize | |
− | + | if isSmall then | |
− | + | smallClass = data.smallClass or 'mbox-small' | |
− | + | image = args.smallimage or args.image | |
− | + | imageRight = args.smallimageright or args.imageright | |
− | + | text = args.smalltext or args.text | |
− | + | imageSize = data.imageSmallSize or '30x30px' | |
− | + | else | |
− | + | image = args.image | |
− | + | imageRight = args.imageright | |
− | + | text = args.text | |
− | + | imageSize = '40x40px' | |
− | + | end | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | -- Get the box structure. | |
− | + | local root, substCheck, box, row, imageLeftCell = generateBoxStructure() | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | -- Do the subst check. | |
− | + | if data.substCheck and args.subst == 'SUBST' then | |
− | + | if type(args.name) == 'string' then | |
− | + | substCheck | |
− | + | .wikitext(mw.ustring.format( | |
− | + | 'Template <code>%s%s%s</code> has been incorrectly substituted.', | |
− | + | mw.text.nowiki('{{'), | |
− | + | args.name, | |
− | + | mw.text.nowiki('}}') | |
− | + | )) | |
− | + | end | |
− | + | root.wikitext('[[Category:Pages with incorrectly substituted templates]]') -- This puts the category at the *end* of the output, rather than after the subst error message. | |
− | + | end | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | -- Build the box. | |
− | + | box | |
− | + | .attr('id', args.id) | |
− | + | for i, class in ipairs(data.classes) do | |
− | + | box | |
− | + | .addClass(class) | |
− | + | end | |
− | + | box | |
− | + | .addClass(isSmall and smallClass) | |
− | + | .addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks') | |
− | + | .addClass(typeData.class) | |
− | + | .addClass(args.class) | |
− | + | .cssText(args.style) | |
− | + | .attr('role', 'presentation') | |
− | |||
− | |||
− | + | -- Add the left-hand image. | |
− | + | local imageCheckBlank = data.imageCheckBlank | |
− | + | if image ~= 'none' and not imageCheckBlank or image ~= 'none' and imageCheckBlank and image ~= 'blank' then | |
− | + | imageLeftCell | |
− | + | .addClass('mbox-image') | |
− | + | if not isSmall and data.imageCellDiv then | |
− | + | imageLeftCell = imageLeftCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageLeftCell so that the image is inside it. | |
+ | end | ||
+ | imageLeftCell | ||
+ | .wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize)) | ||
+ | elseif data.imageEmptyCell then | ||
+ | row.tag('td') | ||
+ | .addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width. | ||
+ | .cssText(data.imageEmptyCellStyle and 'border:none;padding:0px;width:1px') | ||
+ | end | ||
− | + | -- Add the text. | |
− | + | row.tag('td') | |
− | + | .addClass('mbox-text') | |
− | + | .cssText(args.textstyle) | |
− | + | .wikitext(text) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | -- Add the right-hand image. | |
− | + | if imageRight and not (data.imageRightNone and imageRight == 'none') then | |
− | + | row.tag('td') | |
+ | .addClass('mbox-imageright') | ||
+ | .wikitext(imageRight) | ||
+ | end | ||
− | + | -- Add the below row. | |
− | + | if data.below and args.below then | |
− | + | box.tag('tr') | |
+ | .tag('td') | ||
+ | .attr('colspan', args.imageright and '3' or '2') | ||
+ | .addClass('mbox-text') | ||
+ | .cssText(args.textstyle) | ||
+ | .wikitext(args.below) | ||
+ | end | ||
− | + | -- Add error messages and tracking categories. | |
− | + | if invalidType then | |
− | + | local catsort = (nsid == 0 and 'Main:' or '') .. title.prefixedText | |
− | + | root | |
− | + | .tag('div') | |
+ | .css('text-align', 'center') | ||
+ | .wikitext(mw.ustring.format('This message box is using an invalid "type=%s" parameter and needs fixing.', args.type or '')) | ||
+ | .done() | ||
+ | .wikitext(mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort)) | ||
+ | end | ||
− | + | -- Categorise template pages. | |
− | + | if data.category and nsid == 10 and not title.isSubpage and not yesno(args.nocat) then | |
− | + | root.wikitext(mw.ustring.format('[[Category:%s]]', data.category)) | |
− | + | end | |
− | + | return tostring(root) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end | end | ||
− | function | + | function p._ambox(args) |
− | + | local data = {} | |
− | + | data.types = { | |
− | + | speedy = { | |
− | + | class = 'ambox-speedy', | |
− | + | image = 'Ambox speedy deletion.png' | |
− | + | }, | |
− | + | delete = { | |
− | + | class = 'ambox-delete', | |
− | + | image = 'Ambox deletion.png' | |
− | + | }, | |
− | + | content = { | |
− | + | class = 'ambox-content', | |
− | + | image = 'Ambox content.png' | |
− | + | }, | |
− | + | style = { | |
− | + | class = 'ambox-style', | |
− | + | image = 'Edit-clear.svg' | |
− | + | }, | |
− | + | move = { | |
− | + | class = 'ambox-move', | |
− | + | image = 'Ambox move.png' | |
− | + | }, | |
− | + | protection = { | |
− | + | class = 'ambox-protection', | |
− | + | image = 'Ambox protection.png' | |
− | + | }, | |
− | + | notice = { | |
− | + | class = 'ambox-notice', | |
− | + | image = 'Ambox notice.png' | |
− | + | } | |
− | + | } | |
− | + | data.default = 'notice' | |
− | + | data.allowSmall = true | |
− | + | data.substCheck = true | |
− | + | data.classes = {'metadata', 'plainlinks', 'ambox'} | |
− | + | data.smallClass = 'mbox-small-left' | |
− | + | data.imageEmptyCell = true | |
− | + | data.imageCheckBlank = true | |
− | + | data.imageSmallSize = '20x20px' | |
+ | data.imageCellDiv = true | ||
+ | data.talkLink = true | ||
+ | return p.build(data, args) | ||
end | end | ||
− | function | + | function p._fmbox(args) |
− | + | local data = {} | |
− | + | data.types = { | |
− | + | warning = { | |
− | + | class = 'fmbox-warning', | |
− | + | image = 'Cmbox deletion.png' | |
− | + | }, | |
− | + | editnotice = { | |
− | + | class = 'fmbox-editnotice', | |
+ | image = 'Imbox notice.png' | ||
+ | }, | ||
+ | system = { | ||
+ | class = 'fmbox-system', | ||
+ | image = 'Imbox notice.png' | ||
+ | } | ||
+ | } | ||
+ | data.default = 'system' | ||
+ | data.classes = { 'plainlinks', 'fmbox' } | ||
+ | data.imageEmptyCell = false | ||
+ | data.imageRightNone = false | ||
+ | return p.build(data, args) | ||
end | end | ||
− | function | + | function p._ombox(args) |
− | + | local data = {} | |
− | + | data.types = { | |
− | + | speedy = { | |
− | + | class = 'ombox-speedy', | |
− | + | image = 'Imbox speedy deletion.png' | |
− | + | }, | |
+ | delete = { | ||
+ | class = 'ombox-delete', | ||
+ | image = 'Imbox deletion.png' | ||
+ | }, | ||
+ | content = { | ||
+ | class = 'ombox-content', | ||
+ | image = 'Imbox content.png' | ||
+ | }, | ||
+ | style = { | ||
+ | class = 'ombox-style', | ||
+ | image = 'Edit-clear.svg' | ||
+ | }, | ||
+ | move = { | ||
+ | class = 'ombox-move', | ||
+ | image = 'Imbox move.png' | ||
+ | }, | ||
+ | protection = { | ||
+ | class = 'ombox-protection', | ||
+ | image = 'Imbox protection.png' | ||
+ | }, | ||
+ | notice = { | ||
+ | class = 'ombox-notice', | ||
+ | image = 'Imbox notice.png' | ||
+ | } | ||
+ | } | ||
+ | data.default = 'notice' | ||
+ | data.classes = {'plainlinks', 'ombox'} | ||
+ | data.allowSmall = true | ||
+ | data.imageEmptyCell = true | ||
+ | data.imageRightNone = true | ||
+ | return p.build(data, args) | ||
end | end | ||
− | function | + | function p._imbox(args) |
− | + | local data = {} | |
− | + | data.types = { | |
− | + | speedy = { | |
− | + | class = 'imbox-speedy', | |
− | + | image = 'Imbox speedy deletion.png' | |
− | + | }, | |
− | + | delete = { | |
− | + | class = 'imbox-delete', | |
− | + | image = 'Imbox deletion.png' | |
+ | }, | ||
+ | content = { | ||
+ | class = 'imbox-content', | ||
+ | image = 'Imbox content.png' | ||
+ | }, | ||
+ | style = { | ||
+ | class = 'imbox-style', | ||
+ | image = 'Edit-clear.svg' | ||
+ | }, | ||
+ | move = { | ||
+ | class = 'imbox-move', | ||
+ | image = 'Imbox move.png' | ||
+ | }, | ||
+ | protection = { | ||
+ | class = 'imbox-protection', | ||
+ | image = 'Imbox protection.png' | ||
+ | }, | ||
+ | license = { | ||
+ | class = 'imbox-license', | ||
+ | image = 'Imbox license.png' | ||
+ | }, | ||
+ | featured = { | ||
+ | class = 'imbox-featured', | ||
+ | image = 'Imbox featured.png' | ||
+ | }, | ||
+ | notice = { | ||
+ | class = 'imbox-notice', | ||
+ | image = 'Imbox notice.png' | ||
+ | } | ||
+ | } | ||
+ | data.default = 'notice' | ||
+ | data.classes = {'imbox'} | ||
+ | data.classPlainlinksYesno = true | ||
+ | data.imageEmptyCell = true | ||
+ | data.below = true | ||
+ | return p.build(data, args) | ||
end | end | ||
− | function | + | function p._cmbox(args) |
− | + | local data = {} | |
− | + | data.types = { | |
− | + | speedy = { | |
− | + | class = 'cmbox-speedy', | |
− | + | image = 'Cmbox deletion.png' | |
− | + | }, | |
− | + | delete = { | |
− | + | class = 'cmbox-delete', | |
− | + | image = 'Cmbox deletion.png' | |
− | + | }, | |
− | + | content = { | |
− | + | class = 'cmbox-content', | |
− | + | image = 'Cmbox content.png' | |
− | + | }, | |
− | + | style = { | |
− | + | class = 'cmbox-style', | |
− | + | image = 'Edit-clear.svg' | |
− | + | }, | |
− | + | move = { | |
− | + | class = 'cmbox-move', | |
− | + | image = 'Cmbox move.png' | |
− | + | }, | |
− | + | protection = { | |
− | + | class = 'cmbox-protection', | |
− | + | image = 'Cmbox protection.png' | |
− | + | }, | |
− | + | notice = { | |
− | + | class = 'cmbox-notice', | |
− | + | image = 'Cmbox notice.png' | |
− | + | } | |
− | + | } | |
− | + | data.default = 'notice' | |
− | + | data.classes = {'plainlinks', 'cmbox'} | |
− | + | return p.build(data, args) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end | end | ||
− | ----- | + | function p._tmbox(args) |
− | + | local data = {} | |
− | - | + | data.types = { |
− | + | speedy = { | |
− | + | class = 'tmbox-speedy', | |
− | + | image = 'Imbox speedy deletion.png' | |
− | + | }, | |
− | + | delete = { | |
− | + | class = 'tmbox-delete', | |
− | + | image = 'Imbox deletion.png' | |
− | + | }, | |
+ | content = { | ||
+ | class = 'tmbox-content', | ||
+ | image = 'Imbox content.png' | ||
+ | }, | ||
+ | style = { | ||
+ | class = 'tmbox-style', | ||
+ | image = 'Edit-clear.svg ' | ||
+ | }, | ||
+ | move = { | ||
+ | class = 'tmbox-move', | ||
+ | image = 'Imbox move.png' | ||
+ | }, | ||
+ | protection = { | ||
+ | class = 'tmbox-protection', | ||
+ | image = 'Imbox protection.png' | ||
+ | }, | ||
+ | notice = { | ||
+ | class = 'tmbox-notice', | ||
+ | image = 'Imbox notice.png' | ||
+ | } | ||
+ | } | ||
+ | data.default = 'notice' | ||
+ | data.classes = {'plainlinks', 'tmbox'} | ||
+ | data.allowSmall = true | ||
+ | data.imageRightNone = true | ||
+ | data.imageEmptyCellStyle = true | ||
+ | data.category = 'Talk message boxes' | ||
+ | return p.build(data, args) | ||
end | end | ||
− | function | + | local function makeWrapper(func) |
− | + | return function (frame) | |
− | + | -- If called via #invoke, use the args passed into the invoking | |
− | + | -- template, or the args passed to #invoke if any exist. Otherwise | |
− | + | -- assume args are being passed directly in from the debug console | |
+ | -- or from another Lua module. | ||
+ | local origArgs | ||
+ | if frame == mw.getCurrentFrame() then | ||
+ | origArgs = frame:getParent().args | ||
+ | for k, v in pairs(frame.args) do | ||
+ | origArgs = frame.args | ||
+ | break | ||
+ | end | ||
+ | else | ||
+ | origArgs = frame | ||
+ | end | ||
+ | -- Trim whitespace and remove blank arguments. | ||
+ | local args = {} | ||
+ | for k, v in pairs(origArgs) do | ||
+ | if type(v) == 'string' then | ||
+ | v = mw.text.trim(v) | ||
+ | end | ||
+ | if v ~= '' then | ||
+ | args[k] = v | ||
+ | end | ||
+ | end | ||
+ | return func(args) | ||
+ | end | ||
end | end | ||
− | + | p.ambox = makeWrapper(p._ambox) | |
− | + | p.fmbox = makeWrapper(p._fmbox) | |
− | + | p.imbox = makeWrapper(p._imbox) | |
− | + | p.ombox = makeWrapper(p._ombox) | |
− | + | p.cmbox = makeWrapper(p._cmbox) | |
− | + | p.tmbox = makeWrapper(p._tmbox) | |
− | |||
− | |||
− | return | + | return p |