Modulo:Incontro sportivo
Istruzioni per l'uso
Questo è un modulo scritto in Lua. Le istruzioni che seguono sono contenute nella sottopagina Modulo:Incontro sportivo/man (modifica · cronologia)
Sandbox: Modulo:Incontro sportivo/sandbox (modifica · cronologia) · Sottopagine: lista · Test: Modulo:Incontro sportivo/test (modifica · cronologia · Esegui)
Questo è un modulo scritto in Lua. Le istruzioni che seguono sono contenute nella sottopagina Modulo:Incontro sportivo/man (modifica · cronologia)
Sandbox: Modulo:Incontro sportivo/sandbox (modifica · cronologia) · Sottopagine: lista · Test: Modulo:Incontro sportivo/test (modifica · cronologia · Esegui)
Questo modulo implementa le funzionalità dei template {{Incontro di club}} e {{Incontro internazionale}}.
Ha una sottopagina CSS: Modulo:Incontro sportivo/styles.css.
local p = {}
local errorcat = '[[Categoria:Errori di compilazione del template Incontro %s]]'
-- Argomenti propri solo del template Incontro internazionale
local int_args = {
'Codice disciplina', 'Salvezza 1', 'Salvezza 2'
}
-- Argomenti propri solo del template Incontro di club
local club_args = {
'Singoli 1', 'Singoli 2', 'Doppi 1', 'Doppi 2', 'Tripli 1',
'Tripli 2', 'Penalita 1', 'Penalita 2'
}
-- Argomenti e relative etichette della sottotabella delle statistiche
local labels = {
{ Marcatori = 'Marcatori' },
{ Mete = '[[Meta (rugby)|mt]]' },
{ Trasformazioni = '[[Meta (rugby)#Trasformazione|tr]]' },
{ ['Calci piazzati'] = '[[Calcio piazzato#Rugby|c.p.]]' },
{ Drop = '[[Drop (rugby)|drop]]' },
{ Mark = '[[Mark (rugby)|mark]]' },
{ Punti = 'Punti' },
{ Assist = '[[Assist (pallacanestro)|Assist]]' },
{ Rimbalzi = '[[Rimbalzo|Rimbalzi]]' },
{ Valide = '[[Valida|Valide]]' },
{ Errori = '[[Errore (baseball)|Errori]]' },
{ Vittoria = '[[Vittoria (baseball)|Vittoria]]' },
{ Sconfitta = '[[Sconfitta (baseball)|Sconfitta]]' },
{ Salvezza = '[[Salvezza (baseball)|Salvezza]]' },
{ Singoli = 'Singoli' },
{ Doppi = '[[Doppio (baseball)|Doppi]]' },
{ Tripli = '[[Triplo (baseball)|Tripli]]' },
{ Fuoricampo = '[[Fuoricampo (baseball)|Fuoricampo]]' },
{ TiriExtra = {
rig = '[[Tiri di rigore]]',
cp = '[[Calcio piazzato#Rugby|Calci piazzati]]',
so = '[[Shootout]]'
} },
{ Penalita = 'Penalità' },
{ Formazione = 'Formazioni' },
{ Sostituzioni = 'Sostituzioni' },
{ Allenatore = 'Allenatori' }
}
-- Restituisce true se trova l'ago (valore) nel pagliaio (tabella)
local function in_array(needle, haystack)
if needle == nil then return end
for _, v in ipairs(haystack) do
if v == needle then return true end
end
return
end
-- Racchiude un argomento tra pre e post convertendo i nil in stringa vuota
local function wrap(arg, pre, post)
if not arg then return '' end
return mw.ustring.format('%s%s%s', pre or '', arg, post or '')
end
-- Formatta un messaggio di avviso e allega la categoria di errore
local function set_error(msg)
return string.format('<span class="error">%s</span>%s', msg, errorcat)
end
-- Carica il valore nel template Bandiera e ne restituisce il risultato
local function loadFlag(naz)
if not naz then return '' end
return mw.getCurrentFrame():expandTemplate {
title = 'Bandiera',
args = { naz }
}
end
-- =============================================================================
-- Classe Incontro
-- =============================================================================
local Incontro = {}
-- Costruttore della classe Incontro
function Incontro:new(args)
local self = {}
setmetatable(self, { __index = Incontro } )
self.args = args
return self
end
-- Restituisce i contenuti della colonna a sinistra
function Incontro:_getLeftContent()
local pre_cit, post_cit, cit, gm, anno, ora, turno
pre_cit = '[[' .. (self.args['CittàLink'] and (self.args['CittàLink'] .. '|') or '')
post_cit = ']]' .. (self.args.Giornomese and '<br/>' or '')
cit = wrap(self.args['Città'], pre_cit, post_cit)
gm, anno = self.args.Giornomese or '', self.args.Anno or ''
ora = wrap(self.args.Ora, ', ore ')
turno = wrap(self.args.Turno, '<br/>')
return mw.ustring.format('%s%s %s%s%s', cit, gm, anno, ora, turno)
end
-- Restituisce i contenuti della colonna al centro
function Incontro:_getMiddleContent()
local punt, punt2, supp, cdr, parz, note, ref, ref2
punt, punt2 = self.args['Punteggio 1'] or '', self.args['Punteggio 2'] or ''
local validate = function(s)
return s and string.upper(s) == 'X' and '' or s
end
supp = wrap(validate(self.args.Supplementari), '<br/>([[Tempi supplementari|d.', 't.s.]])')
cdr = wrap(validate(self.args['Calci di rigore']), '<br/>([[Tiri di rigore|d.', 'c.r.]])')
parz = wrap(self.args.Parziali, '<br/>(', ')')
note = wrap(self.args.Note, '<br/>')
ref = wrap(self.args.Referto, '<br/>[', ' referto]')
ref2 = wrap(self.args['Referto 2'], '<br/>[', ' referto 2]')
return mw.ustring.format("'''%s – %s'''<small>%s%s%s%s%s%s</small>",
punt, punt2, supp, cdr, parz, note, ref, ref2)
end
-- Restituisce le righe della colonna a destra elaborando
-- i parametri nominali a gruppi per numero
function Incontro:_renderRightRow(v)
if not self.args[v] then return nil end
local msg = {}
local subargs = {
Arbitro = { label = 'Arbitr' .. (self.args.Arbitro2 and 'i' or 'o'), naz = 'Nazarbitro', cit = 'Cittarbitro' },
Cronometrista = { label = 'Crono', naz = 'Nazcronometrista', cit = 'Cittacronometrista' }
}
local i = 1
local getValue = function(t)
for k, v in pairs(t) do
t[k] = self.args[v .. (i == 1 and '' or i)]
end
return t[1], t[2], t[3]
end
while true do
local main_arg, naz, cit = getValue({ v, subargs[v].naz, subargs[v].cit })
-- parametri multipli per gli arbitri, uno solo per il cronometrista
if not main_arg or i == 2 and v == 'Cronometrista' then break end
naz = loadFlag(naz)
cit = wrap(cit, '(', ')')
msg[i] = mw.ustring.format('%s %s %s', naz, main_arg, cit)
i = i + 1
end
local row = mw.html.create('tr')
:tag('td'):wikitext(subargs[v].label .. ': '):done()
:tag('td'):wikitext(table.concat(msg, '<br/>')):done()
return row
end
-- Restituisce i contenuti della colonna a destra
function Incontro:_getRightContent()
local root, stad, spet
stad = self.args.Stadio or ''
spet = wrap(self.args.Spettatori, ' <span class="nowrap">(', ' spett.)</span>')
if self.args.Arbitro then
root = mw.html.create('table')
:node(self:_renderRightRow('Arbitro'))
:node(self:_renderRightRow('Cronometrista'))
else
root = ''
end
return mw.ustring.format('%s%s%s', stad, spet, tostring(root))
end
-- Formatta e restituisce il primo o il secondo team indicato
function Incontro:_renderTeam(n)
local team, flag
if self.args[1] == 'internazionale' then
team = self.args['Nazionale ' .. n]
flag = loadFlag(team)
local altro = self.args['Altro' .. n] or ''
if self.args['Codice disciplina'] == 'BV' then
return n == 1 and (altro .. ' ' .. flag) or (flag .. ' ' .. altro)
else
local F = self.args.F == 'X' and 'F' or ''
local sesso = self.args.Sesso or ''
return mw.getCurrentFrame():expandTemplate{
title = 'Naz' .. (n == 1 and 'BD' or ''),
args = { self.args['Codice disciplina'], team, F .. sesso, altro, 'h' }
}
end
end
team = self.args['Squadra ' .. n]
flag = self.args['Bandiera ' .. n]
if not team then return end
local sport = self.args['Sport']
if sport then
local frame = mw.getCurrentFrame()
-- chiamata protetta per verificare l'esistenza del template
local success, result = pcall(frame.expandTemplate, frame, {
title = string.format('Template:%s %s', sport, team),
args = {
n == 1 and 'BD' or '',
self.args['ForzaAnnoSquadra ' .. n] or self.args.Anno
}
})
if success then return result end
end
if flag then
flag = '[[File:' .. flag .. '|border|20px|class=noviewer]]'
return n == 1 and (team .. ' ' .. flag) or (flag .. ' ' .. team)
end
return team
end
-- Restituisce la sottotabella HTML contenente le statistiche
function Incontro:_getStatsTableNode()
local collapsible = self.args.Collassato and 'mw-collapsible mw-collapsed noprint' or ''
local root = mw.html.create('table')
:addClass(collapsible .. ' nowraplinks idc-subtable')
root:tag('td')
:attr('colspan', 3)
local subtable = false
-- elaborazione ordinata degli argomenti
for _, t in ipairs(labels) do
local k, label = next(t) -- ottiene chiave ed etichetta
local value1, value2 = self.args[k .. ' 1'], self.args[k .. ' 2']
if k == 'TiriExtra' and self.args.TiriExtra then
-- quando TiriExtra è compilato, la riga va sempre processata
value1, value2 = value1 or '', value2 or ''
if self.args[1] == 'internazionale' then
local needle = self.args['Codice disciplina']
local haystacks = {
{'CA', 'C5', 'FS', 'BS', 'RH'},
{'R13', 'R15'},
{'HG', 'SH', 'HP', 'PN', 'goalball'}
}
self.args.TiriExtra = in_array(needle, haystacks[1]) and 'rig' or
in_array(needle, haystacks[2]) and 'cp' or
in_array(needle, haystacks[3]) and 'so' or ''
end
label = label[self.args.TiriExtra] or set_error('Codice per TiriExtra non riconosciuto')
label = mw.ustring.format('%s<br/>%s – %s',
label, self.args['PuntiTiriExtra 1'] or '', self.args['PuntiTiriExtra 2'] or '')
elseif k == 'Allenatore' then
local all1, all2 = self.args[k .. ' 1'], self.args[k .. ' 2']
local naz1, naz2 = self.args.NazAll1, self.args.NazAll2
if all1 and naz1 then
value1 = all1 .. ' ' .. loadFlag(naz1)
end
if all2 and naz2 then
value2 = loadFlag(naz2) .. ' ' .. all2
end
end
-- controllo su label necessario per via di TiriExtra
if (value1 or value2) and type(label) == 'string' then
subtable = true
local haystack = { 'TiriExtra', 'Formazione', 'Sostituzioni' }
if in_array(k, haystack) then
value1 = value1 and '<br/>' .. value1
value2 = value2 and '<br/>' .. value2
end
root:tag('tr')
:tag('td'):wikitext(value1):done()
:tag('td'):wikitext(label):done()
:tag('td'):wikitext(value2):done()
end
end
return subtable and mw.html.create('td'):attr('colspan', 5):node(root) or nil
end
-- Restituisce la tabella HTML principale seguita da un tag hr
function Incontro:getHTML()
local background = self.args.Sfondo == 'on' and '' or 'idc-sfondo'
local root = mw.html.create('table')
:addClass('idc-maintable ' .. background)
:attr('id', self.args.id)
:tag('tr')
:tag('td'):wikitext(self:_getLeftContent()):done()
:tag('td'):wikitext(self:_renderTeam(1)):done()
:tag('td'):wikitext(self:_getMiddleContent()):done()
:tag('td'):wikitext(self:_renderTeam(2)):done()
:tag('td'):wikitext(self:_getRightContent()):done()
:done()
root
:node(self:_getStatsTableNode()):done()
return tostring(root) .. '<hr>'
end
-- Funzione per {{Incontro di club}} e {{Incontro internazionale}}
function p.main(frame)
local args = { frame.args[1] }
local styles = 'Modulo:Incontro sportivo/styles.css'
local current_page = mw.title.getCurrentTitle()
local current_namespace = current_page.namespace
errorcat = current_namespace ~= 0 and '' or string.format(errorcat,
args[1] == 'club' and 'di club' or 'internazionale')
-- carica argomenti in base alla chiamata del template
for k, v in pairs(frame:getParent().args) do
if k ~= 1 and v ~= nil and v ~= '' and
(args[1] == 'club' and not in_array(k, int_args) or
args[1] == 'internazionale' and not in_array(k, club_args)) then
args[k] = v
end
end
return frame:extensionTag{
name = 'templatestyles',
args = {src = styles}
} .. Incontro:new(args):getHTML()
end
return p