Module:Message box: Difference between revisions

    (Undo revision 896901 by 86.135.251.105 (talk))
    m>AGK
    (spread comment over two lines, as modules do not wrap lines)
    Line 1: Line 1:
    -- This is a meta-module for producing message box templates, including {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
    -- This is a meta-module for producing message box templates, including {{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 6: 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 18: 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 33: 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 50: Line 51:
    return ret
    return ret
    end
    end
     
    local function getArgNums(args, prefix)
    local function getArgNums(args, prefix)
    local nums = {}
    local nums = {}
    Line 62: 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 75: 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 89: 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 107: 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 130: Line 131:
    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 136: Line 137:
    tinsert(self.classes, class)
    tinsert(self.classes, class)
    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 144: Line 145:
    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 161: Line 162:
    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 cfg.allowBlankParams.
    -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams.
    Line 175: Line 176:
    return newArgs
    return newArgs
    end
    end
     
    function box:setBoxParameters(cfg, args)
    function box:setBoxParameters(cfg, args)
    -- Get type data.
    -- Get type data.
    Line 184: Line 185:
    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 200: Line 201:
    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 218: Line 219:
    self:addClass(args.class)
    self:addClass(args.class)
    self.style = args.style
    self.style = args.style
     
    -- 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 used if useCollapsibleTextFields is set,
    -- Find if we are on the template page or not. This functionality is only used if useCollapsibleTextFields is set,
    -- or if both cfg.templateCategory and cfg.templateCategoryRequireName are set.
    -- or if both cfg.templateCategory and cfg.templateCategoryRequireName are set.
    Line 234: Line 235:
    self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) or false
    self.isTemplatePage = self.templateTitle and mw.title.equals(self.title, self.templateTitle) or false
    end
    end
     
    -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
    -- Process data for collapsible text fields. At the moment these are only used in {{ambox}}.
    if self.useCollapsibleTextFields then
    if self.useCollapsibleTextFields then
    Line 257: Line 258:
    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 287: Line 288:
    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 301: Line 302:
    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 types other than ambox,
    -- 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.
    -- and also by ambox when small=yes.
    Line 309: Line 310:
    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 319: Line 320:
    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 331: Line 332:
    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 337: Line 338:
    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 378: Line 379:
    end
    end
    end
    end
     
    -- Add template-namespace categories.
    -- Add template-namespace categories.
    if cfg.templateCategory then
    if cfg.templateCategory then
    Line 389: Line 390:
    end
    end
    end
    end
     
    -- Add template error category.
    -- Add template error category.
    if cfg.templateErrorCategory then
    if cfg.templateErrorCategory then
    Line 415: Line 416:
    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 424: Line 425:
    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 [[Module:Category handler]].
    -- Convert category tables to strings and pass them through [[Module:Category handler]].
    self.categories = categoryHandler{
    self.categories = categoryHandler{
    Line 435: Line 436:
    }
    }
    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 449: Line 450:
    ))
    ))
    end
    end
     
    -- Create the box table.
    -- Create the box table.
    local boxTable = root.tag('table')
    local boxTable = root.tag('table')
    Line 461: Line 462:
    .cssText(self.style)
    .cssText(self.style)
    .attr('role', 'presentation')
    .attr('role', 'presentation')
     
    -- Add the left-hand image.
    -- Add the left-hand image.
    local row = boxTable.tag('tr')
    local row = boxTable.tag('tr')
    Line 483: Line 484:
    .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 516: Line 517:
    .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 526: Line 527:
    .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 536: Line 537:
    .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 544: Line 545:
    .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
    .wikitext(format('This message box is using an invalid "type=%s" parameter and needs fixing.', self.type or ''))
    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 560: Line 561:
    return outputBox:export()
    return outputBox:export()
    end
    end
     
    local function makeWrapper(boxType)
    local function makeWrapper(boxType)
    return function (frame)
    return function (frame)
    Line 567: Line 568:
    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