2 # Copyright (C) 2007-2013 EDF R&D
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.
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.
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
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 """ Ce module contient la classe compte-rendu de validation
25 from strfunc import convert, ufmt
31 Classe servant à la construction et à l'affichage des objets Comptes-rendus
34 def __init__(self, verbeux='non', debut='', fin='', dec=' '):
42 self.verbeux = verbeux
52 def ok(self, comment):
53 """ Ajoute un commentaire OK à la liste crok"""
54 self.crok.append(comment)
56 def warn(self, comment):
57 """ Ajoute un commentaire Warning à la liste crwarn"""
58 self.crwarn.append(comment)
60 def fatal(self, comment, *args):
61 """Ajoute un commentaire Erreur Fatale à la liste crfatal à formater"""
62 self.crfatal.append(ufmt(comment, *args))
64 def exception(self, comment):
65 """ Ajoute un commentaire Exception à la liste crexception"""
66 self.crexception.append(comment)
69 """ Ajoute un objet CR à la liste subcr :il s'agit de l'objet CR d'un fils de self """
74 Retourne 1 si self ne contient aucun message grave (fatal ou exception)
75 et aucun CR qui en contienne, 0 sinon
88 Purge complètement le CR sauf les exceptions
98 def beautifie_messages(self):
100 Beautifie les messages stockés dans crok,crfatal,crexception et crwarn
103 for mess in self.crok:
104 l.append(mess + '\n')
107 for mess in self.crwarn:
108 l.append(encadre_message(mess, '*'))
109 self.crwarn_belle = l
111 for mess in self.crfatal:
112 l.append(encadre_message(mess, '!'))
113 self.crfatal_belle = l
115 for mess in self.crexception:
116 l.append(encadre_message(mess, '!'))
117 self.crexception_belle = l
121 Insère en tete de chaque ligne du texte s la chaine self.dec
123 l = string.split(s, '\n')
124 return self.dec + string.join(l, '\n' + self.dec)[:-3]
126 def __unicode__(self):
128 Retourne une chaine de caractères décorée et représentative de self
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'
140 if not subcr.estvide():
141 s = s + unicode(subcr)
143 s = self.debut + '\n' + self.indent(s) + self.fin + '\n'
145 s = self.debut + '\n' + self.fin + '\n'
149 """Return the report representation"""
150 # convert into the output encoding
151 txt = convert(self.__unicode__())
154 def report(self, decalage=2):
156 Retourne une chaine de caractères non encadrée mais représentative de self
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'
178 def get_mess_fatal(self):
180 Retourne une chaine de caractères contenant les messages de
181 la liste crfatal (du dernier au premier)
183 self.crfatal.reverse()
185 for elem in self.crfatal:
187 self.crfatal.reverse()
190 def get_mess_exception(self):
192 Retourne une chaine de caractères contenant les messages
193 de la liste crexception (du dernier au premier)
195 self.crexception.reverse()
197 for elem in self.crexception:
199 self.crexception.reverse()
203 separateurs = (' ', ',', '/')
206 def split(ligne, cesure):
207 ligne = string.rstrip(ligne)
208 if len(ligne) <= cesure:
212 while ligne[coupure] not in separateurs and coupure > 0:
213 coupure = coupure - 1
215 # Il faut augmenter la cesure
217 while ligne[coupure] not in separateurs and coupure < len(ligne) - 1:
218 coupure = coupure + 1
219 if coupure == len(ligne) - 1:
222 return ligne[:coupure + 1] + '\n' + split(ligne[coupure + 1:], cesure)
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
233 def encadre_message(texte, motif):
235 Retourne la chaine de caractères texte entourée d'un cadre formés
238 texte = justify_text(texte, cesure=80)
239 lignes = string.split(texte, '\n')
242 ligne = string.rstrip(ligne)
243 if len(ligne) > longueur:
244 longueur = len(ligne)
245 longueur = longueur + 4
246 txt = motif * longueur + '\n'
248 txt = txt + motif + ' ' + ligne + ' ' * \
249 (longueur - len(motif + ligne) - 2) + motif + '\n'
250 txt = txt + motif * longueur + '\n'