Difference between revisions of "Module:Message box"

From FIThydrowiki
Jump to navigation Jump to search
what>Mr. Stradivarius
(start work on a module for displaying Template:Mbox-family message boxes)
 
what>Mr. Stradivarius
(more abstraction for box structure and better small=yes support)
Line 4: Line 4:
  
 
local p = {}
 
local p = {}
 +
 +
local function generateBoxStructure()
 +
    local root = htmlBuilder.create() -- Includes error messages and categories added after the box.
 +
    local box = root.tag('table')
 +
    local row = box.tag('tr')
 +
    return root, box, row
 +
end
  
 
function p.build(data, args)
 
function p.build(data, args)
     -- Process config data using the args passed to the template.
+
     -- Process config data.
 
     local isSmall = args.small == 'yes' or args.small == true
 
     local isSmall = args.small == 'yes' or args.small == true
 
     local typeData = data.types[args.type]
 
     local typeData = data.types[args.type]
 
     local invalidType = args.type and not typeData and true or false
 
     local invalidType = args.type and not typeData and true or false
 
     typeData = typeData or data.types[data.default]
 
     typeData = typeData or data.types[data.default]
 +
 +
    local image, imageRight, text, imageSize
 +
    if isSmall then
 +
        image = args.smallimage or args.image
 +
        imageRight = args.smallimageright or args.imageright
 +
        text = args.smalltext or args.text
 +
        imageSize = data.imageSizeSmall or data.imageSize
 +
    else
 +
        image = args.image
 +
        imageRight = args.imageright
 +
        text = args.text
 +
        imageSize = data.imageSizeLarge or data.imageSize
 +
    end
 +
 +
    -- Get the box structure.
 +
    local root, box, row = generateBoxStructure()
  
 
     -- Build the box.
 
     -- Build the box.
    local root = htmlBuilder.create() -- The template root. Includes error messages and categories added after the box.
 
    local box = root.tag('table') -- The box.
 
 
     box
 
     box
 
         .attr('id', args.id)
 
         .attr('id', args.id)
Line 28: Line 49:
  
 
     -- Add the left-hand image.
 
     -- Add the left-hand image.
    local row = box.tag('tr')
+
     if image ~= 'none' then
     if args.image ~= 'none' then
 
 
         row.tag('td')
 
         row.tag('td')
 
             .addClass('mbox-image')
 
             .addClass('mbox-image')
             .wikitext(args.image or mw.ustring.format(
+
             .wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize))
                '[[File:%s|%s|link=|alt=]]',
 
                typeData.image,
 
                (args.small == 'yes' or args.small == true) and data.imageSizeSmall or data.imageSizeLarge or data.imageSize
 
            ))
 
 
     elseif data.imageEmptyCell then
 
     elseif data.imageEmptyCell then
 
         row.tag('td')
 
         row.tag('td')
Line 46: Line 62:
 
         .addClass('mbox-text')
 
         .addClass('mbox-text')
 
         .cssText(args.textstyle)
 
         .cssText(args.textstyle)
         .wikitext(args.text)
+
         .wikitext(text)
  
 
     -- Add the right-hand image.
 
     -- Add the right-hand image.
     if args.imageright then
+
     if imageRight then
 
         row.tag('td')
 
         row.tag('td')
 
             .addClass('mbox-imageright')
 
             .addClass('mbox-imageright')
             .wikitext(args.imageright)
+
             .wikitext(imageRight)
 
     end
 
     end
  

Revision as of 14:27, 19 September 2013

-- This is a meta-module for producing message box templates, including Lua error in package.lua at line 80: module 'Module:HtmlBuilder' not found., Template:Ambox, Template:Imbox, Template:Tmbox, Lua error in package.lua at line 80: module 'Module:HtmlBuilder' not found., Template:Cmbox and Template:Fmbox.

local htmlBuilder = require('Module:HtmlBuilder')

local p = {}

local function generateBoxStructure()

   local root = htmlBuilder.create() -- Includes error messages and categories added after the box.
   local box = root.tag('table')
   local row = box.tag('tr')
   return root, box, row

end

function p.build(data, args)

   -- Process config data.
   local isSmall = args.small == 'yes' or args.small == true
   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 image, imageRight, text, imageSize
   if isSmall then
       image = args.smallimage or args.image
       imageRight = args.smallimageright or args.imageright
       text = args.smalltext or args.text
       imageSize = data.imageSizeSmall or data.imageSize
   else
       image = args.image
       imageRight = args.imageright
       text = args.text
       imageSize = data.imageSizeLarge or data.imageSize
   end
   -- Get the box structure.
   local root, box, row = generateBoxStructure()
   -- Build the box.
   box
       .attr('id', args.id)
   for i, class in ipairs(data.classes) do
       box
           .addClass(class)
   end
   box
       .addClass(typeData.class)
       .addClass(args.class)
       .cssText(args.style)
       .attr('role', 'presentation')
   -- Add the left-hand image.
   if image ~= 'none' then
       row.tag('td')
           .addClass('mbox-image')
           .wikitext(image or mw.ustring.format('%s', typeData.image, imageSize))
   elseif data.imageEmptyCell then
       row.tag('td')
           .addClass('mbox-empty-cell')
   end
   -- Add the text.
   row.tag('td')
       .addClass('mbox-text')
       .cssText(args.textstyle)
       .wikitext(text)
   -- Add the right-hand image.
   if imageRight then
       row.tag('td')
           .addClass('mbox-imageright')
           .wikitext(imageRight)
   end
   -- Add error messages and categories.
   if invalidType then
       local title = mw.title.getCurrentTitle()
       local catsort = (title.namespace == 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(, catsort))
   end
   return tostring(root)

end

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.imageSize = '40x40px'
   data.imageEmptyCell = false
   return p.build(data, args)

end

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.imageSizeLarge = '40x40px'
   data.imageSizeSmall = '30x30px'
   data.imageEmptyCell = true
   return p.build(data, args)

end

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

p.fmbox = makeWrapper(p._fmbox) p.ombox = makeWrapper(p._ombox)

return p