Salome HOME
premiere version
[tools/eficas.git] / Noyau / N_CR.py
1 # -*- coding: iso-8859-1 -*-
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 """ Ce module contient la classe compte-rendu de validation
21 """
22
23 import string
24 from strfunc import convert, ufmt
25
26 class CR :
27    """
28         Classe servant à la construction et à l'affichage des objets Comptes-rendus
29    """
30    def __init__(self,verbeux = 'non',debut='',fin='',dec='   '):
31       """
32          Attributs
33           - verbeux
34           - debut
35           - fin
36           - dec
37       """
38       self.verbeux = verbeux
39       self.debut=debut
40       self.fin=fin
41       self.dec=dec
42       self.crok=[]
43       self.crwarn=[]
44       self.crfatal=[]
45       self.crexception=[]
46       self.subcr=[]
47
48    def ok(self,comment):
49       """ Ajoute un commentaire OK à la liste crok"""
50       self.crok.append(comment)
51
52    def warn(self,comment):
53       """ Ajoute un commentaire Warning à la liste crwarn"""
54       self.crwarn.append(comment)
55
56    def fatal(self, comment, *args):
57       """Ajoute un commentaire Erreur Fatale à la liste crfatal à formater"""
58       self.crfatal.append(ufmt(comment, *args))
59
60    def exception(self,comment):
61       """ Ajoute un commentaire Exception à la liste crexception"""
62       self.crexception.append(comment)
63
64    def add(self,cr):
65       """ Ajoute un objet CR à la liste subcr :il s'agit de l'objet CR d'un fils de self """
66       self.subcr.append(cr)
67
68    def estvide(self):
69       """
70            Retourne 1 si self ne contient aucun message grave (fatal ou exception)
71            et aucun CR qui en contienne, 0 sinon
72       """
73       if self.crexception : return 0
74       if self.crfatal : return 0
75       for s in self.subcr :
76         if not s.estvide(): return 0
77       return 1
78
79    def purge(self):
80       """
81            Purge complètement le CR sauf les exceptions
82       """
83       self.debut=''
84       self.fin=''
85       self.dec='   '
86       self.crok=[]
87       self.crwarn=[]
88       self.crfatal=[]
89       self.subcr=[]
90
91    def beautifie_messages(self):
92       """
93         Beautifie les messages stockés dans crok,crfatal,crexception et crwarn
94       """
95       l=[]
96       for mess in self.crok:
97          l.append(mess+'\n')
98       self.crok_belle=l
99       l=[]
100       for mess in self.crwarn:
101          l.append(encadre_message(mess,'*'))
102       self.crwarn_belle = l
103       l=[]
104       for mess in self.crfatal:
105          l.append(encadre_message(mess,'!'))
106       self.crfatal_belle = l
107       l=[]
108       for mess in self.crexception:
109          l.append(encadre_message(mess,'!'))
110       self.crexception_belle = l
111
112    def indent(self,s):
113       """
114         Insère en tete de chaque ligne du texte s la chaine self.dec
115       """
116       l = string.split(s,'\n')
117       return self.dec+string.join(l,'\n'+self.dec)[:-3]
118
119    def __unicode__(self):
120       """
121         Retourne une chaine de caractères décorée et représentative de self
122       """
123       s=''
124       self.beautifie_messages()
125       s=s+string.join(self.crok_belle,'')
126       s=s+string.join(self.crwarn_belle,'')
127       s=s+string.join(self.crfatal_belle,'')
128       s=s+string.join(self.crexception_belle,'')
129       for subcr in self.subcr:
130          if self.verbeux == 'oui':
131             s=s+unicode(subcr)+'\n'
132          else:
133             if not subcr.estvide():
134                s=s+unicode(subcr)
135       if s != '':
136          s=self.debut+'\n'+self.indent(s)+self.fin+'\n'
137       else :
138          s=self.debut+'\n'+self.fin+'\n'
139       return s
140
141    def __str__(self):
142       """Return the report representation"""
143       # convert into the output encoding
144       txt = convert(self.__unicode__())
145       return txt
146
147    def report(self,decalage = 2):
148       """
149         Retourne une chaine de caractères non encadrée mais représentative de self
150       """
151       s=''
152       # on stocke dans s les messages de premier niveau
153       for mess in self.crok :
154         s=s + decalage*self.dec + mess + self.dec + '\n'
155       for mess in self.crwarn:
156         s=s + decalage*self.dec + mess + self.dec + '\n'
157       for mess in self.crfatal:
158         s=s + decalage*self.dec + mess + self.dec + '\n'
159       for mess in self.crexception:
160         s=s + decalage*self.dec + mess + self.dec + '\n'
161       # on récupère les messages des sous comptes-rendus ...
162       for subcr in self.subcr:
163         if not subcr.estvide():
164             s=s+subcr.report(decalage = decalage + 1)
165       # on rajoute les flags de début et de fin ... (si self n'est pas vide)
166       if not self.estvide() :
167         s = (decalage-1)*self.dec+self.debut+'\n'+s+ \
168             (decalage-1)*self.dec+self.fin+'\n'
169       return s
170
171    def get_mess_fatal(self):
172       """
173           Retourne une chaine de caractères contenant les messages de
174           la liste crfatal (du dernier au premier)
175       """
176       self.crfatal.reverse()
177       s=''
178       for elem in self.crfatal :
179         s=s+elem
180       self.crfatal.reverse()
181       return s
182
183    def get_mess_exception(self):
184       """
185           Retourne une chaine de caractères contenant les messages
186           de la liste crexception (du dernier au premier)
187       """
188       self.crexception.reverse()
189       s=''
190       for elem in self.crexception :
191         s=s+elem
192       self.crexception.reverse()
193       return s
194
195
196 separateurs=(' ',',','/')
197 def split(ligne,cesure):
198        ligne= string.rstrip(ligne)
199        if len(ligne) <= cesure :
200           return ligne
201        else:
202           coupure=cesure
203           while ligne[coupure] not in separateurs and coupure > 0:
204              coupure = coupure - 1
205           if coupure == 0:
206              # Il faut augmenter la cesure
207              coupure =cesure
208              while ligne[coupure] not in separateurs and coupure < len(ligne)-1 :
209                 coupure = coupure + 1
210           if coupure == len(ligne)-1:
211              return ligne
212           else:
213              return ligne[:coupure+1]+ '\n' + split(ligne[coupure+1:],cesure)
214
215 def justify_text(texte='',cesure=50):
216        texte = string.strip(texte)
217        liste_lignes = string.split(texte,'\n')
218        l=[split(l,cesure) for l in liste_lignes]
219        texte_justifie=string.join(l,'\n')
220        return texte_justifie
221
222 def encadre_message(texte,motif):
223   """
224      Retourne la chaine de caractères texte entourée d'un cadre formés
225      d'éléments 'motif'
226   """
227   texte = justify_text(texte,cesure=80)
228   lignes = string.split(texte,'\n')
229   longueur = 0
230   for ligne in lignes :
231     ligne=string.rstrip(ligne)
232     if len(ligne)> longueur : longueur = len(ligne)
233   longueur = longueur + 4
234   txt = motif*longueur+'\n'
235   for ligne in lignes :
236     txt = txt + motif + ' '+ligne+' '*(longueur-len(motif+ligne)-2)+motif+'\n'
237   txt = txt + motif*longueur+'\n'
238   return txt
239
240
241
242