nouveau format de tableau, utilisation dans la gestion de la surveillance du

rseau

darcs-hash:20051103235738-4ec08-4cbc92f43c8eb43da17d910d09e5d5597e9d781c.gz
This commit is contained in:
chove 2005-11-04 00:57:38 +01:00
parent ba62565f57
commit 92fa0abe2a
3 changed files with 132 additions and 78 deletions

View file

@ -129,41 +129,47 @@ def tableau(largeurs,data) :
f = f.replace(u'\n',s,1) # Insertion du séparateur entète - corps
return f[:-1] # Supression du \n final
def tableau_ng(data,titres=None,largeurs=None,allignements=None,formats=None) :
def tableau_ng(data,titre=None,largeur=None,alignement=None,format=None) :
"""
retourne une chaine formatée repésentant un tableau
Retourne une chaine formatée repésentant un tableau
data : liste de listes, chacune contenant les valeurs d'une ligne
data : liste de listes, chacune contenant les valeurs d'une ligne
titres : liste des titres
Si none, n'affiche pas de ligne de titre
titre : liste des titres
Si none, n'affiche pas de ligne de titre
largeurs : liste des largeurs des colonnes, '*' met la plus grande
largeur possible.
Si None, réduit aux max chaque colonne
largeur : liste des largeurs des colonnes, '*' met la plus grande
largeur possible.
Si None, réduit aux max chaque colonne
allignements: liste des alignements : c = centrer
alignement : liste des alignements : c = centrer
g = gauche
d = droit
Si None, met c pour chaque colonne
Si None, met c pour chaque colonne
formats : liste des formats : s = string
format : liste des formats : s = string
o = octet
Si None, s pour chaque colonne
Si None, s pour chaque colonne
"""
sep_col = u'|'
nbcols = len(data[0])
if data :
nbcols = len(data[0])
elif titre :
nbcols = len(titre)
else :
return u'Aucune donnée'
# Formats
#########
if not formats :
formats = ['s'] * nbcols
if not format :
format = ['s'] * nbcols
def reformate (data, format) :
if format == 's' :
return str(data)
elif format == 'o' :
data = int(data)
if data > 0.8 * 1024**3 :
return str(round(data/1024**3,1))+'Go'
elif data > 0.8 * 1024**2 :
@ -173,45 +179,74 @@ def tableau_ng(data,titres=None,largeurs=None,allignements=None,formats=None) :
else :
return str(round(data,1))+'o'
data = [ [ reformate(ligne[i],formats[i]) for i in range(nbcols) ] for ligne in data ]
data = [ [ reformate(ligne[i],format[i]) for i in range(nbcols) ] for ligne in data ]
# Largeurs
##########
if not largeurs :
largeurs = [ max([len(sre.sub('\x1b\[1;([0-9]|[0-9][0-9])m','',ligne[i])) for ligne in data]) for i in range(nbcols) ]
elif '*' in largeurs:
if not largeur :
largeur = [ max([len(sre.sub('\x1b\[1;([0-9]|[0-9][0-9])m','',ligne[i])) for ligne in data]) for i in range(nbcols) ]
elif '*' in largeur:
rows, cols = get_screen_size()
for i in range(nbcols) :
if largeurs[i] in ['*',-1] :
largeurs[i] = max(cols - sum([l for l in largeurs if l != '*']) - nbcols - 1, 3)
if largeur[i] in ['*',-1] :
largeur[i] = max(cols - sum([l for l in largeurs if l != '*']) - nbcols - 1, 3)
break
print largeurs
# Allignement
#############
if not allignements :
allignements = ['c'] * nbcols
def alligne (data, allignement, largeur) :
# Alignement
############
if not alignement :
alignement = ['c'] * nbcols
def aligne (data, alignement, largeur) :
# Longeur sans les chaines de formatage
l = largeur - len(sre.sub('\x1b\[1;([0-9]|[0-9][0-9])m','',data))
# Allignement
if allignement == 'g' :
return data + u' '*l
elif allignement == 'd' :
return u' '*l + data
l = len(sre.sub('\x1b\[1;([0-9]|[0-9][0-9])m','',data))
# Alignement
if l > largeur :
# découpage d'une chaine trop longue
regexp = sre.compile('\x1b\[1;([0-9]|[0-9][0-9])m')
new_data = u''
new_len = 0
# On laisse la mise en forme et on coupe les caratères affichés
while True :
s = regexp.search(data)
if s and not s.start() :
# c'est de la mise en forme
new_data += data[:s.end()]
data = data[s.end():]
elif new_len < largeur - 1 :
# c'est un caratère normal, et il y a la place
new_data += data[0]
data = data[1:]
new_len += 1
else :
# c'est un caratère normal mais on a dépassé le max
data = data[1:]
if not data :
return new_data + '*'
elif l == largeur :
return data
elif alignement == 'g' :
return u' ' + data + u' '*(largeur-l-1)
elif alignement == 'd' :
return u' '*(largeur-l-1) + data + u' '
else :
return u' '*(l/2) + data + u' '*((l+1)/2)
return u' '*((largeur-l)/2) + data + u' '*((largeur-l+1)/2)
data = [ [ alligne(ligne[i],allignements[i],largeurs[i]) for i in range(nbcols) ] for ligne in data ]
data = [ [ aligne(ligne[i],alignement[i],largeur[i]) for i in range(nbcols) ] for ligne in data ]
# Le titre
##########
if titres :
if titre :
# ligne de titre
chaine = sep_col + sep_col.join([alligne(titres[i],'c',largeurs[i]) for i in range(nbcols)]) + sep_col + u'\n'
chaine = sep_col + sep_col.join([aligne(titre[i],'c',largeur[i]) for i in range(nbcols)]) + sep_col + u'\n'
# ligne de séparation
chaine += sep_col + u'+'.join([u'-'*largeurs[i] for i in range(nbcols)]) + sep_col + u'\n'
chaine += sep_col + u'+'.join([u'-'*largeur[i] for i in range(nbcols)]) + sep_col + u'\n'
else :
chaine = u''