11.314
suntingan
(←Membuat halaman berisi 'require('strict') local getArgs local yesno = require('Modul:Yesno') local lang = mw.language.getContentLanguage() local CONFIG_MODULE = 'Modul:Message box/configuration' local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} -------------------------------------------------------------------------------- -- Fungsi pembantu ----------------------------------------------------------------------...') |
Tidak ada ringkasan suntingan Tag: Dikembalikan |
||
Baris 1: | Baris 1: | ||
-- This is a meta-module for producing message box templates, including | |||
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}. | |||
-- Load necessary modules. | |||
require('strict') | require('strict') | ||
local getArgs | local getArgs | ||
local yesno = require(' | local yesno = require('Module:Yesno') | ||
-- Get a language object for formatDate and ucfirst. | |||
local lang = mw.language.getContentLanguage() | local lang = mw.language.getContentLanguage() | ||
local CONFIG_MODULE = ' | -- Define constants | ||
local CONFIG_MODULE = 'Module:Message box/configuration' | |||
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} | local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'} | ||
local TEMPLATE_STYLES = 'Module:Message box/%s.css' | |||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
-- | -- Helper functions | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
local function getTitleObject(...) | local function getTitleObject(...) | ||
-- | -- 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, ...) | local success, title = pcall(mw.title.new, ...) | ||
if success then | if success then | ||
Baris 49: | Baris 58: | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
-- | -- Box class definition | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
Baris 59: | Baris 68: | ||
local obj = {} | local obj = {} | ||
-- | obj.boxType = boxType | ||
-- Set the title object and the namespace. | |||
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() | obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle() | ||
-- | -- Set the config for our box type. | ||
obj.cfg = cfg[boxType] | obj.cfg = cfg[boxType] | ||
if not obj.cfg then | if not obj.cfg then | ||
local ns = obj.title.namespace | local ns = obj.title.namespace | ||
-- boxType | -- boxType is "mbox" or invalid input | ||
if args.demospace and args.demospace ~= '' then | if args.demospace and args.demospace ~= '' then | ||
-- | -- implement demospace parameter of mbox | ||
local demospace = string.lower(args.demospace) | local demospace = string.lower(args.demospace) | ||
if DEMOSPACES[demospace] then | if DEMOSPACES[demospace] then | ||
-- | -- use template from DEMOSPACES | ||
obj.cfg = cfg[DEMOSPACES[demospace]] | obj.cfg = cfg[DEMOSPACES[demospace]] | ||
obj.boxType = DEMOSPACES[demospace] | |||
elseif string.find( demospace, 'talk' ) then | elseif string.find( demospace, 'talk' ) then | ||
-- demo as a talk page | -- demo as a talk page | ||
obj.cfg = cfg.tmbox | obj.cfg = cfg.tmbox | ||
obj.boxType = 'tmbox' | |||
else | else | ||
-- default to ombox | -- default to ombox | ||
obj.cfg = cfg.ombox | obj.cfg = cfg.ombox | ||
obj.boxType = 'ombox' | |||
end | end | ||
elseif ns == 0 then | elseif ns == 0 then | ||
obj.cfg = cfg.ambox -- main namespace | obj.cfg = cfg.ambox -- main namespace | ||
obj.boxType = 'ambox' | |||
elseif ns == 6 then | elseif ns == 6 then | ||
obj.cfg = cfg.imbox -- file namespace | obj.cfg = cfg.imbox -- file namespace | ||
obj.boxType = 'imbox' | |||
elseif ns == 14 then | elseif ns == 14 then | ||
obj.cfg = cfg.cmbox -- category namespace | obj.cfg = cfg.cmbox -- category namespace | ||
obj.boxType = 'cmbox' | |||
else | else | ||
local nsTable = mw.site.namespaces[ns] | local nsTable = mw.site.namespaces[ns] | ||
if nsTable and nsTable.isTalk then | if nsTable and nsTable.isTalk then | ||
obj.cfg = cfg.tmbox -- any talk namespace | obj.cfg = cfg.tmbox -- any talk namespace | ||
obj.boxType = 'tmbox' | |||
else | else | ||
obj.cfg = cfg.ombox -- other namespaces or invalid input | obj.cfg = cfg.ombox -- other namespaces or invalid input | ||
obj.boxType = 'ombox' | |||
end | end | ||
end | end | ||
end | end | ||
-- | -- Set the arguments, and remove all blank arguments except for the ones | ||
-- listed in cfg.allowBlankParams. | -- listed in cfg.allowBlankParams. | ||
do | do | ||
Baris 111: | Baris 130: | ||
end | end | ||
-- | -- Define internal data structure. | ||
obj.categories = {} | obj.categories = {} | ||
obj.classes = {} | obj.classes = {} | ||
-- | -- For lazy loading of [[Module:Category handler]]. | ||
obj.hasCategories = false | obj.hasCategories = false | ||
Baris 125: | Baris 144: | ||
end | end | ||
if sort then | if sort then | ||
cat = string.format('[[ | cat = string.format('[[Category:%s|%s]]', cat, sort) | ||
else | else | ||
cat = string.format('[[ | cat = string.format('[[Category:%s]]', cat) | ||
end | end | ||
self.hasCategories = true | self.hasCategories = true | ||
Baris 138: | Baris 157: | ||
return nil | return nil | ||
end | end | ||
self.classes[class] = 1 | |||
end | |||
function MessageBox:removeClass(class) | |||
if not class then | |||
return nil | |||
end | |||
self.classes[class] = nil | |||
end | end | ||
Baris 155: | Baris 181: | ||
self.typeImage = typeData.image | self.typeImage = typeData.image | ||
-- | -- Find if the box has been wrongly substituted. | ||
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' | self.isSubstituted = cfg.substCheck and args.subst == 'SUBST' | ||
-- | -- Find whether we are using a small message box. | ||
self.isSmall = cfg.allowSmall and ( | self.isSmall = cfg.allowSmall and ( | ||
cfg.smallParam and args.small == cfg.smallParam | cfg.smallParam and args.small == cfg.smallParam | ||
Baris 167: | Baris 193: | ||
self.id = args.id | self.id = args.id | ||
self.name = args.name | self.name = args.name | ||
for _, class in ipairs(cfg.classes or {}) do | |||
self:addClass(class) | |||
end | |||
if self.name then | if self.name then | ||
self:addClass('box-' .. string.gsub(self.name,' ','_')) | self:addClass('box-' .. string.gsub(self.name,' ','_')) | ||
end | end | ||
local plainlinks = yesno(args.plainlinks) | |||
if plainlinks == true then | |||
self:addClass('plainlinks') | self:addClass('plainlinks') | ||
elseif plainlinks == false then | |||
self:removeClass('plainlinks') | |||
self: | |||
end | end | ||
if self.isSmall then | if self.isSmall then | ||
Baris 200: | Baris 229: | ||
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' | '^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$' | ||
) or self.name | ) or self.name | ||
templateName = ' | templateName = 'Template:' .. templateName | ||
self.templateTitle = getTitleObject(templateName) | self.templateTitle = getTitleObject(templateName) | ||
end | end | ||
Baris 207: | Baris 236: | ||
end | end | ||
-- | -- Process data for collapsible text fields. At the moment these are only | ||
-- {{ambox}}. | -- used in {{ambox}}. | ||
if self.useCollapsibleTextFields then | if self.useCollapsibleTextFields then | ||
-- Get the self.issue value. | -- Get the self.issue value. | ||
Baris 216: | Baris 245: | ||
local sect | local sect | ||
if args.sect == '' then | if args.sect == '' then | ||
sect = '' .. (cfg.sectionDefault or 'page') | sect = 'This ' .. (cfg.sectionDefault or 'page') | ||
elseif type(args.sect) == 'string' then | elseif type(args.sect) == 'string' then | ||
sect = '' .. args.sect | sect = 'This ' .. args.sect | ||
end | end | ||
local issue = args.issue | local issue = args.issue | ||
Baris 260: | Baris 289: | ||
end | end | ||
if talkTitle and talkTitle.exists then | 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 | self.talk = talkText | ||
end | end | ||
Baris 295: | Baris 318: | ||
end | end | ||
if date then | if date then | ||
self.date = string.format(" < | self.date = string.format(" <small class='date-container'>''(<span class='date'>%s</span>)''</small>", date) | ||
end | end | ||
self.info = args.info | self.info = args.info | ||
Baris 317: | Baris 340: | ||
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv | self.imageCellDiv = not self.isSmall and cfg.imageCellDiv | ||
self.imageEmptyCell = cfg.imageEmptyCell | self.imageEmptyCell = cfg.imageEmptyCell | ||
if cfg.imageEmptyCellStyle then | |||
self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px' | |||
end | |||
-- Left image settings. | -- Left image settings. | ||
Baris 328: | Baris 354: | ||
and (cfg.imageSmallSize or '30x30px') | and (cfg.imageSmallSize or '30x30px') | ||
or '40x40px' | or '40x40px' | ||
self.imageLeft = string.format('[[ | self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage | ||
or ' | or 'Information icon4.svg', imageSize) | ||
end | end | ||
end | end | ||
Baris 338: | Baris 364: | ||
self.imageRight = imageRight | self.imageRight = imageRight | ||
end | end | ||
end | end | ||
Baris 353: | Baris 375: | ||
local nums = {} | local nums = {} | ||
for _, prefix in ipairs{'cat', ' | for _, prefix in ipairs{'cat', 'category', 'all'} do | ||
args[prefix .. '1'] = args[prefix] | args[prefix .. '1'] = args[prefix] | ||
nums = union(nums, getArgNums(args, prefix)) | nums = union(nums, getArgNums(args, prefix)) | ||
Baris 364: | Baris 386: | ||
for _, num in ipairs(nums) do | for _, num in ipairs(nums) do | ||
local mainCat = args['cat' .. tostring(num)] | local mainCat = args['cat' .. tostring(num)] | ||
or args[' | or args['category' .. tostring(num)] | ||
local allCat = args['all' .. tostring(num)] | local allCat = args['all' .. tostring(num)] | ||
mainCat = type(mainCat) == 'string' and mainCat | mainCat = type(mainCat) == 'string' and mainCat | ||
Baris 428: | Baris 450: | ||
function MessageBox:setAllNamespaceCategories() | function MessageBox:setAllNamespaceCategories() | ||
-- Set categories for all namespaces. | -- Set categories for all namespaces. | ||
if self.isSubstituted then | if self.isSubstituted then | ||
self:addCat('all', ' | self:addCat('all', 'Pages with incorrectly substituted templates') | ||
end | end | ||
end | end | ||
Baris 455: | Baris 473: | ||
-- Convert category tables to strings and pass them through | -- Convert category tables to strings and pass them through | ||
-- [[Module:Category handler]]. | -- [[Module:Category handler]]. | ||
return require(' | return require('Module:Category handler')._main{ | ||
main = table.concat(self.categories[0] or {}), | main = table.concat(self.categories[0] or {}), | ||
template = table.concat(self.categories[10] or {}), | template = table.concat(self.categories[10] or {}), | ||
Baris 472: | Baris 490: | ||
:addClass('error') | :addClass('error') | ||
:wikitext(string.format( | :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('}}') | mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}') | ||
)) | )) | ||
end | end | ||
-- Add TemplateStyles | |||
root:wikitext( | root:wikitext(mw.getCurrentFrame():extensionTag{ | ||
name = 'templatestyles', | name = 'templatestyles', | ||
args = { src = self. | args = { src = TEMPLATE_STYLES:format(self.boxType) }, | ||
}) | }) | ||
-- | |||
-- | -- Create the box table. | ||
-- | local boxTable | ||
if self. | -- Check for fmbox because not all interface messages have mw-parser-output | ||
root: | -- which is necessary for TemplateStyles. Add the wrapper class if it is and | ||
-- then start the actual mbox, else start the mbox. | |||
if self.boxType == 'fmbox' then | |||
boxTable = root:tag('div') | |||
:addClass('mw-parser-output') | |||
:tag('table') | |||
else | |||
boxTable = root:tag('table') | |||
end | end | ||
boxTable:attr('id', self.id or nil) | boxTable:attr('id', self.id or nil) | ||
for | for class, _ in pairs(self.classes or {}) do | ||
boxTable:addClass(class or nil) | boxTable:addClass(class or nil) | ||
end | end | ||
Baris 515: | Baris 535: | ||
-- image width to 52px. If any images in a div are wider than that, | -- 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. | -- they may overlap with the text or cause other display problems. | ||
imageLeftCell = imageLeftCell:tag('div'): | imageLeftCell = imageLeftCell:tag('div'):css('width', '52px') | ||
end | end | ||
imageLeftCell:wikitext(self.imageLeft or nil) | imageLeftCell:wikitext(self.imageLeft or nil) | ||
Baris 525: | Baris 545: | ||
row:tag('td') | row:tag('td') | ||
:addClass('mbox-empty-cell') | :addClass('mbox-empty-cell') | ||
:cssText(self.imageEmptyCellStyle or nil) | |||
end | end | ||
Baris 537: | Baris 558: | ||
:addClass('mbox-text-span') | :addClass('mbox-text-span') | ||
:wikitext(self.issue or nil) | :wikitext(self.issue or nil) | ||
if (self.talk or self.fix) then | if (self.talk or self.fix) and not self.isSmall then | ||
textCellDiv:tag('span') | textCellDiv:tag('span') | ||
:addClass('hide-when-compact') | :addClass('hide-when-compact') | ||
Baris 551: | Baris 572: | ||
end | end | ||
if self.removalNotice then | if self.removalNotice then | ||
textCellDiv:tag(' | textCellDiv:tag('small') | ||
:addClass('hide-when-compact') | :addClass('hide-when-compact') | ||
:tag('i') | :tag('i') | ||
Baris 569: | Baris 590: | ||
-- If we are using a div, redefine imageRightCell so that the image | -- If we are using a div, redefine imageRightCell so that the image | ||
-- is inside it. | -- is inside it. | ||
imageRightCell = imageRightCell:tag('div'): | imageRightCell = imageRightCell:tag('div'):css('width', '52px') | ||
end | end | ||
imageRightCell | imageRightCell | ||
Baris 588: | Baris 609: | ||
if self.invalidTypeError then | if self.invalidTypeError then | ||
root:tag('div') | root:tag('div') | ||
: | :css('text-align', 'center') | ||
:wikitext(string.format( | :wikitext(string.format( | ||
'This message box is using an invalid "type=%s" parameter and needs fixing.', | 'This message box is using an invalid "type=%s" parameter and needs fixing.', |