Modulo:Discendenza: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
mNessun oggetto della modifica
sistemazione stringhe
Riga 9:
local n = 1
local resto = 0
local nx,px
local err = '-'
 
Line 15 ⟶ 16:
 
for m=4,n,4 do
ifnx = ((tonumber(dati[m-3]))
px and= (tonumber(dati[m-2]))
if (nx) then
if (pers[tonumber(dati[m-3])]px) then
if (px-p2>0pers[nx]) then
err = string.format('id ' .. dati[m-3] .. '%d utilizzato per elementi diversi',nx)
else
pers[tonumber(dati[m-3])nx] = { padre = tonumber(dati[m-2])px, testo = dati[m-1], nota = dati[m], id = -1, x = -1, y = -1, sp = 0, figli = {} }
end
else
err = string.format('id genitore %s non numerico per elemento %d',dati[m-2],nx)
pers[tonumber(dati[m-3])] = { padre = tonumber(dati[m-2]), testo = dati[m-1], nota = dati[m], id = -1, x = -1, y = -1, sp = 0, figli = {} }
end
else
err = string.format('identificativoid elemento %s non numerico in ' .. ,dati[m-3] .. ', ' .. dati[m-2])
end
resto = n-m
end
if (err == '-' and resto > 0) then
err = string.format('numero di dati ' .. n .. '$d non valido (elementi in più: $d)' .. ,n,resto .. ')'
end
return err
end
 
local function organizza(pid, plevy)
local nn = 1
pers[pid].y = plev -- assegna y ad ogni persona
if (not tabella[plevy]) then tabella[plevy] = {} end
table.insert(tabella[plevy], pid) -- inserisce la persona in tabella
for i, v in pairs(pers[pid].figli) do
pers[v].id = i -- assegna numero come figlio
nn = nn + organizza(v, plevy+1) -- ricorsione per assegnare y ai figli e contarli
end
return nn
end
 
local function limSx(pid, delta, dt) -- calcola la posizione più a sinistra tra gli elementi del ramo per ogni y
if (dt[pers[pid].y]) then
dt[pers[pid].y] = math.min(dt[pers[pid].y], pers[pid].x+delta)
Line 56 ⟶ 63:
end
 
local function limDx(pid, delta, dt) -- calcola la posizione più a destra tra gli elementi del ramo per ogni y
if (dt[pers[pid].y]) then
dt[pers[pid].y] = math.max(dt[pers[pid].y], pers[pid].x+delta)
Line 68 ⟶ 75:
end
 
local function riallinea(pid2, n1, n2) -- sposta gli elementi tra i fratelli n1 e n2 per cercare di equispaziarli
local distanza = n2 - n1
local vrf = 0
Line 87 ⟶ 94:
end
 
local function verifica(pid) -- verifica che i rami non si sovrappongano e calcola eventuali spostamenti
local tSx
local tDx
Line 95 ⟶ 102:
local frt2, n
for frt=1,(fine-1) do -- controlla tutti i rami fratelli da 1 fino al ramo corrente
frt2 = pers[pers[pid].padre].figli[frt]
tDx = limDx(frt2, 0, {}) -- elementi più a destra del ramo fratello per ogni y
tSx = limSx(pid, 0, {}) -- elementi più a sinistra del ramo corrente per ogni y
n = pers[pid].y
while ((tSx[n]) and (tDx[n])) do
if (tSx[n] - tDx[n] + sposta < 2) then -- verifica che ci sia almeno una distanza 2 tra i rami (2 = larghezza casella)
sposta = 2 + tDx[n] - tSx[n]
end
n = n + 1
end
if (sposta > 0) then -- se deve spostare verifica se riallineare elementi intermedi
pers[pid].x = pers[pid].x + sposta
pers[pid].sp = pers[pid].sp + sposta
Line 115 ⟶ 122:
end
 
local function calcolaX1(pid) -- prima verifica di posizionamento
for _, v in pairs(pers[pid].figli) do
calcolaX1(v)
end
local tt = #pers[pid].figli
if (tt == 0) then -- non ha figli
if (pers[pid].padre == -1) then -- è capostipite
pers[pid].x = 0
elseif (pers[pid].id == 1) then -- è primo figlio
pers[pid].x = 0
else
else -- è figlio successivo
pers[pid].x = pers[pers[pers[pid].padre].figli[pers[pid].id - 1]].x + 2
end
elseif (tt == 1) then -- ha un figlio
if (pers[pid].padre == -1) then -- è capostipite
pers[pid].x = pers[pers[pid].figli[1]].x
elseif (pers[pid].id == 1) then -- è primo figlio
pers[pid].x = pers[pers[pid].figli[1]].x
else
else -- è figlio successivo
pers[pid].x = pers[pers[pers[pid].padre].figli[pers[pid].id - 1]].x + 2
pers[pid].sp = pers[pid].x - pers[pers[pid].figli[1]].x
verifica(pid)
end
else -- ha più figli
local media = math.floor((pers[pers[pid].figli[1]].x + pers[pers[pid].figli[tt]].x)/2)
if (pers[pid].padre == -1) then -- è capostipite
pers[pid].x = media
elseif (pers[pid].id == 1) then -- è primo figlio
pers[pid].x = media
else
else -- è figlio successivo
pers[pid].x = pers[pers[pers[pid].padre].figli[pers[pid].id - 1]].x + 2
pers[pid].sp = pers[pid].x - media
Line 173 ⟶ 180:
end
 
local function massimoXY(pid, t) -- calcola numero colonne e righe totali
if (pers[pid].x > t[1]) then t[1] = pers[pid].x end
if (pers[pid].y > t[2]) then t[2] = pers[pid].y end
Line 182 ⟶ 189:
end
 
local function mostra(pid,allinea,largo) -- crea HTML tabella finale
local xy = massimoXY(pid, {0, 0})
local p1, p2, p3
local p1, p2, p3 -- posizione all'interno della riga per 1. parte superiore; 2. parte con testo; 3. parte inferiore
local n1
local n1 -- padre dell'ultimo elemento analizzato (per connessione tra fratelli)
local s1, s2, s3
local s1, s2, s3 -- HTML per 1. parte superiore; 2. parte con testo; 3. parte inferiore
local xx, xp
local px, nx -- posizione e padre dell'elemento corrente
local ss = ''
if (allinea == 'destra') then
Line 194 ⟶ 201:
ss = '<center><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)) -- larghezza percentuale di ogni colonna
if (lg == 0) then lg = 1 end
for n=1,xy[2] do -- analisi delle righe della tabella
p1 = 0; p2 = 0; p3 = 0
n1 = 0
Line 203 ⟶ 210:
if (n<xy[2]) then s3 = '<tr style="line-height:8px">' else s3 = '' end
for _, v in pairs(tabella[n]) do
pxxx = pers[v].x
nxxp = pers[v].padre
 
-- 1. parte superiore con unione dei rami se padre uguale al precedente
if (n>1) then
s1 = s1 .. '<td style="border-right:1px solid #000'
if (n1 == nxxp) then s1 = s1 ..';border-top:1px solid #000' end
n1 = nxxp
if (px xx- p1 > 0) then s1 = s1 .. '" colspan="' .. (pxxx+1-p1) end
p1 = pxxx + 1
s1 = s1 .. '">&nbsp;</td>'
else
for m=1,(xy[1]+2) do s1 = s1 .. '<td width='..lg..'%></td>' end
end
 
if (xx-p2>0) then
-- 2. parte con testo
s2 = s2 .. '>&nbsp;</td>'
if (px-p2>0) then
if (xx-p2>1) then s2 = s2 ..' colspan="'<td..(xx-p2)..'"' end
if (px - p2>1) then s2 = s2 .. ' colspan=">&nbsp;</td>'.. (px-p2) ..'"' end
s2 = s2 .. '>&nbsp;</td>'
end
s2 = s2 .. '<td colspan=2>' .. pers[v].testo .. '<br/>'
if (pers[v].nota == '-') then else s2 = s2 .. '<span style="font-size:90%"><i>' .. pers[v].nota .. '</i></span>' end
s2 = s2 .. '</td>'
p2 = pxxx + 2
 
-- 3. parte inferiore in caso di figli (non creata per l'ultima riga)
if (n<xy[2]) then
if (#pers[v].figli > 0) then
s3 = s3 .. '<td style="border-right: 1px solid #000'
if (px xx- p3 > 0) then s3 = s3 .. '" colspan="' .. (pxxx+1-p3) end
p3 = pxxx + 1
s3 = s3 .. '">&nbsp;</td>'
end
Line 240 ⟶ 244:
end
 
s1 = s1..'</tr>'
-- chiusura delle righe
if (n>1) then s1s2 = s1 s2.. '</tr>' end
s2if =(n<xy[2]) s2then s3 = s3.. '</tr>' end
if (n<xy[2]) then s3 = s3 .. '</tr>' end
 
ss = ss .. s1 .. s2 .. s3
end
 
ss = ss .. '</table>' -- chiusura tabella
if (allinea == 'destra') then ss = ss .. '</div>' else ss = ss .. '</center>' end
 
return ss
Line 283 ⟶ 286:
capo = i
else
err = string.format('più elementi (id: ' .. capo .. '%d, ' .. i .. '%d) indicati come capostipite',capo,i)
end
else
if (v.padre == i) then
err = string.format('elemento con id ' .. i .. '%d indicato come figlio di se stesso', i)
elseif (pers[v.padre]) then
table.insert(pers[v.padre].figli,i)
else
err = string.format('valore perid genitore (' .. v.padre .. ')%d non valido perin l\'elemento con id %d' ,v.. padre,i)
end
end
Line 314 ⟶ 317:
return mostra(capo, lato, larg)
else
return string.format('<p style="color:#b80000"><b>Template:Discendenza - Errore:</b> ' .. err .. '%s</p>[[Categoria:Errori di compilazione del template Discendenza]]',err)
end
end