Modulo:Discendenza: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
mNessun oggetto della modifica
m modulo no globals obsoleto
 
(16 versioni intermedie di 2 utenti non mostrate)
Riga 1:
require('Module:No globalsstrict')
 
local getArgs = require('Module:Arguments').getArgs
local errorCategory = '[[Categoria:Errori di compilazione del template Discendenza]]'
local mwHtml = getmetatable( mw.html.create() ).__index
 
function mwHtml:attrIf( cond, name, value )
if cond then
return self:attr( name, value )
else
return self
end
end
 
function mwHtml:cssIf( cond, name, value )
if cond then
return self:css( name, value )
else
return self
end
end
 
function mwHtml:wikitextIf( cond, value1, value2 )
if cond then
return self:wikitext( value1 )
elseif not (value2 == nil) then
return self:wikitext( value2 )
else
return self
end
end
 
local p = {}
local pers = {}
local tabella = {}
local txt = {}
 
local function aggerrhandler(tmsg)
local cat = mw.title.getCurrentTitle().namespace == 0 and errorCategory or ''
table.insert(txt,t)
return string.format('<span class="error">%s</span>%s', msg, cat)
end
 
Line 15 ⟶ 44:
local resto = 0
local nx,px
local err = '-'
 
while (dati[n]) do n = n+1 end
n = n-1
 
for m=4,n,4 do
nx = tonumber(dati[m-3])
Line 26 ⟶ 52:
if (px) then
if (pers[nx]) then
err = error(string.format('inseritoInserito id = <b>%d</b> per più elementi',nx))
else
pers[nx] = { padre = px, testo = dati[m-1], nota = dati[m], id = -1, x = -1, y = -1, sp = 0, figli = {} }
end
else
err = error(string.format('inseritoInserito id genitore = <b>%s</b> non numerico (id = <b>%d</b>)',dati[m-2],nx))
end
else
err = error(string.format('inseritoInserito id = <b>%s</b> non numerico',dati[m-3]))
end
resto = n-m
end
if (err == '-' and resto > 0) then
err = error(string.format('numeroNumero di dati %d non valido (elementi in più: %d)',n,resto))
end
return err
end
 
Line 133 ⟶ 158:
local tt = #pers[pid].figli
if (tt == 0) then
if (pers[pid].padre == -1 or pers[pid].id == 1) then
pers[pid].x = 0
elseif (pers[pid].id == 1) then
pers[pid].x = 0
else
Line 141 ⟶ 164:
end
elseif (tt == 1) then
if (pers[pid].padre == -1 or pers[pid].id == 1) then
pers[pid].x = pers[pers[pid].figli[1]].x
elseif (pers[pid].id == 1) then
pers[pid].x = pers[pers[pid].figli[1]].x
else
Line 152 ⟶ 173:
else
local media = math.floor((pers[pers[pid].figli[1]].x + pers[pers[pid].figli[tt]].x)/2)
if (pers[pid].padre == -1 or pers[pid].id == 1) then
pers[pid].x = media
elseif (pers[pid].id == 1) then
pers[pid].x = media
else
Line 195 ⟶ 214:
 
local function mostraX(pid,allinea,largo,dida)
local xyposx = massimoXY(pid, {0, 0})
local p1, p2, p3
local n1
local s1, s2, s3stx
local riga = {}
local xx, xp
local stileDiv = { ['width'] = largo..'px', ['padding'] = '3px', ['background'] = '#FFF', ['border'] = '1px solid #C8CCD1' }
if (allinea == 'destra') then
agg('<div local class="floatright"stileTabella style="width: { ['..largo..'px;padding:3px;background:#fff;border:1px-collapse'] solid #c8ccd1"><table cellpadding="1" cellspacing="0" border=0'separate', style="['text-align:'] = 'center;', ['font-size:'] = '95%;', ['line-height:110'] = '105%;', ['margin:0px'] = '8px auto"> !important'), }
local xy = massimoXY(pid, {0, 0})
else
agg('<table cellpadding="1" cellspacing="0" border=0 style="text-align:center;font-size:95%;line-height:110%;margin:10px auto">')
end
local lg = math.floor(100/(xy[1]+2))
if (lg == 0) then lg = 1 end
 
local bDiv = mw.html.create('div'):attr({['style']='overflow:auto'})
if (allinea == 'destra') then
bDiv:css(stileDiv):addClass('floatright')
stileTabella['margin'] = '0px auto !important'
end
local bTabella = mw.html.create('table')
:css(stileTabella)
:attr({['cellpadding']='1',['cellspacing']='0',['border']='0'})
for n=1,xy[2] do
local riga1 = mw.html.create('tr')
p1 = 0; p2 = 0; p3 = 0
local riga2 = mw.html.create('tr')
local riga3 = mw.html.create('tr')
posx[1] = 0; posx[2] = 0; posx[3] = 0
n1 = 0
if (n==>1) then s1 = riga1:css('<tr>' else s1 = '<tr style="line-height:','8px">') end
if (n<xy[2]) then riga3:css('line-height','8px') end
s2 = '<tr>'
if (n<xy[2]) then s3 = '<tr style="line-height:8px">' else s3 = '' end
for _, v in pairs(tabella[n]) do
xx = pers[v].x
xp = pers[v].padre
 
if (n>==1) then
for m=1,(xy[1]+2) do
s1 = s1..'<td style="border-right:1px solid #000'
riga1:node(mw.html.create('td'):css('width',lg..'%'))
if (n1 == xp) then s1 = s1 ..';border-top:1px solid #000' end
n1 = xpend
if (xx-p1>0) then s1 = s1..'" colspan="'..(xx+1-p1) end
p1 = xx + 1
s1 = s1 .. '">&nbsp;</td>'
else
riga1:node(mw.html.create('td')
for m=1,(xy[1]+2) do s1 = s1..'<td width='..lg..'%></td>' end
:css('border-right','1px solid #000')
:cssIf(n1 == xp,'border-top','1px solid #000')
:attrIf(xx-posx[1]>0,'colspan',xx+1-posx[1])
:wikitext('&nbsp;')
)
n1 = xp
posx[1] = xx + 1
end
 
if (xx-p2posx[2]>0) then
s2 = s2riga2:node(mw.html.create('<td')
if :attrIf(xx-p2posx[2]>1) then s2 = s2..,' colspan="'..(,xx-p2posx[2])..'"' end
s2 = s2.. :wikitext('>&nbsp;</td>')
)
end
riga2:node(mw.html.create('td')
s2 = s2..'<td colspan=2>'..pers[v].testo..'<br/>'
:attr('colspan','2')
if (pers[v].nota == '-') then else s2 = s2..'<span style="font-size:90%"><i>'..pers[v].nota..'</i></span>' end
:wikitextIf(pers[v].nota=='-', pers[v].testo, string.format('%s<br/><span style="font-size:90%%"><i>%s</i></span>',pers[v].testo,pers[v].nota))
s2 = s2..'</td>'
p2 = xx + 2)
posx[2] = xx + 2
 
if (n<xy[2]) then
if (#pers[v].figli > 0) then
riga3:node(mw.html.create('td')
s3 = s3..'<td style="border-right: 1px solid #000'
:css('border-right','1px solid #000')
if (xx-p3>0) then s3 = s3..'" colspan="'..(xx+1-p3) end
:attrIf(xx-posx[3]>0,'colspan',xx+1-posx[3])
p3 = xx + 1
s3 = s3 .. :wikitext('">&nbsp;</td>')
)
posx[3] = xx + 1
end
end
end
 
bTabella:node(riga1):node(riga2):node(riga3)
s1 = s1..'</tr>'
s2 = s2..'</tr>'
if (n<xy[2]) then s3 = s3..'</tr>' end
 
agg(s1);agg(s2);agg(s3)
end
 
bDiv:node(bTabella)
agg('</table>')
if (allinea == 'destra' and not (dida=='')) then
bDiv:node(mw.html.create('p')
if not (dida=='') then agg('<p style="font-size:90%">'..dida..'</p>') end
:css({['font-size'] = '87%', ['font-style'] = 'normal', ['border-top'] = '1px solid #c8ccd1', ['margin'] = '8px 2px 3px'})
agg('</div>')
:wikitext(dida)
)
end
return tostring(bDiv)
 
return table.concat(txt)
end
 
Line 272 ⟶ 305:
return t
end
 
local function mostraY(pid)
local bTabella = mw.html.create('table')
:attr({['cellpadding']='0',['cellspacing']='0',['border']='0'})
:css({['border-collapse']='separate',['text-align']='left',['margin']='10px 0 10px 16px'})
 
local function mostraY2(pid, a)
if (pers[pid].id > 1) then agg('<tr>') end
if (pers[pid].padre > -1) then
local riga1 = mw.html.create('tr')
agg('<td style="width:6px"></td><td style="border-left:1px solid #666;border-bottom:1px solid #666;width:10px;line-height:3px;height:12px">&nbsp;</td>')
local riga2 = mw.html.create('tr')
agg(string.format('<td colspan=%d rowspan=2 style="padding: 0px 3px 2px 1px">%s',2*a-1,pers[pid].testo))
local spd = pers[pers[pid].padre].sp
if not (pers[pid].nota == '') then agg(string.format(' - %s',pers[pid].nota)) end
if (pers[pid].id == 1 and pers[pers[pid].padre].padre > -1) then
agg('</td></tr>')
riga1:node(mw.html.create('td')
agg('<tr><td></td><td style="line-height:8px;line-height:3px;height:12px')
:attr('rowspan',2*spd))
if (pers[pid].id < #pers[pers[pid].padre].figli) then
riga1:node(mw.html.create('td')
agg(';border-left:1px solid #666')
:attr('rowspan',2*spd)
end
:cssIf(pers[pers[pid].padre].id < #pers[pers[pers[pid].padre].padre].figli,'border-left','1px solid #666')
agg('">&nbsp;</td></tr>')
)
if (pers[pid].sp > 0) then
agg(string.format('<tr><td rowspan=%d></td><td rowspan=%d',2*pers[pid].sp,2*pers[pid].sp))
if (pers[pid].id < #pers[pers[pid].padre].figli) then
agg(' style="border-left:1px solid #666"')
end
agg('>&nbsp;</td>')
end
riga1
:node(mw.html.create('td')
:css('width','6px'))
:node(mw.html.create('td')
:css({['border-left']='1px solid #666',['border-bottom']='1px solid #666',['width']='10px',['line-height']='3px',['height']='12px'}))
:node(mw.html.create('td')
:attr({['colspan']=2*a-1, ['rowspan']=2})
:css('padding', '0px 3px 2px 1px')
:wikitextIf(pers[pid].nota=='', pers[pid].testo, pers[pid].testo..' - '..pers[pid].nota))
riga2
:node(mw.html.create('td'))
:node(mw.html.create('td')
:css({['line-height']='8px',['line-height']='3px',['height']='12px'})
:cssIf(pers[pid].id < #pers[pers[pid].padre].figli,'border-left','1px solid #666'))
bTabella:node(riga1):node(riga2)
else
bTabella:node(
agg(string.format('<td colspan=%d style="padding: 0px 0px 2px 2px">%s',2*a-1,pers[pid].testo))
mw.html.create('tr')
if not (pers[pid].nota == '') then agg(string.format(' - %s',pers[pid].nota)) end
:node(mw.html.create('td')
agg('</td></tr><tr>')
:attr('colspan',2*a-1)
:css('padding','0px 0px 2px 2px')
:wikitextIf(pers[pid].nota=='',pers[pid].testo,pers[pid].testo..' - '..pers[pid].nota)
)
)
end
if (pers[pid].sp > 0) then
-- agg(string.format('<td rowspan=%d style="width:6px">&nbsp;</td>',2*pers[pid].sp))
for _, v in pairs(pers[pid].figli) do
mostraY2(v,a-1)
Line 305 ⟶ 356:
end
 
local function mostraY(pid)
agg('<table cellpadding="0" cellspacing="0" border=0 style="text-align:left;margin:10px 0 10px 16px"><tr>')
mostraY2(pid,calcolaY(pid,0))
return tostring(bTabella)
agg('</tr></table>')
return table.concat(txt)
end
 
function p.main_discendenza(frameargs)
local capo = -1
local n1, n2
local errlato = args['-allinea'] or 'centro'
local larg = args['larghezza'] or '300'
local tipo = args['tipo'] or 'o'
local dida = args['didascalia'] or ''
dividi(args)
n1 = 0
for i, v in pairs(pers) do
n1 = n1+1
if (v.padre == -1) then
if (capo == -1) then
capo = i
else
error(string.format('Inseriti più elementi come capostipite (id = %d, %d)',capo,i))
end
else
if (v.padre == i) then
error(string.format('Inserito elemento come figlio di se stesso (id = %d)', i))
elseif (pers[v.padre]) then
table.insert(pers[v.padre].figli,i)
else
error(string.format('Inserito id genitore = %d non valido (id = %d)',v.padre,i))
end
end
end
 
if (capo == -1) then
error('Capostipite non definito')
else
n2 = organizza(capo, 1)
if (n1 == n2) then
if (tipo == 'v') then
return mostraY(capo)
elseif (tipo == 'o') then
calcolaX1(capo)
calcolaX2(capo)
calcolaX3(capo, 0)
return mostraX(capo, lato, larg, dida)
end
else
error('Inseriti elementi non collegati al capostipite')
end
end
end
 
function p.discendenza(frame)
local args = getArgs(frame, {
valueFunc = function (key, value)
Line 330 ⟶ 422:
end
})
return p._discendenza(args)
local lato = args['allinea'] or 'centro'
local larg = args['larghezza'] or '300'
local tipo = args['tipo'] or 'o'
local dida = args['didascalia'] or ''
err = dividi(args)
if (err == '-') then
n1 = 0
for i, v in pairs(pers) do
n1 = n1+1
if (v.padre == -1) then
if (capo == -1) then
capo = i
else
err = string.format('inseriti più elementi come capostipite (id = <b>%d, %d</b>)',capo,i)
end
else
if (v.padre == i) then
err = string.format('inserito elemento come figlio di se stesso (id = <b>%d</b>)', i)
elseif (pers[v.padre]) then
table.insert(pers[v.padre].figli,i)
else
err = string.format('inserito id genitore = <b>%d</b> non valido (id = <b>%d</b>)',v.padre,i)
end
end
end
 
if (err == '-') then
if (capo == -1) then
err = 'capostipite non definito'
else
n2 = organizza(capo, 1)
if (n1 == n2) then
if (tipo == 'v') then
return mostraY(capo)
elseif (tipo == 'o') then
calcolaX1(capo)
calcolaX2(capo)
calcolaX3(capo, 0)
return mostraX(capo, lato, larg, dida)
end
else
err = 'inseriti elementi non collegati al capostipite'
end
end
end
end
return string.format('<p style="color:#b80000"><b>Template:Discendenza - Errore:</b> %s</p>[[Categoria:Errori di compilazione del template Discendenza]]',err)
end