Modulo:Message box
Questo è un modulo scritto in Lua. Le istruzioni che seguono sono contenute nella sottopagina Modulo:Message box/man (modifica • cronologia)
Sandbox: Modulo:Message box/Sandbox (modifica•cronologia) • Test: Modulo:Message box/Test (modifica•cronologia)
Questo è il meta-modulo che implementa i template di avviso {{Mbox}}, {{Ambox}}, {{Cmbox}}, {{Fmbox}}, {{Imbox}}, {{Ombox}}, and {{Tmbox}}. Questo è stato progettato per essere usato dai moduli Lua, e non dovrebbe essere usato direttamente dalle pagine wiki. Se intendi utilizzare le funzionalità di questo modulo da una pagina wiki, per favore al suo posto usa il singolo template di avviso.
Uso
Per poter caricare questo modulo da un altro modulo Lua, prima necessita di essere caricato.
local messageBox = require('Module:Message box')
Per creare un box di messaggio, usa la funzione main
. Questa funzione ha due parametri, il primo è il tipo di stile del messaggio e il secondo è la tabella che contiene i parametri del box del messaggio.
local box = messageBox.main( boxType, {
parametro1 = parametro1,
parametro2 = parametro2,
-- altri parametri...
})
Sono disponibili 7 tipi di messaggio:
Tipo | Template | Scopo |
---|---|---|
mbox |
{{Mbox}} | Per i box dei messaggi usati in namesapace diversi |
ambox |
{{Ambox}} | Per i box dei messaggi usati nei lemmi |
cmbox |
{{Cmbox}} | Per i box dei messaggi usati nelle categorie |
fmbox |
{{Fmbox}} | Per i box dei messaggi usati nell'interfaccia |
imbox |
{{Imbox}} | Per i box dei messaggi usati nei file |
tmbox |
{{Tmbox}} | Per i box dei messaggi usati nelle discussioni |
ombox |
{{Ombox}} | Per i box dei messaggi usati negli altri namespace |
Vedi la pagina di ogni template per i parametri disponibili.
Uso tramite #invoke
Così come la funzione main
, qesto modulo ha funzioni separate per ogni tipologia di box. Vi si accede usando il codice {{#invoke:Message box|mbox|...}}
, {{#invoke:Message box|ambox|...}}
, ecc. Funzioneranno quando vengono richiamati da altri moduli, ma accedono al codice utilizzato per elaborare gli argomenti passati da #invoke, e quindi chiamarli sarà meno efficiente che chiamare main
.
Dettagli tecnici
Il modulo usa diversi Il modulo utilizza lo stesso codice di base per ciascuno dei modelli sopra elencati; le differenze tra ognuna di esse sono configurate utilizzando i dati in Module:Message box/configuration. Ecco le varie opzioni di configurazione e il loro significato:
types
- una tabella contenente i dati utilizzati dal parametro type della finestra di messaggio. Le chiavi della tabella sono i valori che possono essere passati al parametro type e i valori della tabella sono tabelle che contengono la classe e l'immagine utilizzata da quel tipo.default
- il tipo di stile da utilizzare se non è viene passato alcun valore al parametro type o se è stato specificato un valore non valido.showInvalidTypeError
- per mostrare un errore se il valore passato al parametro type non è valido.allowBlankParams
- di solito i valori vuoti vengono rimossi dai parametri passati al modulo. Tuttavia, lo spazio bianco viene mantenuto per i parametri inclusi nella tabella allowBlankParams.allowSmall
- se è possibile visualizzare una versione ridotta della finestra di messaggio con "small=yes".smallParam
- un mome personalizzato per il parametro small. Per esempio, se viene impostato su "left" è possibile usare una vinestra piccola usando "small=left".smallClass
- la classe da utilizzare per il box del messaggio piccolo.substCheck
- whether to perform a subst check or not.classes
- un array delle classi da utilizzare con i box.imageEmptyCell
- se utilizzare un a cella<td>...</td>
se non ci sono immagini impostate. Viene utilizzato per preservare la spaziatura delle finestre di messaggio con una larghezza inferiore al 100% dello schermo.imageEmptyCellStyle
- se deve essere applicato uno stile alle cella vuote delle immagini.imageCheckBlank
- se "immagine=blank" non visualizza alcuna immagine.imageSmallSize
- in genere, le immagini utilizzate nelle caselle di messaggio piccole sono impostate su 30x30 px. Questo imposta una dimensione personalizzata.imageCellDiv
- se racchiudere l'immagine in un div che applica la dimensione massima dell'immagine.useCollapsibleTextFields
- e utilizzare i campi di testo che possono essere compressi, ad esempio "problema", "fix", "discussione", ecc. Attualmente utilizzato solo in ambox.imageRightNone
- se immaginedestra=none non visualizza nessuna immagine sul lato destro della finestra del messaggio.sectionDefault
- il nome di default per il parametro "sect". Dipende dauseCollapsibleTextFields
.allowMainspaceCategories
- accettare la categorizzazione nel namespace principale.templateCategory
- il nome di una categoria da inserire nella pagina del template.templateCategoryRequireName
- se il parametronome
è necessario è necessario per visualizzare la categoria del template.templateErrorCategory
- il nome della categoria di errore da utilizzare nella pagina del template.templateErrorParamsToCheck
- una serie di nomi di parametri da controllare. Se sono assenti,templateErrorCategory </ code> viene applicato alla pagina del template.
--[[ Questo è un meta-module Per la grafica di alcuni template, come ad esempio
{{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} e {{fmbox}}.
Il modulo è stato importato da:
* https://en.wikipedia.org/w/index.php?title=Module:Message_box&oldid=835732555
Carica i moduli necessari.]]
require('strict')
local getArgs
local yesno = require('Module:Yesno')
-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()
-- Define constants
local CONFIG_MODULE = 'Module:Message box/configuration'
--------------------------------------------------------------------------------
-- Funzioni d'aiuto
--------------------------------------------------------------------------------
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, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- 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 ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
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('[[Categoria:%s|%s]]', cat, sort)
else
cat = string.format('[[Categoria:%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.tipo -- setto la traduzione da type a tipo
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.nome -- Setto la traduzione da name a nome
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.stile
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.stiletesto
-- 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.testopiccolo then
self.issue = args.testopiccolo
else
local sect
if args.sect == '' then
-- a differenza dell'inglese l'italiano differenzia il maschile e il femminile di "questo" è perciò necessirio arrangiarsi così
sect = 'Quest' .. (cfg.sectionDefault or 'a pagina')
elseif type(args.sect) == 'string' then
-- anche qui sotto, stassa storia della nota sopra
sect = 'Quest' .. args.sect .. ' '
end
local issue = args.problema
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.testo
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 = 'La discussione associata può essere trovata nella'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s la [[%s#%s|pagina di discussione]].',
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.noteRimozione
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.testopiccolo or args.testo
else
self.text = args.testo
end
-- Set the below row.
self.below = cfg.below and args.sotto
-- 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.immaginepiccola or args.immagine
if cfg.imageCheckBlank and imageLeft ~= 'trasparente' and imageLeft ~= 'nessuna' 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 'Information icon4.svg', imageSize)
end
end
-- Right image settings.
local imageRight = self.isSmall and args.immaginepiccoladestra or args.immaginedestra
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
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.data
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, 'Articoli con il parametro date non valido nel 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()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.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 = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
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', 'Message box con parametri da correggere', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pagine con template substati in maniera errata')
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]].
return require('Module:Category handler')._main{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox: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> non stato substato correttamente.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
:tag('sup'):tag('small')
:wikitext(string.format(
'([[Aiuto:Template#subst|cosa vuol dire?]]).'
))
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
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.imageLeft or 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.imageEmptyCellStyle or nil)
end
-- Add the text.
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.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) and not self.isSmall then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
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.
if self.imageRight then
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')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:css('text-align', 'center')
:wikitext(string.format(
'Questo messaggio sta usando un parametro non valido "type=%s" deve perciò essere corretto.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
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 mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)