Salome HOME
mise en cohesion 78
[tools/eficas.git] / Noyau / N_CR.py
1 # coding=utf-8
2 # Copyright (C) 2007-2013   EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19
20
21 """ Ce module contient la classe compte-rendu de validation
22 """
23
24 import string
25 from strfunc import convert, ufmt
26
27
28 class CR:
29
30     """
31          Classe servant à la construction et à l'affichage des objets Comptes-rendus
32     """
33
34     def __init__(self, verbeux='non', debut='', fin='', dec='   '):
35         """
36            Attributs
37             - verbeux
38             - debut
39             - fin
40             - dec
41         """
42         self.verbeux = verbeux
43         self.debut = debut
44         self.fin = fin
45         self.dec = dec
46         self.crok = []
47         self.crwarn = []
48         self.crfatal = []
49         self.crexception = []
50         self.subcr = []
51
52     def ok(self, comment):
53         """ Ajoute un commentaire OK à la liste crok"""
54         self.crok.append(comment)
55
56     def warn(self, comment):
57         """ Ajoute un commentaire Warning à la liste crwarn"""
58         self.crwarn.append(comment)
59
60     def fatal(self, comment, *args):
61         """Ajoute un commentaire Erreur Fatale à la liste crfatal à formater"""
62         self.crfatal.append(ufmt(comment, *args))
63
64     def exception(self, comment):
65         """ Ajoute un commentaire Exception à la liste crexception"""
66         self.crexception.append(comment)
67
68     def add(self, cr):
69         """ Ajoute un objet CR à la liste subcr :il s'agit de l'objet CR d'un fils de self """
70         self.subcr.append(cr)
71
72     def estvide(self):
73         """
74              Retourne 1 si self ne contient aucun message grave (fatal ou exception)
75              et aucun CR qui en contienne, 0 sinon
76         """
77         if self.crexception:
78             return 0
79         if self.crfatal:
80             return 0
81         for s in self.subcr:
82             if not s.estvide():
83                 return 0
84         return 1
85
86     def purge(self):
87         """
88              Purge complètement le CR sauf les exceptions
89         """
90         self.debut = ''
91         self.fin = ''
92         self.dec = '   '
93         self.crok = []
94         self.crwarn = []
95         self.crfatal = []
96         self.subcr = []
97
98     def beautifie_messages(self):
99         """
100           Beautifie les messages stockés dans crok,crfatal,crexception et crwarn
101         """
102         l = []
103         for mess in self.crok:
104             l.append(mess + '\n')
105         self.crok_belle = l
106         l = []
107         for mess in self.crwarn:
108             l.append(encadre_message(mess, '*'))
109         self.crwarn_belle = l
110         l = []
111         for mess in self.crfatal:
112             l.append(encadre_message(mess, '!'))
113         self.crfatal_belle = l
114         l = []
115         for mess in self.crexception:
116             l.append(encadre_message(mess, '!'))
117         self.crexception_belle = l
118
119     def indent(self, s):
120         """
121           Insère en tete de chaque ligne du texte s la chaine self.dec
122         """
123         l = string.split(s, '\n')
124         return self.dec + string.join(l, '\n' + self.dec)[:-3]
125
126     def __unicode__(self):
127         """
128           Retourne une chaine de caractères décorée et représentative de self
129         """
130         s = ''
131         self.beautifie_messages()
132         s = s + string.join(self.crok_belle, '')
133         s = s + string.join(self.crwarn_belle, '')
134         s = s + string.join(self.crfatal_belle, '')
135         s = s + string.join(self.crexception_belle, '')
136         for subcr in self.subcr:
137             if self.verbeux == 'oui':
138                 s = s + unicode(subcr) + '\n'
139             else:
140                 if not subcr.estvide():
141                     s = s + unicode(subcr)
142         if s != '':
143             s = self.debut + '\n' + self.indent(s) + self.fin + '\n'
144         else:
145             s = self.debut + '\n' + self.fin + '\n'
146         return s
147
148     def __str__(self):
149         """Return the report representation"""
150         # convert into the output encoding
151         txt = convert(self.__unicode__())
152         return txt
153
154     def report(self, decalage=2):
155         """
156           Retourne une chaine de caractères non encadrée mais représentative de self
157         """
158         s = ''
159         # on stocke dans s les messages de premier niveau
160         for mess in self.crok:
161             s = s + decalage * self.dec + mess + self.dec + '\n'
162         for mess in self.crwarn:
163             s = s + decalage * self.dec + mess + self.dec + '\n'
164         for mess in self.crfatal:
165             s = s + decalage * self.dec + mess + self.dec + '\n'
166         for mess in self.crexception:
167             s = s + decalage * self.dec + mess + self.dec + '\n'
168         # on récupère les messages des sous comptes-rendus ...
169         for subcr in self.subcr:
170             if not subcr.estvide():
171                 s = s + subcr.report(decalage=decalage + 1)
172         # on rajoute les flags de début et de fin ... (si self n'est pas vide)
173         if not self.estvide():
174             s = (decalage - 1) * self.dec + self.debut + '\n' + s + \
175                 (decalage - 1) * self.dec + self.fin + '\n'
176         return s
177
178     def get_mess_fatal(self):
179         """
180             Retourne une chaine de caractères contenant les messages de
181             la liste crfatal (du dernier au premier)
182         """
183         self.crfatal.reverse()
184         s = ''
185         for elem in self.crfatal:
186             s = s + elem
187         self.crfatal.reverse()
188         return s
189
190     def get_mess_exception(self):
191         """
192             Retourne une chaine de caractères contenant les messages
193             de la liste crexception (du dernier au premier)
194         """
195         self.crexception.reverse()
196         s = ''
197         for elem in self.crexception:
198             s = s + elem
199         self.crexception.reverse()
200         return s
201
202
203 separateurs = (' ', ',', '/')
204
205
206 def split(ligne, cesure):
207     ligne = string.rstrip(ligne)
208     if len(ligne) <= cesure:
209         return ligne
210     else:
211         coupure = cesure
212         while ligne[coupure] not in separateurs and coupure > 0:
213             coupure = coupure - 1
214         if coupure == 0:
215             # Il faut augmenter la cesure
216             coupure = cesure
217             while ligne[coupure] not in separateurs and coupure < len(ligne) - 1:
218                 coupure = coupure + 1
219         if coupure == len(ligne) - 1:
220             return ligne
221         else:
222             return ligne[:coupure + 1] + '\n' + split(ligne[coupure + 1:], cesure)
223
224
225 def justify_text(texte='', cesure=50):
226     texte = string.strip(texte)
227     liste_lignes = string.split(texte, '\n')
228     l = [split(l, cesure) for l in liste_lignes]
229     texte_justifie = string.join(l, '\n')
230     return texte_justifie
231
232
233 def encadre_message(texte, motif):
234     """
235        Retourne la chaine de caractères texte entourée d'un cadre formés
236        d'éléments 'motif'
237     """
238     texte = justify_text(texte, cesure=80)
239     lignes = string.split(texte, '\n')
240     longueur = 0
241     for ligne in lignes:
242         ligne = string.rstrip(ligne)
243         if len(ligne) > longueur:
244             longueur = len(ligne)
245     longueur = longueur + 4
246     txt = motif * longueur + '\n'
247     for ligne in lignes:
248         txt = txt + motif + ' ' + ligne + ' ' * \
249             (longueur - len(motif + ligne) - 2) + motif + '\n'
250     txt = txt + motif * longueur + '\n'
251     return txt