Modulo:Elezioni/sandbox: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
mNessun oggetto della modifica
m no colore sfondo
 
(84 versioni intermedie di 2 utenti non mostrate)
Riga 1:
require('Module:No globalsstrict')
 
local p = {}
local getArgs = require('Module:Arguments').getArgs
local colore = require('Module:Partiti').colore
local tcella = '<th>Voti</th><th>%</th>'
local ff = function (key, value)
if type(key) == "number" then
if value == nil then return nil else value = mw.text.trim(value) end
else
if value == '' then return nil end
end
return value
end
local edate = '<br/><span style="font-size:85%%">%s</span>'
 
-- html per affiancamento di tabelle tramite parametro "allinea"
local function vrg(a,b,c)
local s1,flex k= {}
flex['primo'] = {'<div style="display:flex;flex-direction:row;flex-wrap:wrap"><div style="flex-grow:0;flex-shrink:0;flex-basis:auto;padding: 0 2em 0 0">','</div>','0'}
local s2 = a
flex['medio'] = {'<div style="flex-grow:0;flex-shrink:0;flex-basis:auto;padding: 0 2em 0 0">','</div>','0'}
if (c == 1) then
flex['ultimo'] = {'<div style="flex-grow:0;flex-shrink:0;flex-basis:auto;padding: 0 2em 0 0">','</div></div>','0'}
s1 = '<b>%s</b></td><td><b>%4.2f</b>'
flex['centro'] = { [3] = 'auto' }
else
 
s1 = '%s</td><td>%4.2f'
-- crea unico array per stringa
local function agg(a,...)
local args = {...}
for _, s in ipairs(args) do
table.insert(a, s)
end
end
 
-- estrae voce del partito da eventuale wikilink
local function estrai(partito)
local a = partito
local x1 = mw.ustring.find(a,'%[%[')
if (x1) then
local b = mw.ustring.sub(a,x1+2)
local x2 = mw.ustring.find(b,'%|')
local x3 = mw.ustring.find(b,'%]%]')
if (x3) then
if (x2) then
a = mw.ustring.sub(a,x1+2,x2+x1)
else
a = mw.ustring.sub(a,x1+2,x3+x1)
end
end
end
return a
end
 
-- formato numero
local function formato(a)
local s = ''..a
local k
while true do
s2s, k = string.s:gsub(s2, "^(-?%d+)(%d%d%d)", '%1&nbsp;%2')
if (k==0) then break end
end
return s
s1 = string.format(s1, s2, 100*tonumber(a)/b)
s1 = s1:gsub('%.',',')
s1 = '<td>' .. s1
if (a<b) then s1 = s1 .. '<div style="width:100px;background:#f0f0f0;border:1px solid #eee;height:3px"><div style="width:'..math.floor(0.5+100*tonumber(a)/b)..'px;background:#007cc3;height:3px"></div></div>' end
s1 = s1 ..'</td>'
return s1
end
 
-- calcola percentuale
local function colora(a,b,c)
local clrfunction = '#eee'percento(a,b)
local s1 = string.format('<small>%4.2f</small>',100*tonumber(a)/b)
if (a) then
return s1:gsub('%.',',')
local x1 = string.find(a,'%[%[')
end
if (x1) then
 
local x2 = string.find(a:sub(x1),'%|')
-- recupera colore del partito da Modulo:Partiti
local x3 = string.find(a:sub(x1),'%]%]')
-- a = partito; b = colore opzionale
if (x3) then
local function colora(a,b)
if (x2) then
return colore({a,(b or '#EEE')})
a = a:sub(x1+2,x2-1)
end
else
 
a = a:sub(x1+2,x3-1)
-- controlla possibili errori nei dati numerici inseriti per primo e secondo turno
end
-- el,el2 = elettori; vt,vt2 = votanti; tt,tt2 = totale; bi,bi2 = schede bianche
end
local function verifica(e,el,vt,tt,bi,na,b,el2,vt2,tt2,bi2,na2)
local err = e
if (vt == -1) then
agg(err,' Non indicati votanti della votazione.')
elseif (el == -1) then
agg(err,'Non indicati elettori della votazione.')
elseif (vt < tt) then
agg(err,' Il totale è superiore al numero di votanti.')
elseif ((bi>-1) and (vt < tt+bi)) then
agg(err,' Il numero di schede bianche è superiore al numero di voti non validi.')
elseif ((na>-1) and (vt < tt+na)) then
agg(err,' Il numero di schede non assegnate è superiore al numero di voti non validi.')
elseif ((bi>-1) and (na>-1) and (vt < tt+bi+na)) then
agg(err,' Il numero di schede bianche e non assegnate è superiore al numero di voti non validi.')
end
if (b>0) then
if (vt2 == -1) then
agg(err,' Non indicati votanti del ballottaggio.')
elseif (el2 == 0) then
agg(err,' Non indicati elettori del ballottaggio.')
elseif (vt2 < tt2) then
agg(err,' Il totale è superiore al numero di votanti nel ballottaggio.')
elseif ((bi2>0) and (vt2 < tt2+bi2)) then
agg(err,' Il numero di schede bianche è superiore al numero di voti non validi.')
elseif ((na2>0) and (vt2 < tt2+na2)) then
agg(err,' Il numero di schede non assegnate è superiore al numero di voti non validi.')
elseif ((bi2>0) and (na2>0) and (vt2 < tt2+bi2+na2)) then
agg(err,' Il numero di schede bianche e non assegnate è superiore al numero di voti non validi.')
end
clr = colore({a,(b or clr)})
end
return clrerr
end
 
-- restituisce il colore del partito
function p.colorato(frame)
local args = getArgs(frame, { valueFunc = ff })
return colore({args[1],'#EEE'})
end
 
-- crea linea vuota su nn colonne
local function l_vuota(nn)
return string.format('<tr class="sortbottom"><td colspan=%d></td></tr>',nn)
end
 
-- Crea linea con dati voti e percentuali
-- a: scritta; b: voti; c: percentuale
-- d: ballottaggio; e:voti; f: percentuale;
local function l_semplice(a,b,c,d,e,f)
if (d>0) then
return string.format('<tr class="sortbottom"><td align=left colspan=3>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>',a,formato(b),percento(b,c),formato(e),percento(e,f))
else
return string.format('<tr class="sortbottom"><td align=left colspan=3>%s</td><td>%s</td><td>%s</td></tr>',a,formato(b),percento(b,c))
end
end
 
-- crea tabella per elezione uninominale
function p.unico(frame)
local args = getArgs(frame, { valueFunc = ff })
local elettori = tonumber(args['elettori'] or -1)
valueFunc = function (key, value)
if type(key) == "number" then
if value == nil then
return nil
else
value = mw.text.trim(value)
end
else
if value == '' then return nil end
end
return value
end
})
local elettori = tonumber(args['elettori'] or 0)
local elettori2 = tonumber(args['elettori2'] or elettori)
local votanti = tonumber(args['votanti'] or 0-1)
local votanti2 = tonumber(args['votanti2'] or 0-1)
local bianche = tonumber(args['bianche'] or -1)
local bianche2 = tonumber(args['bianche2'] or 0)
local noassegnate = tonumber(args['noassegnate'] or -1)
local noassegnate2 = tonumber(args['noassegnate2'] or 0)
local noesito = tonumber(args['noesito'] or 0)
local edata = ''
if (args['data']) then edata = string.format(edate,args['data']) end
local edata2 = ''
if (args['data2']) then edata2 = string.format(edate,args['data2']) end
local ball = tonumber(args['ball1'] or 0)
local titolo = args['titolo'] or ''
local errallinea = args['allinea'] or '-'
local sssolovotanti = args['solovotanti'] and 0 or 1
local numerr = 0{}
agg(err, '<p style="color:#800"><b>Errore nel template:</b>')
local ss = {}
local num = 1
local tot,tot2 = 0,0
local dati = {}
 
ss = '<table class="wikitable" style="text-align:right;margin:10px auto"><caption>'..titolo..'</caption><tr><th rowspan=2>Candidato</th><th rowspan=2 colspan=2>Partito</th><th colspan=2>'
if (ball>0) then ss= ss..'Primo turno</th><th colspan=2>Ballottaggio' else ss = ss..'Risultati' end
ss = ss..'</tr><tr><th>Voti</th><th>%</th>'
if (ball>0) then ss= ss..'<th>Voti</th><th>%</th>' end
ss = ss..'</tr>'
num = 1
while (args['cand'..num]) do
if (args['voti'..num]) then
dati[num] = {
tot = tot+tonumber(args['voti'..num])
tot2 n = args['cand'..num], v = tonumber(args['voti'..num]), b = tot2+tonumber(args['ball'..num] or 0-1),
p = args['part'..num] or '—', c = colora(args['part'..num] or '',args['col'..num])
}
tot = tot+dati[num].v
if (dati[num].b > -1) then tot2 = tot2 + dati[num].b end
else
agg(err =, 'non Non indicato il numero di voti per il candidato '..num..'.')
end
num = num+1
end
if (votanti == 0 or elettori == 0) then err = 'non indicati elettori o votanti della votazione' end
if (ball>0) then
if (votanti2 == 0 or elettori2 == 0) then err = 'non indicati elettori o votanti del ballottaggio' end
end
num = num-1
 
for i=1,num do
err = verifica(err,elettori,votanti,tot,bianche,noassegnate,ball,elettori2,votanti2,tot2,bianche2,noassegnate2)
if (i==1) then
if (#err == 1) then
ss = ss..string.format('<tr><td align=left><b>%s</b></td><td style="width:8px;background:%s"> </td><td align=left>%s</td>', args['cand'..i], colora(args['part'..i],args['col'..i]), (args['part'..i] or '—'))
if (ball>0flex[allinea]) then agg(ss,flex[allinea][1]) end
 
ss = ss..vrg(args['voti'..i],tot,0)
agg(ss,'<table class="wikitable sortable" style="text-align:right;margin:10px ',flex[allinea] and flex[allinea][3] or '0','"><caption>',titolo,'</caption>')
ss = ss..vrg(args['ball'..i],tot2,1)
 
agg(ss,'<tr><th rowspan=2 colspan=2>Partito</th><th rowspan=2>Candidato</th><th colspan=2>')
if (ball>0) then agg(ss,'Primo turno',edata,'</th><th colspan=2>Ballottaggio',edata2) else agg(ss,'Risultati',edata) end
agg(ss,'</th></tr><tr>',tcella,((ball>0) and tcella or ''),'</tr>')
 
for i=1,num do
if (i==1 and noesito == 0) then
agg(ss,'<tr style="font-weight:bold;color:black; background:#fdfbde">')
else
agg(ss = ss..vrg(args[,'voti<tr>'..i],tot,1)
end
agg(ss,string.format('<td style="width:0;color:black;background:%s"></td><td align=left>%s</td><td align=left>%s</td>', dati[i].c, dati[i].p, dati[i].n))
ss = ss..'</tr>'
agg(ss,string.format('<td>%s</td><td>%s</td>',formato(dati[i].v),percento(dati[i].v,tot)))
else
ssif =(dati[i].b>-1) then agg(ss..,string.format('<tr><td align=left>%s</td><td style="width:8px;background:%s"> </td><td align=left>%s</td>', args['cand'..i], coloraformato(argsdati['part'..i],args['col'..i]b), percento(argsdati['part'..i] or '—'.b,tot2))) end
agg(ss,'</tr>')
ss = ss.. vrg(args['voti'..i],tot,0)
if (args['ball'..i]) then ss = ss..vrg(args['ball'..i],tot2,0) end
ss = ss..'</tr>'
end
agg(ss,l_vuota((ball>0) and 7 or 5))
end
agg(ss,l_semplice('Iscritti',elettori,elettori,ball,elettori2,elettori2))
ss = ss..string.format('<tr><td colspan=%d></td></tr>', ball>0 and 7 or 5)
agg(ss,l_semplice('&#x21b3; Votanti <small>(% su iscritti)</small>',votanti,elettori,ball,votanti2,elettori2))
ss = ss..'<tr><td colspan=3>Iscritti</td>'..vrg(elettori,elettori,0)
if (solovotanti == 1) then
if (ball>0) then ss = ss..vrg(elettori2,elettori2,0) end
agg(ss,l_semplice('&ensp;&#x21b3; Voti validi <small>(% su votanti)</small>',tot,votanti,ball,tot2,votanti2))
ss = ss..'</tr><tr><td colspan=3>Astenuti</td>'..vrg(elettori-votanti,elettori,0)
agg(ss,l_semplice('&ensp;&#x21b3; Voti non validi <small>(% su votanti)</small>',votanti-tot,votanti,ball,votanti2-tot2,votanti2))
if (ball>0) then ss = ss..vrg(elettori2-votanti2,elettori2,0) end
if (bianche>-1 or bianche2>0 or noassegnate>-1 or noassegnate2>0) then
ss = ss..'</tr><tr><td colspan=3>Votanti</td>'..vrg(votanti,elettori,0)
local pz, pz2 = 0,0
if (ball>0) then ss = ss..vrg(votanti2,elettori2,0) end
if (bianche>-1 or bianche2>0) then
ss = ss..'</tr><tr><td colspan=3>Voti non validi</td>'..vrg(votanti-tot,votanti,0)
pz = pz + bianche
if (ball>0) then ss = ss..vrg(votanti2-tot2,votanti2,0) end
pz2 = pz2 + bianche2
ss = ss..'</tr><tr><td colspan=3>Voti validi</td>'..vrg(tot,votanti,0)
agg(ss,l_semplice('&ensp;&ensp;&#x21b3; Schede bianche <small>(% su votanti)</small>',bianche,votanti,ball,bianche2,votanti2))
if (ball>0) then ss = ss..vrg(tot2,votanti2,0) end
end
ss = ss..'</tr></table>'
if (errnoassegnate>-1 ==or '-'noassegnate2>0) then
pz = pz + noassegnate
return ss
pz2 = pz2 + noassegnate2
agg(ss,l_semplice('&ensp;&ensp;&#x21b3; Schede non assegnate <small>(% su votanti)</small>',noassegnate,votanti,ball,noassegnate2,votanti2))
end
pz = votanti - tot - pz
pz2 = votanti2 - tot2 - pz2
agg(ss,l_semplice('&ensp;&ensp;&#x21b3; Schede nulle <small>(% su votanti)</small>',pz,votanti,ball,pz2,votanti2))
end
end
agg(ss,l_semplice('&#x21b3; Astenuti <small>(% su iscritti)</small>',elettori-votanti,elettori,ball,elettori2-votanti2,elettori2))
if (args['nota']) then
agg(ss,l_vuota((ball>0) and 7 or 5))
agg(ss,string.format('<tr class="sortbottom"><td style="width:0;background:%s"></td><td align=left colspan=%d style="font-size:90%%">%s</td></tr>', (noesito == 0) and dati[1].c or 'none',(ball>0 and 6 or 4),args['nota']))
elseif (noesito == 1) then
agg(ss,l_vuota((ball>0) and 7 or 5))
agg(ss,string.format('<tr class="sortbottom"><td></td><td align=left colspan=%d style="font-size:90%%">Collegio non assegnato</td></tr>', (ball>0 and 6 or 4)))
elseif (args['part0'] and not (dati[1].p == '—')) then
agg(ss,l_vuota((ball>0) and 7 or 5))
agg(ss,string.format('<tr class="sortbottom"><td style="width:0;background:%s"></td><td align=left colspan=%d style="font-size:90%%"><b>Esito:</b> ', dati[1].c,(ball>0 and 6 or 4)))
if (estrai(dati[1].p) == estrai(args['part0'])) then
agg(ss,string.format('collegio confermato a %s', dati[1].p))
elseif (args['part0'] == 'n') then
agg(ss,string.format('collegio a %s (nuovo collegio)',dati[1].p))
else
agg(ss,string.format('collegio passa da %s a %s',args['part0'],dati[1].p))
end
agg(ss,'</td></tr>')
end
agg(ss,'</table>')
if (flex[allinea]) then agg(ss,flex[allinea][2]) end
return table.concat(ss)
else
agg(err,'</p>')
return '<p style="color:red"><b>Errore nel template:</b> '..err..'</p>'
return table.concat(err)
end
end
 
-- crea tabella per elezione plurinominale
function p.poli(frame)
local args = getArgs(frame, { valueFunc = ff })
local elettori = tonumber(args['elettori'] or -1)
valueFunc = function (key, value)
if type(key) == "number" then
if value == nil then
return nil
else
value = mw.text.trim(value)
end
else
if value == '' then return nil end
end
return value
end
})
local elettori = tonumber(args['elettori'] or 0)
local elettori2 = tonumber(args['elettori2'] or elettori)
local votanti = tonumber(args['votanti'] or 0-1)
local votanti2 = tonumber(args['votanti2'] or 0-1)
local validi = tonumber(args['validi'] or -1)
local validi2 = tonumber(args['validi2'] or -1)
local edata = ''
if (args['data']) then edata = string.format(edate,args['data']) end
local edata2 = ''
if (args['data2']) then edata2 = string.format(edate,args['data2']) end
local eletti = tonumber(args['eletti'] or 0)
local ball = tonumber(args['ball1'] or args['ball2'] or args['ball3'] or args['ball4'] or args['ball5'] or 0)
local titolo = args['titolo'] or ''
local errallinea = args['allinea'] or '-'
local sserr = ''{}
agg(err, '<p style="color:#800"><b>Errore nel template:</b>')
local num = 0
local tot,tot2ss = 0,0{}
local num = 1
local dati = {}
 
ss = '<table class="wikitable" style="text-align:right;margin:10px auto"><caption>'..titolo..'</caption><tr><th rowspan=2>Candidato</th><th rowspan=2 colspan=2>Partito</th><th colspan=2>'
if (ball>0) then ss= ss..'Primo turno</th><th colspan=2>Ballottaggio' else ss = ss..'Risultati' end
ss = ss..'</th></tr><tr><th>Voti</th><th>%</th>'
if (ball>0) then ss= ss..'<th>Voti</th><th>%</th>' end
ss = ss..'</tr>'
num = 1
while (args['cand'..num]) do
if (args['voti'..num]) then
dati[num] = {
tot = tot+tonumber(args['voti'..num])
tot2 n = args['cand'..num], v = tonumber(args['voti'..num]), b = tot2+tonumber(args['ball'..num] or 0-1),
p = args['part'..num] or '—', c = colora(args['part'..num] or '',args['col'..num])
}
else
agg(err = ,'non Non indicato il numero di voti per il candidato '..num..'.')
end
num = num+1
end
if (votanti == 0 or elettori == 0 or eletti == 0) then err = 'non indicati elettori, votanti o eletti della votazione' end
if (ball>0) then
if (votanti2 == 0 or elettori2 == 0) then err = 'non indicati elettori o votanti del ballottaggio' end
end
num = num-1
 
for i=1,num do
err = verifica(err,elettori,votanti,votanti,-1,-1,ball,elettori2,votanti2,votanti2,0,0)
if (i<=eletti) then
if (eletti == 0) then agg(err,' Non indicato numero eletti.') end
ss = ss..string.format('<tr><td align=left><b>%s</b></td><td style="width:8px;background:%s"> </td><td align=left>%s</td>', args['cand'..i], colora(args['part'..i],args['col'..i]), (args['part'..i] or '—'))
if (ball>0#err == 1) then
if (flex[allinea]) then agg(ss,flex[allinea][1]) end
ss = ss..vrg(args['voti'..i],votanti,0)
agg(ss,'<table class="wikitable sortable" style="text-align:right;margin:10px ',flex[allinea] and flex[allinea][3] or '0','"><caption>',titolo,'</caption>')
ss = ss..vrg(args['ball'..i],votanti2,1)
agg(ss,'<tr><th rowspan=2 colspan=2>Partito</th><th rowspan=2>Candidato</th><th colspan=2>')
if (ball>0) then agg(ss,'Primo turno',edata,'</th><th colspan=2>Ballottaggio',edata2) else agg(ss,'Risultati',edata) end
agg(ss,'</th></tr><tr>',tcella,((ball>0) and tcella or ''),'</tr>')
 
for i=1,num do
if (i<=eletti) then
agg(ss,'<tr style="font-weight:bold;background:#fdfbde">')
else
agg(ss,'<tr>')
ss = ss..vrg(args['voti'..i],votanti,1)
end
agg(ss,string.format('<td style="width:0;background:%s"></td><td align=left>%s</td><td align=left>%s</td>', dati[i].c, dati[i].p, dati[i].n))
ss =ss..'</tr>'
agg(ss,string.format('<td>%s</td><td>%s</td>',formato(dati[i].v),percento(dati[i].v,votanti)))
else
ssif =(dati[i].b>-1) then agg(ss..,string.format('<tr><td align=left>%s</td><td style="width:8px;background:%s"> </td><td align=left>%s</td>', args['cand'..i], coloraformato(argsdati['part'..i],args['col'..i]b), percento(argsdati['part'..i] or '—'.b,votanti2))) end
agg(ss,'</tr>')
ss = ss..vrg(args['voti'..i],votanti,0)
if (args['ball'..i]) then ss = ss..vrg(args['ball'..i],votanti2,0) end
ss = ss..'</tr>'
end
agg(ss,l_vuota((ball>0) and 7 or 5))
agg(ss,l_semplice('Iscritti',elettori,elettori,ball,elettori2,elettori2))
agg(ss,l_semplice('&#x21b3; Votanti <small>(% su iscritti)</small>',votanti,elettori,ball,votanti2,elettori2))
if ((validi>-1) or (validi2>-1)) then
agg(ss,l_semplice('&ensp;&#x21b3; Schede valide <small>(% su votanti)</small>',validi,votanti,ball,validi2,votanti2))
agg(ss,l_semplice('&ensp;&#x21b3; Schede non valide <small>(% su votanti)</small>',votanti-validi,votanti,ball,votanti2-validi2,votanti2))
end
agg(ss,l_semplice('&#x21b3; Astenuti <small>(% su iscritti)</small>',elettori-votanti,elettori,ball,elettori2-votanti2,elettori2))
 
if (args['nota']) then
agg(ss,l_vuota((ball>0) and 7 or 5))
agg(ss,string.format('<tr class="sortbottom"><td align=left colspan=%d style="font-size:90%%">%s</td></tr>',(ball>0 and 7 or 5),args['nota']))
end
agg(ss,'</table>')
if (flex[allinea]) then agg(ss,flex[allinea][2]) end
return table.concat(ss)
else
agg(err,'</p>')
return table.concat(err)
end
end
ss = ss..string.format('<tr><td colspan=%d></td></tr>', ball>0 and 7 or 5)
 
ss = ss..'<tr><td colspan=3>Iscritti</td>'..vrg(elettori,elettori,0)
-- crea linea con variazioni percentuali
if (ball>0) then ss = ss..vrg(elettori2,elettori2,0) end
-- a: scritta; b: voti; c: percentuale; d: variazione
ss = ss..'</tr><tr><td colspan=3>Astenuti</td>'..vrg(elettori-votanti,elettori,0)
-- e: ballottaggio; f:voti; g: percentuale; h: variazione
if (ball>0) then ss = ss..vrg(elettori2-votanti2,elettori2,0) end
local function l_variaz(a,b,c,d,e,f,g,h)
ss = ss..'</tr><tr><td colspan=3>Votanti</td>'..vrg(votanti,elettori,0)
if (balle>0) then ss = ss..vrg(votanti2,elettori2,0) end
return string.format('<tr class="sortbottom"><td align=left colspan=2>%s</td><td>%s</td><td>%s</td><td><small>%s</small></td><td>%s</td><td>%s</td><td><small>%s</small></td></tr>',a,formato(b),percento(b,c),d,formato(f),percento(f,g),h)
ss = ss..'</tr></table>'
if (err == '-') then
return ss
else
return string.format('<tr class="sortbottom"><td align=left colspan=2>%s</td><td>%s</td><td>%s</td><td><small>%s</small></td></tr>',a,formato(b),percento(b,c),d)
return '<p style="color:red"><b>Errore nel template:</b> '..err..'</p>'
end
end
 
-- crea tabella per elezione di lista
function p.lista(frame)
local args = getArgs(frame, { valueFunc = ff })
local elettori = tonumber(args['elettori'] or -1)
valueFunc = function (key, value)
if type(key) == "number" then
if value == nil then
return nil
else
value = mw.text.trim(value)
end
else
if value == '' then return nil end
end
return value
end
})
local elettori = tonumber(args['elettori'] or 0)
local elettori2 = tonumber(args['elettori2'] or elettori)
local votanti = tonumber(args['votanti'] or 0-1)
local votanti2votantiv = tonumber(args['votanti2votantiv'] or 0)'n.d.'
local votanti2 = tonumber(args['votanti2'] or -1)
local votanti2v = args['votanti2v'] or 'n.d.'
local bianche = tonumber(args['bianche'] or -1)
local bianche2 = tonumber(args['bianche2'] or 0)
local noassegnate = tonumber(args['noassegnate'] or -1)
local noassegnate2 = tonumber(args['noassegnate2'] or 0)
local edata = ''
if (args['data']) then edata = string.format(edate,args['data']) end
local edata2 = ''
if (args['data2']) then edata2 = string.format(edate,args['data2']) end
local ball = tonumber(args['ball1'] or 0)
local titolo = args['titolo'] or ''
local errallinea = args['allinea'] or '-'
local sssolovotanti = args['solovotanti'] and 0 or 1
local numerr = 0{}
agg(err, '<p style="color:#800"><b>Errore nel template:</b>')
local ss = {}
local num = 1
local tot,tot2 = 0,0
local dati = {}
 
ss = '<table cellpadding=0 cellspacing=0 style="border-collapse:collapse;margin:10px auto"><caption><b>'..titolo..'</b><tr style="vertical-align:top"><td>'
ss = ss..'<table class="wikitable" style="text-align:right"><tr><th rowspan=2 colspan=2>Partito</th><th colspan=2>'
if (ball>0) then ss= ss..'Primo turno</th><th colspan=2>Ballottaggio</th>' else ss = ss..'Risultati</th>' end
ss = ss..'<th rowspan=2>Seggi</th></tr>'
ss = ss..'<tr><th>Voti</th><th>%</th>'
if (ball>0) then ss= ss..'<th>Voti</th><th>%</th>' end
ss = ss..'</tr>'
num = 1
while (args['part'..num]) do
if (args['voti'..num]) then
dati[num] = {
tot = tot+tonumber(args['voti'..num])
tot2 p = args['part'..num], v = tonumber(args['voti'..num]), b = tot2+tonumber(args['ball'..num] or 0-1),
c = colora(args['part'..num] or '',args['col'..num]), s = args['seggi'..num] or '',
sv = args['seggiv'..num] or 'n.d.', pv = args['percv'..num] or 'n.d.', pv2 = args['percvb'..num] or 'n.d.'
}
tot = tot+dati[num].v
if (dati[num].b > -1) then tot2 = tot2 + dati[num].b end
else
agg(err = ,'non Non indicato il numero di voti per il partito '..num..'.')
end
num = num+1
end
num = num-1
if (ball>0) then
 
if (votanti2 == 0 or elettori2 == 0) then
err = verifica(err,elettori,votanti,tot,bianche,noassegnate,ball,elettori2,votanti2,tot2,bianche,noassegnate)
err = 'non indicati elettori o votanti del ballottaggio'
if (#err == 1) then
if (flex[allinea]) then agg(ss,flex[allinea][1]) end
agg(ss,'<table cellpadding=0 cellspacing=0 style="margin:10px ',flex[allinea] and flex[allinea][3] or '0','"><caption><b>',titolo,'</b></caption><tr style="vertical-align:top"><td>')
agg(ss,'<table class="wikitable sortable" style="text-align:right"><tr><th rowspan=2 colspan=2>Partito</th><th colspan=3>')
if (ball>0) then agg(ss,'Primo turno',edata,'</th><th colspan=3>Ballottaggio',edata2) else agg(ss,'Risultati',edata) end
agg(ss,'</th><th colspan=2>Seggi</th></tr><tr>',tcella,'<th>±</th>',((ball>0) and tcella..'<th>±</th>' or ''),'<th>Num</th><th>±</th></tr>')
 
for i=1,num do
agg(ss,string.format('<tr><td style="width:0;background:%s"></td><td align=left>%s</td>', dati[i].c, dati[i].p))
agg(ss,string.format('<td>%s</td><td>%s</td><td><small>%s</small></td>',formato(dati[i].v),percento(dati[i].v,tot),dati[i].pv))
if (ball>0) then
if (dati[i].b>-1) then
agg(ss,string.format('<td>%s</td><td>%s</td><td><small>%s</small></td>',formato(dati[i].b),percento(dati[i].b,tot2),dati[i].pv2))
else
agg(ss,'<td></td><td></td><td></td>')
end
end
agg(ss,string.format('<td>%s</td><td><small>%s</small></td></tr>',dati[i].s,dati[i].sv))
end
 
agg(ss,l_vuota((ball>0) and 10 or 7))
agg(ss,l_variaz('Iscritti',elettori,elettori,'',ball,elettori2,elettori2,''))
agg(ss,l_variaz('&#x21b3; Votanti <small>(% su iscritti)</small>',votanti,elettori,votantiv,ball,votanti2,elettori2,votanti2v))
if (solovotanti == 1) then
agg(ss,l_variaz('&ensp;&#x21b3; Voti validi <small>(% su votanti)</small>',tot,votanti,'',ball,tot2,votanti2,''))
agg(ss,l_variaz('&ensp;&#x21b3; Voti non validi <small>(% su votanti)</small>',votanti-tot,votanti,'',ball,votanti2-tot2,votanti2,''))
if (bianche>-1 or bianche2>0 or noassegnate>-1 or noassegnate2>0) then
local pz, pz2 = 0,0
if (bianche>-1 or bianche2>0) then
pz = pz + bianche
pz2 = pz2 + bianche2
agg(ss,l_variaz('&ensp;&ensp;&#x21b3; Schede bianche <small>(% su votanti)</small>',bianche,votanti,'',ball,bianche2,votanti2,''))
end
if (noassegnate>-1 or noassegnate2>0) then
pz = pz + noassegnate
pz2 = pz2 + noassegnate2
agg(ss,l_variaz('&ensp;&ensp;&#x21b3; Schede non assegnate <small>(% su votanti)</small>',noassegnate,votanti,'',ball,noassegnate2,votanti2,''))
end
pz = votanti - tot - pz
pz2 = votanti2 - tot2 - pz2
agg(ss,l_variaz('&ensp;&ensp;&#x21b3; Schede nulle <small>(% su votanti)</small>',pz,votanti,'',ball,pz2,votanti2,''))
end
end
agg(ss,l_variaz('&#x21b3; Astenuti <small>(% su iscritti)</small>',elettori-votanti,elettori,'',ball,elettori2-votanti2,elettori2,''))
 
if (args['nota']) then
agg(ss,l_vuota((ball>0) and 10 or 7))
agg(ss,string.format('<tr class="sortbottom"><td align=left colspan=%d style="font-size:90%%">%s</td></tr>', (ball>0 and 10 or 7),args['nota']))
end
agg(ss,'</table></td>')
if (args['el1']) then
num = 1
while (args['el'..num]) do num = num +1 end
num = num-1
if (num>40) then
local c2 = math.floor(0.7 + num/3)
agg(ss,'<td width="12px"></td><td><table class="wikitable"><tr><th colspan=2>Eletti</th><th rowspan=',c2+1,'></th><th colspan=2>Eletti</th><th rowspan=',c2+1,'></th><th colspan=2>Eletti</th></tr>')
for j=1,c2 do
agg(ss,string.format('<tr><td style="background:%s"> </td><td>%s</td>',dati[tonumber(args['part el'..j])].c, args['el'..j]))
agg(ss,string.format('<td style="background:%s"> </td><td>%s</td>',dati[tonumber(args['part el'..(j+c2)])].c, args['el'..(j+c2)]))
if (2*c2+j<=num) then agg(ss,string.format('<td style="background:%s"> </td><td>%s</td>',dati[tonumber(args['part el'..(j+2*c2)])].c, args['el'..(j+2*c2)])) end
agg(ss,'</tr>')
end
elseif (num>20) then
local c2 = math.floor(0.5 + num/2)
agg(ss,'<td width="12px"></td><td><table class="wikitable"><tr><th colspan=2>Eletti</th><th rowspan=',c2+1,'></th><th colspan=2>Eletti</th></tr>')
for j=1,c2 do
agg(ss,string.format('<tr><td style="background:%s"> </td><td>%s</td>',dati[tonumber(args['part el'..j])].c, args['el'..j]))
if (c2+j<=num) then agg(ss,string.format('<td style="background:%s"> </td><td>%s</td>',dati[tonumber(args['part el'..(j+c2)])].c, args['el'..(j+c2)])) end
agg(ss,'</tr>')
end
else
agg(ss,'<td width="12px"></td><td><table class="wikitable"><tr><th colspan=2>Eletti</th></tr>')
for j=1,num do
agg(ss,string.format('<tr><td style="background:%s"> </td><td>%s</td></tr>',dati[tonumber(args['part el'..j])].c, args['el'..j]))
end
end
agg(ss,'</table></td>')
end
agg(ss,'</tr></table>')
if (flex[allinea]) then agg(ss,flex[allinea][2]) end
return table.concat(ss)
else
agg(err,'</p>')
return table.concat(err)
end
end
 
-- crea tabella per elezione di lista con sistema misto
function p.misto(frame)
local args = getArgs(frame, { valueFunc = ff })
local tipologia = args['tipologia'] or 'Partito'
local elettori = tonumber(args['elettori'] or -1)
local votanti = tonumber(args['votanti'] or -1)
local votantiv = args['votantiv'] or 'n.d.'
local seggiv = args['seggiv'] or 'n.d.'
local titolo = args['titolo'] or ''
local allinea = args['allinea'] or ''
local err = {}
agg(err, '<p style="color:#800"><b>Errore nel template:</b>')
local ss = {}
local num = 1
local totm,totp = 0,0
local totsm,totsp = 0,0
local dati = {}
 
while (args['part'..num]) do
if (args['votim'..num]) then
dati[num] = {
p = args['part'..num], vm = tonumber(args['votim'..num]), vp = tonumber(args['votip'..num] or 0),
c = colora(args['part'..num] or '',args['col'..num]),
sm = tonumber(args['seggim'..num] or 0), sp = tonumber(args['seggip'..num] or 0), sv = args['seggiv'..num] or 'n.d.',
pmv = args['percvm'..num] or 'n.d.', ppv = args['percvp'..num] or 'n.d.'
}
totm = totm+dati[num].vm
totp = totp+dati[num].vp
totsm = totsm+dati[num].sm
totsp = totsp+dati[num].sp
else
agg(err,' Non indicato il numero di voti per il partito '..num..'.')
end
num = num+1
end
num = num-1
 
for i=1,num do
if (elettori>0) then
ss = ss..string.format('<tr><td style="width:8px;background:%s"></td><td align=left>%s</td>', colora(args['part'..i],args['col'..i]), args['part'..i])
if (totm>elettori or totp > elettori) then
ss = ss..vrg(args['voti'..i],tot,0)
agg(err,' Numero di elettori inferiore alla somma dei voti')
if (ball>0) then
end
if (args['ball'..i]) then ss = ss..vrg(args['ball'..i],tot2,0) else ss=ss..'<td></td><td></td>' end
if (votanti>0 and votanti>elettori) then
agg(err,' Numero di elettori inferiore al numero di votanti')
end
ss = ss..'<td>'..(args['seggi'..i] or '')..'</td></tr>'
end
if (votanti>0 and (totm>votanti or totp>votanti)) then
ss = ss..string.format('<tr><td colspan=%d></td></tr>',ball>0 and 7 or 5)
agg(err,' Numero di votanti inferiore alla somma dei voti')
ss = ss..'<tr><td colspan=2>Iscritti</td>'..vrg(elettori,elettori,0)
end
if (ball>0) then ss = ss..vrg(elettori2,elettori2,0) end
 
ss = ss..'</tr><tr><td colspan=2>Astenuti</td>'..vrg(elettori-votanti,elettori,0)
if (#err == 1) then
if (ball>0) then ss = ss..vrg(elettori2-votanti2,elettori2,0) end
if (flex[allinea]) then agg(ss,flex[allinea][1]) end
ss = ss..'</tr><tr><td colspan=2>Votanti</td>'..vrg(votanti,elettori,0)
agg(ss,'<table class="wikitable sortable" style="text-align:right">')
if (ball>0) then ss = ss..vrg(votanti2,elettori2,0) end
agg(ss = ss..,'</tr><tr><tdth rowspan=2 colspan=2>Voti non validi',tipologia,'</tdth><th colspan=3>'..vrg(votanti-tot,votanti,0)
if (totp>0) then
if (ball>0) then ss = ss..vrg(votanti2-tot2,votanti2,0) end
agg(ss,'Parte = ss..'maggioritaria</trth><tr><tdth colspan=23>VotiParte validi</td>proporzionale'..vrg(tot,votanti,0)
else
if (ball>0) then ss = ss..vrg(tot2,votanti2,0) end
agg(ss,'Voti')
ss = ss..'</tr></table></td><td width="12px"></td><td><table class="wikitable"><tr><th colspan=2>Eletti</th></tr>'
end
num = 1
agg(ss,'</th><th colspan=5>Seggi</th></tr><tr><th>Voti</th><th>%</th><th>±</th>')
while (args['el'..num]) do
if (totp>0) then
ss = ss..string.format('<tr><td style="background:%s"> </td><td>%s</td></tr>',colora(args['part el'..num],args['col'..num]), args['el'..num])
agg(ss,'<th>Voti</th><th>%</th><th>±</th>')
end
agg(ss,'<th>Magg</th><th>Prop</th><th>Tot</th><th>±</th><th>%</th></tr>')
 
for i=1,num do
agg(ss,string.format('<tr><td style="width:0;background:%s"></td><td align=left>%s</td>', dati[i].c, dati[i].p))
agg(ss,string.format('<td>%s</td><td>%s</td><td><small>%s</small></td>',formato(dati[i].vm),percento(dati[i].vm,totm),dati[i].pmv))
if (totp>0) then
agg(ss,string.format('<td>%s</td><td>%s</td><td><small>%s</small></td>',formato(dati[i].vp),percento(dati[i].vp,totp),dati[i].ppv))
end
agg(ss,string.format('<td>%s</td><td>%s</td><td>%s</td><td><small>%s</small><td>%s</td></tr>',dati[i].sm,dati[i].sp,(dati[i].sm+dati[i].sp),dati[i].sv,percento(dati[i].sm+dati[i].sp,totsm+totsp)))
end
 
agg(ss,l_vuota((totp>0) and 13 or 10))
agg(ss,string.format('<tr class="sortbottom"><td align=left colspan=2>Totale</td><td>%s</td><td>%s</td><td></td>',formato(totm),percento(1,1)))
if (totp>0) then
agg(ss,string.format('<td>%s</td><td>%s</td><td></td>',formato(totp),percento(1,1)))
end
agg(ss,string.format('<td>%d</td><td>%d</td><td>%d</td><td><small>%s</small></td></tr>',totsm,totsp,totsm+totsp,seggiv))
if ((votanti > 0) and (elettori > 0)) then
agg(ss,l_vuota((totp>0) and 13 or 10))
agg(ss,string.format('<tr class="sortbottom"><td align=left colspan=2>Iscritti</td><td>%s</td><td>%s</td></tr>',formato(elettori),percento(1,1)))
agg(ss,string.format('<tr class="sortbottom"><td align=left colspan=2>Votanti (%% su iscritti)</td><td>%s</td><td>%s</td></tr>',formato(votanti),percento(votanti,elettori)))
end
 
if (args['nota']) then
agg(ss,l_vuota((totp>0) and 13 or 10))
agg(ss,string.format('<tr class="sortbottom"><td align=left colspan=%d style="font-size:90%%">%s</td></tr>', (totp>0 and 13 or 10),args['nota']))
end
agg(ss,'</table>')
if (flex[allinea]) then agg(ss,flex[allinea][2]) end
return table.concat(ss)
else
agg(err,'</p>')
return table.concat(err)
end
end
 
-- crea tabella per liste collegate a candidato uninominale 2017
function p.elenco_liste(frame)
local args = getArgs(frame, { valueFunc = ff })
local allinea = args['allinea'] or ''
local err = {}
agg(err, '<p style="color:#800"><b>Errore nel template:</b>')
local ss = {}
local num = 1
local l = 0
local ss2 = ''
 
if (flex[allinea]) then agg(ss,flex[allinea][1]) end
agg(ss,'<table class="wikitable" style="text-align:right">')
agg(ss,'<tr><th colspan=2>Candidati</th><th colspan=2>Liste</th><th>Voti</th>')
 
while (args['cand'..num]) do
if (args['liste'..num] and tonumber(args['liste'..num])) then
l = args['liste'..num] and tonumber(args['liste'..num])
agg(ss,string.format('<tr><td rowspan=%d style="width:0;background:%s></td>',l,colora(args['part'..num] or '',args['col'..num])))
agg(ss,string.format('<td rowspan=%d align=left>%s</td>',l,args['cand'..num]))
for i=1,l do
ss2 = num..'_'..i
if (i>i) then agg(ss,'<tr>') end
agg(ss,string.format('<td style="width:0;background:%s"></td><td align=left>%s</td><td>%s</td></tr>',
colora(args['lista'..ss2] or '',args['col'..ss2]), args['lista'..ss2], args['voti'..ss2]
))
end
else
agg(err,' Errore nel numero di liste per il candidato '..num..'.')
end
num = num+1
end
agg(ss = ss..,'</table></td></tr></table>')
if (flex[allinea]) then agg(ss,flex[allinea][2]) end
if (err == '-') then
 
return ss
if (#err == 1) then
return table.concat(ss)
else
agg(err,'</p>')
return '<p style="color:red"><b>Errore nel template:</b> '..err..'</p>'
return table.concat(err)
end
end