變更
add class using template name, code requested by User:SD0001
-- This is a meta-module for producing message box templates, including -- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.
-- Require Load necessary modules.local getArgs = require('Module:ArgumentsNo globals').getArgslocal categoryHandler = require('Module:Category handler').maingetArgs
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Set aliases for often-used functions to reduce table lookups.Define constantslocal format CONFIG_MODULE = mw.ustring.formatlocal tinsert = table.insertlocal tconcat = table.concatlocal trim = mw.text.trim'Module:Message box/configuration'
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
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, title = pcall(mw.title.new, page, ...) if success then return title end
end
end
local ret = {}
for k in pairs(vals) do
end
table.sort(ret)
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
end
end
--------------------------------------------------------------------------------
local box MessageBox = {}boxMessageBox.__index = boxMessageBox
function boxMessageBox.new(boxType, args, cfg) args = args or {}
local obj = {}
else
end
end
end
end
end
end
function boxMessageBox:getConfigaddCat(boxTypens, cat, sort) -- Get the box config data from the data page. if boxType == 'mbox' not cat then boxType = box.getMboxType(self.nsid)return nil
end
end
end
function boxMessageBox:removeBlankArgsaddClass(cfg, argsclass) -- Only allow blank arguments for the parameter names listed in cfg.allowBlankParams. local newArgs = {} for k, v in pairs(args) do if v ~= '' not class then newArgs[k] = v end end for i, param in ipairs(cfg.allowBlankParams or {}) do newArgs[param] = args[param]return nil
end
end
function boxMessageBox:setBoxParameterssetParameters() local args = self.args local cfg = self.cfg, args)
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError and self.type and not typeData and true or false
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
-- Find if the box has been wrongly substituted.
-- Find whether we are using a small message box.
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 cfgself.allowId name then self:addClass('box-' .. string.gsub(self.id = name,' ','_')) end if yesno(args.idplainlinks) ~= false then self:addClass('plainlinks')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
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 self.name = args.name
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) or false
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.
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
text = type(text) == 'string' and text or nil
local issues = {}
end
-- Get the self.talk value.
local talk = args.talk
then
talk = '#'
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( '%sthe [[%s#%s| 討論頁talk page]].', talkText, talkTitle.prefixedText, talk )
end
self.talk = talkText
-- 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 年n月j日') elseif args.time and args.time ~= '' then date = lang:formatDate('Y年n月j日', time)
end
if date then
self.date = string.format("<smallclass='date-container'>''(<span class='date'> (%s )</span>)''</small>", date)
end
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
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv and true or false
self.imageEmptyCell = cfg.imageEmptyCell
if cfg.imageEmptyCellStyle 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
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
end
end
end
end
function MessageBox:setTemplateCategories() local args = self.args local cfg = self.cfg -- Add template-namespace categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat('template'10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat('template'10, cfg.templateCategory)
end
end
-- Add template error categorycategories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
end
end
self:addCat('template'10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories() -- Categories Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.nsid 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() if not self.hasCategories then -- No categories added, no need to pass them to Category handler so, -- if it was invoked, it would return the empty string. -- So we shortcut and return the empty string. return "" end -- Convert category tables to strings and pass them through -- [[Module:Category handler]]. selfreturn require('Module:Category handler').categories = categoryHandler_main{ main = tconcattable.concat(self.mainCats categories[0] or {}), template = tconcattable.concat(self.templateCats categories[10] or {}), all = tconcattable.concat(self.allCats categories.all or {}), nocat = self.args.nocat, demospace = self.demospace, page = self.pageTitle and selfargs.pageTitle.prefixedText or nilpage
}
end
function boxMessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root :tag('b') :addClass('error') :wikitext(string.format( ' 模板Template <code>%s[[Template:%s|%s]]%s</code> 被錯誤地替代。has been incorrectly substituted.', mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') ))
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable :attr('id', self.idor nil)
for i, class in ipairs(self.classes or {}) do
boxTable :addClass(classor nil)
end
boxTable
:cssText(self.styleor nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image -- is inside it. -- Divs use style="width: 52px;", which limits the -- image width to 52px. If any -- images in a div are wider than that, -- they may overlap with the text or cause -- other display problems. imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
end
imageLeftCell :wikitext(self.imageLeftor nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and -- some don't. -- The old template code in templates where empty cells are -- 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.imageEmptyCellStyleor nil)
end
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be -- collapsible. At the -- moment, only ambox uses this. textCell :cssText(self.textstyleor nil) local textCellSpan textCellDiv = textCell:tag('spandiv') textCellSpantextCellDiv
:addClass('mbox-text-span')
:wikitext(self.issueor nil) if (self.talk or self.fix) and not self.isSmall then textCellSpan textCellDiv:tag('span') :addClass('hide-when-compact') :wikitext(self.talk and (' ' .. self.talk) or nil) :wikitext(self.fix and (' ' .. self.fix) or nil)
end
:tag('span')
end
if not self.isSmall removalNotice then textCellSpan textCellDiv:tag('spansmall')
:addClass('hide-when-compact')
:tag('i') :wikitext(selfstring.info and format(" (%s)", self.inforemovalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyleor nil) :wikitext(self.textor nil)
end
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image -- is inside it. imageRightCell = imageRightCell:tag('div'):css('width', '52px') -- If we are using a div, redefine imageRightCell so that the image is inside it.
end
imageRightCell
:wikitext(self.imageRightor nil)
end
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyleor nil) :wikitext(self.belowor nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root :tag('div') :css('text-align', 'center') :wikitext(string.format( ' 本訊息框使用無效的「typeThis message box is using an invalid "type=%s 」參數,需要修復。" parameter and needs fixing.', self.type or '' ))
end
-- Add categories.
root :wikitext(self.categories:renderCategories() or nil)
return tostring(root)
end
---------------------------------------------------------------------------------- Exports-------------------------------------------------------------------------------- local function main(boxTypep, mt = {}, args){} local outputBox = boxfunction p.new_exportClasses() outputBox:setTitle(args)-- For testing. local cfg = outputBox:getConfig(boxType)return { args MessageBox = outputBox:removeBlankArgs(cfg, args)MessageBox outputBox:setBoxParameters(cfg, args) return outputBox:export()}
end
function p.main(boxType, args, cfgTables) local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE)) box:setParameters() box:setCategories() return box:export()end function makeWrappermt.__index(boxTypet, k)
return function (frame)
end
end