모듈:Message box 편집하기

귀하는 로그인되어 있지 않습니다. 이대로 편집하면 귀하의 IP 주소가 편집 기록에 남게 됩니다.

편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.

최신판 당신의 편집
1번째 줄: 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}}.


-- Load necessary modules.
local htmlBuilder = require('Module:HtmlBuilder')
require('Module:No globals')
local nsDetect = require('Module:Namespace detect')
local getArgs
local categoryHandler = require('Module:Category handler').main
local yesno = require('Module:Yesno')
local yesno = require('Module:Yesno')


-- Get a language object for formatDate and ucfirst.
local p = {}
local lang = mw.language.getContentLanguage()


-- Define constants
local function getTitleObject(page)
local CONFIG_MODULE = 'Module:Message box/configuration'
    if type(page) == 'string' then
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}
        -- Get the title object, passing the function through pcall
local TEMPLATE_STYLES = 'Module:Message box/%s.css'
        -- in case we are over the expensive function count limit.
        local success
        success, page = pcall(mw.title.new, page)
        if not success then
            page = nil
        end
    end
    return page
end


--------------------------------------------------------------------------------
local function presentButBlank(s)
-- Helper functions
    if type(s) ~= 'string' then return end
--------------------------------------------------------------------------------
    if s and not mw.ustring.find(s, '%S') then
        return true
    else
        return false
    end
end


local function getTitleObject(...)
local function formatCategory(cat, date, all)
-- Get the title object, passing the function through pcall
    local ret = {}
-- in case we are over the expensive function count limit.
    cat = type(cat) == 'string' and cat
local success, title = pcall(mw.title.new, ...)
    date = type(date) == 'string' and date
if success then
    all = type(all) == 'string' and all
return title
    local preposition = 'from'
end
    if cat and date then
        local catTitle = mw.ustring.format('Category:%s %s %s', cat, preposition, date)
        table.insert(ret, mw.ustring.format('[[%s]]', catTitle))
        catTitle = getTitleObject(catTitle)
        if not catTitle or not catTitle.exists then
            table.insert(ret, '[[Category:Articles with invalid date parameter in template]]')
        end
    elseif cat and not date then
        table.insert(ret, mw.ustring.format('[[Category:%s]]', cat))
    end
    if all then
        table.insert(ret, mw.ustring.format('[[Category:%s]]', all))
    end
    return table.concat(ret)
end
end


local function union(t1, t2)
local function union(t1, t2)
-- Returns the union of two arrays.
    -- Returns the union of two arrays.
local vals = {}
    local vals = {}
for i, v in ipairs(t1) do
    for i, v in ipairs(t1) do
vals[v] = true
        vals[v] = true
end
    end
for i, v in ipairs(t2) do
    for i, v in ipairs(t2) do
vals[v] = true
        vals[v] = true
end
    end
local ret = {}
    local ret = {}
for k in pairs(vals) do
    for k, v in pairs(vals) do
table.insert(ret, k)
        table.insert(ret, k)
end
    end
table.sort(ret)
    return ret
return ret
end
end


local function getArgNums(args, prefix)
local function getArgNums(args, prefix)
local nums = {}
    local nums = {}
for k, v in pairs(args) do
    for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
        local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
        if num then
table.insert(nums, tonumber(num))
            table.insert(nums, tonumber(num))
end
        end
end
    end
table.sort(nums)
    table.sort(nums)
return nums
    return nums
end
 
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
 
local MessageBox = {}
MessageBox.__index = MessageBox
 
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
 
obj.boxType = boxType
 
-- 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 args.demospace and args.demospace ~= '' then
-- implement demospace parameter of mbox
local demospace = string.lower(args.demospace)
if DEMOSPACES[demospace] then
-- use template from DEMOSPACES
obj.cfg = cfg[DEMOSPACES[demospace]]
obj.boxType = DEMOSPACES[demospace]
elseif string.find( demospace, 'talk' ) then
-- demo as a talk page
obj.cfg = cfg.tmbox
obj.boxType = 'tmbox'
else
-- default to ombox
obj.cfg = cfg.ombox
obj.boxType = 'ombox'
end
elseif ns == 0 then
obj.cfg = cfg.ambox -- main namespace
obj.boxType = 'ambox'
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
obj.boxType = 'imbox'
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
obj.boxType = 'cmbox'
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
obj.boxType = 'tmbox'
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
obj.boxType = 'ombox'
end
end
end
 
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
 
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
-- For lazy loading of [[Module:Category handler]].
obj.hasCategories = false
 
return setmetatable(obj, MessageBox)
end
 
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.hasCategories = true
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
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 if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
 
-- 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.name = args.name
if self.name then
self:addClass('box-' .. string.gsub(self.name,' ','_'))
end
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
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
 
-- 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.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
 
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
self.talk = talkText
end
end
 
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <small class='date-container'>''(<span class='date'>%s</span>)''</small>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
 
-- 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
 
-- Set the below row.
self.below = cfg.below and args.below
 
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle then
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
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('[[File:%s|%s|link=|alt=]]', 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
end


function MessageBox:setMainspaceCategories()
function p.build(boxType, args)
local args = self.args
    -- Get the box config data from the data page.
local cfg = self.cfg
    local dataTables = mw.loadData('Module:Message box/data')
    local data = dataTables[boxType]
    if not data then
        local boxTypes = {}
        for k, v in pairs(dataTables) do
            table.insert(boxTypes, mw.ustring.format('"%s"', k))
        end
        error(mw.ustring.format('invalid message box type "%s"; valid types are %s', tostring(boxType), mw.text.listToText(boxTypes)), 2)
    end


if not cfg.allowMainspaceCategories then
    -- Get the title object and the namespace.
return nil
    local title = mw.title.getCurrentTitle()
end
    local nsid = title.namespace


local nums = {}
    -- Get a language object for formatDate.
for _, prefix in ipairs{'cat', 'category', 'all'} do
    local lang = mw.language.getContentLanguage()
args[prefix .. '1'] = args[prefix]
   
nums = union(nums, getArgNums(args, prefix))
-- Commenting this out for now - this will require tinkering with Namespace detect to differentiate between
end
-- 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'
    }
]]


-- The following is roughly equivalent to the old {{Ambox/category}}.
    ------------------------ Process config data ----------------------------
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end


function MessageBox:setTemplateCategories()
    -- Type data.
local args = self.args
    local typeData = data.types[args.type]
local cfg = self.cfg
    local invalidType = args.type and not typeData and true or false
    typeData = typeData or data.types[data.default]


-- Add template categories.
    -- Process data for collapsible text fields
if cfg.templateCategory then
    local name, issue, talk, fix, date, info
if cfg.templateCategoryRequireName then
    if data.useCollapsibleTextFields then
if self.isTemplatePage then
        name = args.name
self:addCat(10, cfg.templateCategory)
        local nameTitle = getTitleObject(name)
end
        local isTemplatePage = nameTitle and title.prefixedText == ('Template:' .. nameTitle.text) and true or false
elseif not self.title.isSubpage then
        local sect = args.sect
self:addCat(10, cfg.templateCategory)
        if presentButBlank(sect) then
end
            sect = mw.ustring.format('This %s ', data.sectionDefault or 'page')
end
        elseif type(sect) == 'string' then
            sect = 'This ' .. sect .. ' '
        end
        issue = (sect or '') .. (args.issue or '') .. ' ' .. (args.text or '')
        talk = args.talk
        if presentButBlank(talk) and isTemplatePage then
            talk = '#'
        end
        fix = args.fix
        date = args.date
        if presentButBlank(date) and isTemplatePage then
            date = lang:formatDate('F Y')
        end
        info = args.info
    end


-- Add template error categories.
    -- Process the talk link, if present.
if cfg.templateErrorCategory then
    if talk then
local templateErrorCategory = cfg.templateErrorCategory
        -- See if the talk link exists and is for a talk or a content namespace.
local templateCat, templateSort
        local talkTitle = type(talk) == 'string' and getTitleObject(talk)
if not self.name and not self.title.isSubpage then
        if not talkTitle or not talkTitle.isTalkPage then
templateCat = templateErrorCategory
            -- If we couldn't process the talk page link, get the talk page of the current page.
elseif self.isTemplatePage then
            local success
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
            success, talkTitle = pcall(title.talkPageTitle, title)
local count = 0
            if not success then
for i, param in ipairs(paramsToCheck) do
                talkTitle = nil
if not args[param] then
            end
count = count + 1
        end
end
        if talkTitle and talkTitle.exists then
end
            local talkText = ' Relevant discussion may be found on'
if count > 0 then
            if talkTitle.isTalkPage then
templateCat = templateErrorCategory
                talkText = mw.ustring.format('%s [[%s|%s]].', talkText, talk, talkTitle.prefixedText)
templateSort = tostring(count)
            else
end
                talkText = mw.ustring.format('%s the [[%s#%s|talk page]].', talkText, talkTitle.prefixedText, talk)
if self.categoryNums and #self.categoryNums > 0 then
            end
templateCat = templateErrorCategory
            talk = talkText
templateSort = 'C'
        end
end
    end
end
self:addCat(10, templateCat, templateSort)
end
end
 
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
 
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end


function MessageBox:renderCategories()
    -- Find whether we are using a small message box and process our data accordingly.
if not self.hasCategories then
    local isSmall = data.allowSmall and (args.small == 'yes' or args.small == true) and true or false
-- No categories added, no need to pass them to Category handler so,
    local smallClass, image, imageRight, text, imageSize
-- if it was invoked, it would return the empty string.
    if isSmall then
-- So we shortcut and return the empty string.
        smallClass = data.smallClass or 'mbox-small'
return ""
        image = args.smallimage or args.image
end
        imageRight = args.smallimageright or args.imageright
-- Convert category tables to strings and pass them through
        if data.useCollapsibleTextFields then
-- [[Module:Category handler]].
            text = args.smalltext or issue
return require('Module:Category handler')._main{
        else
main = table.concat(self.categories[0] or {}),
            text = args.smalltext or args.text
template = table.concat(self.categories[10] or {}),
        end
all = table.concat(self.categories.all or {}),
        imageSize = data.imageSmallSize or '30x30px'
nocat = self.args.nocat,
    else
page = self.args.page
        image = args.image
}
        imageRight = args.imageright
end
        imageSize = '40x40px'
        text = args.text
    end


function MessageBox:export()
    -- Process mainspace categories.
local root = mw.html.create()
    local mainCats = {}
    local origCategoryNums -- origCategoryNums might be used in computing the template error category.
    if data.allowMainspaceCategories then
        -- Categories for the main namespace.
        local origCatNums = getArgNums(args, 'cat')
        local origCategoryNums = getArgNums(args, 'category')
        local catNums = union(origCatNums, origCategoryNums)
        for _, num in ipairs(catNums) do
            local cat = args['cat' .. tostring(num)] or args['category' .. tostring(num)]
            local all = args['all' .. tostring(num)]
            table.insert(mainCats, formatCategory(cat, args.date, all))
        end
    end


-- Add the subst check error.
    -- Process template namespace categories
if self.isSubstituted and self.name then
    local templateCats = {}
root:tag('b')
    if data.templateCategory and not title.isSubpage and not yesno(args.nocat) then
:addClass('error')
        table.insert(templateCats, mw.ustring.format('[[Category:%s]]', data.templateCategory))
:wikitext(string.format(
    end
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end


-- Add TemplateStyles
    -- Add an error category for the template namespace if appropriate.
root:wikitext(mw.getCurrentFrame():extensionTag{
    if data.templateErrorCategory then
name = 'templatestyles',
        local catName = data.templateErrorCategory
args = { src = TEMPLATE_STYLES:format(self.boxType) },
        local templateCat
})
        if not name and not title.isSubpage then
            templateCat = mw.ustring.format('[[Category:%s]]', catName)
        elseif type(name) == 'string' and title.prefixedText == ('Template:' .. name) then
            local paramsToCheck = data.templateErrorParamsToCheck or {}
            local count = 0
            for i, param in ipairs(paramsToCheck) do
                if not args[param] then
                    count = count + 1
                end
            end
            if count > 0 then
                templateCat = mw.ustring.format('[[Category:%s|%d]]', catName, count)
            end
            if origCategoryNums and #origCategoryNums > 0 then
                templateCat = mw.ustring.format('[[Category:%s|C]]', catName)
            end
        end
        table.insert(templateCats, templatecat)
    end


-- Create the box table.
    -- Categories for all namespaces.
local boxTable
    local allCats = {}
-- Check for fmbox because not all interface messages have mw-parser-output
    if invalidType then
-- which is necessary for TemplateStyles. Add the wrapper class if it is and
        local catsort = (nsid == 0 and 'Main:' or '') .. title.prefixedText
-- then start the actual mbox, else start the mbox.
        table.insert(allCats, mw.ustring.format('[[Category:Wikipedia message box parameter needs fixing|%s]]', catsort))
if self.boxType == 'fmbox' then
    end
boxTable = root:tag('div')
:addClass('mw-parser-output')
:tag('table')
else
boxTable = root:tag('table')
end


boxTable:attr('id', self.id or nil)
    ------------------------ Build the box ----------------------------
for i, class in ipairs(self.classes or {}) do
   
boxTable:addClass(class or nil)
    local root = htmlBuilder.create()
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')


if self.attrs then
    -- Do the subst check.
boxTable:attr(self.attrs)
    if data.substCheck and args.subst == 'SUBST' then
end
        if type(name) == 'string' then
            root
                .tag('b')
                    .addClass('error')
                    .wikitext(mw.ustring.format(
                        'Template <code>%s%s%s</code> has been incorrectly substituted.',
                        mw.text.nowiki('{{'), name, mw.text.nowiki('}}')
                    ))
        end
        table.insert(allCats, '[[Category:Pages with incorrectly substituted templates]]')
    end


-- Add the left-hand image.
    -- Create the box table.
local row = boxTable:tag('tr')
    local box = root.tag('table')
if self.imageLeft then
    box
local imageLeftCell = row:tag('td'):addClass('mbox-image')
        .attr('id', args.id)
if self.imageCellDiv then
    for i, class in ipairs(data.classes) do
-- If we are using a div, redefine imageLeftCell so that the image
        box
-- is inside it. Divs use style="width: 52px;", which limits the
            .addClass(class)
-- image width to 52px. If any images in a div are wider than that,
    end
-- they may overlap with the text or cause other display problems.
    box
imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
        .addClass(isSmall and smallClass)
end
        .addClass(data.classPlainlinksYesno and yesno(args.plainlinks or true) and 'plainlinks')
imageLeftCell:wikitext(self.imageLeft or nil)
        .addClass(typeData.class)
elseif self.imageEmptyCell then
        .addClass(args.class)
-- Some message boxes define an empty cell if no image is specified, and
        .cssText(args.style)
-- some don't. The old template code in templates where empty cells are
        .attr('role', 'presentation')
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
:cssText(self.imageEmptyCellStyle or nil)
end


-- Add the text.
    -- Add the left-hand image.
local textCell = row:tag('td'):addClass('mbox-text')
    local row = box.tag('tr')
if self.useCollapsibleTextFields then
    local imageCheckBlank = data.imageCheckBlank
-- The message box uses advanced text parameters that allow things to be
    if image ~= 'none' and not imageCheckBlank or image ~= 'none' and imageCheckBlank and image ~= 'blank' then
-- collapsible. At the moment, only ambox uses this.
        local imageLeftCell = row.tag('td').addClass('mbox-image')
textCell:cssText(self.textstyle or nil)
        if not isSmall and data.imageCellDiv then
local textCellDiv = textCell:tag('div')
            imageLeftCell = imageLeftCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageLeftCell so that the image is inside it.
textCellDiv
        end
:addClass('mbox-text-span')
        imageLeftCell
:wikitext(self.issue or nil)
            .wikitext(image or mw.ustring.format('[[File:%s|%s|link=|alt=]]', typeData.image, imageSize))
if (self.talk or self.fix) and not self.isSmall then
    elseif data.imageEmptyCell then
textCellDiv:tag('span')
        row.tag('td')
:addClass('hide-when-compact')
            .addClass('mbox-empty-cell') -- No image. Cell with some width or padding necessary for text cell to have 100% width.
:wikitext(self.talk and (' ' .. self.talk) or nil)
            .cssText(data.imageEmptyCellStyle and 'border:none;padding:0px;width:1px')
:wikitext(self.fix and (' ' .. self.fix) or nil)
    end
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('small')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end


-- Add the right-hand image.
    -- Add the text.
if self.imageRight then
    local textCell = row.tag('td').addClass('mbox-text')
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
    if data.useCollapsibleTextFields then
if self.imageCellDiv then
        textCell
-- If we are using a div, redefine imageRightCell so that the image
            .cssText(args.textstyle)
-- is inside it.
        local textCellSpan = textCell.tag('span')
imageRightCell = imageRightCell:tag('div'):css('width', '52px')
        textCellSpan
end
            .addClass('mbox-text-span')
imageRightCell
            .wikitext(issue)
:wikitext(self.imageRight or nil)
        if not isSmall then
end
            textCellSpan
                .tag('span')
                    .addClass('hide-when-compact')
                    .wikitext(talk)
                    .wikitext(' ')
                    .wikitext(fix)
                    .done()
        end
        textCellSpan
            .wikitext(date and mw.ustring.format(" <small>''(%s)''</small>", date))
        if not isSmall then
            textCellSpan
                .tag('span')
                    .addClass('hide-when-compact')
                    .wikitext(info and ' ' .. info)
        end
    else
        textCell
            .cssText(args.textstyle)
            .wikitext(text)
    end


-- Add the below row.
    -- Add the right-hand image.
if self.below then
    if imageRight and not (data.imageRightNone and imageRight == 'none') then
boxTable:tag('tr')
        local imageRightCell = row.tag('td').addClass('mbox-imageright')
:tag('td')
        if not isSmall and data.imageCellDiv then
:attr('colspan', self.imageRight and '3' or '2')
            imageRightCell = imageRightCell.tag('div').css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
:addClass('mbox-text')
        end
:cssText(self.textstyle or nil)
        imageRightCell
:wikitext(self.below or nil)
            .wikitext(imageRight)
end
    end


-- Add error message for invalid type parameters.
    -- Add the below row.
if self.invalidTypeError then
    if data.below and args.below then
root:tag('div')
        box.tag('tr')
:css('text-align', 'center')
            .tag('td')
:wikitext(string.format(
                .attr('colspan', args.imageright and '3' or '2')
'This message box is using an invalid "type=%s" parameter and needs fixing.',
                .addClass('mbox-text')
self.type or ''
                .cssText(args.textstyle)
))
                .wikitext(args.below)
end
    end


-- Add categories.
    ------------------------ Error messages and categories ----------------------------
root:wikitext(self:renderCategories() or nil)


return tostring(root)
    -- Add error message for invalid type parameters.
end
    if invalidType then
        root
            .tag('div')
                .addClass('error')
                .css('text-align', 'center')
                .wikitext(mw.ustring.format('This message box is using an invalid type parameter (<code>type=%s</code>) and needs fixing.', args.type or ''))
    end


--------------------------------------------------------------------------------
    -- Add categories using categoryHandler.
-- Exports
    root
--------------------------------------------------------------------------------
        .wikitext(categoryHandler{
 
            main = table.concat(mainCats),
local p, mt = {}, {}
            template = table.concat(templateCats),
 
            all = table.concat(allCats)
function p._exportClasses()
        })
-- For testing.
   
return {
    return tostring(root)
MessageBox = MessageBox
}
end
end


function p.main(boxType, args, cfgTables)
local function makeWrapper(boxType)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
    return function (frame)
box:setParameters()
        -- If called via #invoke, use the args passed into the invoking
box:setCategories()
        -- template, or the args passed to #invoke if any exist. Otherwise
return box:export()
        -- 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 ~= '' or k == 'talk' or k == 'sect' or k == 'date' then
                args[k] = v
            end
        end
        return p.build(boxType, args)
    end
end
end


function mt.__index(t, k)
p.ambox = makeWrapper('ambox')
return function (frame)
p.fmbox = makeWrapper('fmbox')
if not getArgs then
p.imbox = makeWrapper('imbox')
getArgs = require('Module:Arguments').getArgs
p.ombox = makeWrapper('ombox')
end
p.cmbox = makeWrapper('cmbox')
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
p.tmbox = makeWrapper('tmbox')
end
end


return setmetatable(p, mt)
return p
가온 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는 가온 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다. 저작권이 있는 내용을 허가 없이 저장하지 마세요!
취소 편집 도움말 (새 창에서 열림)