Salome HOME
ajout pour accepter les accents sous python 2.3
[tools/eficas.git] / Noyau / N_CR.py
1 # -*- coding: utf-8 -*-
2 #@ MODIF N_CR Noyau  DATE 20/01/2003   AUTEUR DURAND C.DURAND 
3 #            CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
6 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
7 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
8 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR   
9 # (AT YOUR OPTION) ANY LATER VERSION.                                 
10 #
11 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT 
12 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF          
13 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU    
14 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.                            
15 #
16 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE   
17 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,       
18 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.      
19 #                                                                       
20 #                                                                       
21 # ======================================================================
22 """ Ce module contient la classe compte-rendu de validation
23 """
24
25 import string
26
27 class CR :
28    """ 
29         Classe servant à la construction et à l'affichage des objets Comptes-rendus 
30    """
31    def __init__(self,verbeux = 'non',debut='',fin='',dec='   '):
32       """
33          Attributs
34           - verbeux
35           - debut
36           - fin
37           - dec
38       """
39       self.verbeux = verbeux
40       self.debut=debut
41       self.fin=fin
42       self.dec=dec
43       self.crok=[]
44       self.crwarn=[]
45       self.crfatal=[]
46       self.crexception=[]
47       self.subcr=[]
48
49    def ok(self,comment):
50       """ Ajoute un commentaire OK à la liste crok"""
51       self.crok.append(comment)
52
53    def warn(self,comment):
54       """ Ajoute un commentaire Warning à la liste crwarn"""
55       self.crwarn.append(comment)
56
57    def fatal(self,comment):
58       """ Ajoute un commentaire Erreur Fatale à la liste crfatal"""
59       self.crfatal.append(comment)
60
61    def exception(self,comment):
62       """ Ajoute un commentaire Exception à la liste crexception"""
63       self.crexception.append(comment)
64
65    def add(self,cr):
66       """ Ajoute un objet CR à la liste subcr :il s'agit de l'objet CR d'un fils de self """
67       self.subcr.append(cr)
68
69    def estvide(self):
70       """ 
71            Retourne 1 si self ne contient aucun message grave (fatal ou exception) et
72                           aucun CR qui en contienne,
73                     0 sinon
74       """
75       if self.crexception : return 0
76       if self.crfatal : return 0
77       for s in self.subcr :
78         if not s.estvide(): return 0
79       return 1
80
81    def purge(self):
82       """ 
83            Purge complètement le CR sauf les exceptions
84       """
85       self.debut=''
86       self.fin=''
87       self.dec='   '
88       self.crok=[]
89       self.crwarn=[]
90       self.crfatal=[]
91       self.subcr=[]
92
93    def beautifie_messages(self):
94       """
95         Beautifie les messages stockés dans crok,crfatal,crexception et crwarn
96       """
97       l=[]
98       for mess in self.crok:
99          l.append(mess+'\n')
100       self.crok_belle=l
101       l=[]
102       for mess in self.crwarn:
103          l.append(encadre_message(mess,'*'))
104       self.crwarn_belle = l
105       l=[]
106       for mess in self.crfatal:
107          l.append(encadre_message(mess,'!'))
108       self.crfatal_belle = l
109       l=[]
110       for mess in self.crexception:
111          l.append(encadre_message(mess,'!'))
112       self.crexception_belle = l
113
114    def indent(self,s):
115       """
116         Insère en tete de chaque ligne du texte s la chaine self.dec
117       """
118       l = string.split(s,'\n')
119       return self.dec+string.join(l,'\n'+self.dec)[:-3]
120
121    def __str__(self):
122       """
123         Retourne une chaine de caractères décorée et représentative de self
124       """
125       s=''
126       self.beautifie_messages()
127       s=s+string.join(self.crok_belle,'')
128       s=s+string.join(self.crwarn_belle,'')
129       s=s+string.join(self.crfatal_belle,'')
130       s=s+string.join(self.crexception_belle,'')
131       for subcr in self.subcr:
132          if self.verbeux == 'oui':
133             s=s+str(subcr)+'\n'
134          else:
135             if not subcr.estvide():
136                s=s+str(subcr)
137       if s != '':
138          s=self.debut+'\n'+self.indent(s)+self.fin+'\n'
139       else :
140          s=self.debut+'\n'+self.fin+'\n'
141       return s
142
143    def report(self,decalage = 2):
144       """
145         Retourne une chaine de caractères non encadrée mais représentative de self
146       """
147       s=''
148       # on stocke dans s les messages de premier niveau
149       for mess in self.crok :
150         s=s + decalage*self.dec + mess + self.dec + '\n'
151       for mess in self.crwarn:
152         s=s + decalage*self.dec + mess + self.dec + '\n'
153       for mess in self.crfatal:
154         s=s + decalage*self.dec + mess + self.dec + '\n'
155       for mess in self.crexception:
156         s=s + decalage*self.dec + mess + self.dec + '\n'
157       # on récupère les messages des sous comptes-rendus ...
158       for subcr in self.subcr:
159         if not subcr.estvide():
160             s=s+subcr.report(decalage = decalage + 1)
161       # on rajoute les flags de début et de fin ... (si self n'est pas vide)
162       if not self.estvide() :
163         s = (decalage-1)*self.dec+self.debut+'\n'+s+ \
164             (decalage-1)*self.dec+self.fin+'\n'
165       return s
166
167    def get_mess_fatal(self):
168       """
169           Retourne une chaine de caractères contenant les messages de 
170           la liste crfatal (du dernier au premier)
171       """
172       self.crfatal.reverse()
173       s=''
174       for elem in self.crfatal :
175         s=s+elem
176       self.crfatal.reverse()
177       return s
178
179    def get_mess_exception(self):
180       """
181           Retourne une chaine de caractères contenant les messages 
182           de la liste crexception (du dernier au premier)
183       """
184       self.crexception.reverse()
185       s=''
186       for elem in self.crexception :
187         s=s+elem
188       self.crexception.reverse()
189       return s
190
191
192
193
194 def justify_text_old(texte='',cesure=50):
195   """
196       Prend la chaine de caractères 'texte' et la retourne avec un retour chariot
197       tous les 'cesure' caractères s'il y a lieu (le retour chariot est placé dans un blanc
198       et non au milieu d'un mot
199   """
200   texte = string.strip(texte)
201   if len(texte) < cesure : return texte
202   liste_lignes = string.split(texte,'\n')
203   texte_justifie = ''
204   for ligne in liste_lignes :
205     ligne = string.strip(ligne)
206     if len(ligne) <= cesure :
207       texte_justifie = texte_justifie + ligne + '\n'
208       continue
209     longueur = 0
210     new_text = ''
211     liste_mots = string.split(ligne,' ')
212     for mot in liste_mots :
213       new_longueur = longueur + len(mot)+1
214       if new_longueur < cesure :
215         new_text = new_text+' '+mot
216         longueur = longueur + len(mot) + 1
217       else :
218         longueur = 0
219         new_text = new_text + '\n'+mot
220     texte_justifie = texte_justifie + string.strip(new_text) + '\n'
221   return texte_justifie[0:-1]
222
223 def encadre_message_old(texte,motif):
224   """ 
225      Retourne la chaine de caractères texte entourée d'un cadre formés
226      d'éléments 'motif'
227   """
228   texte = justify_text(texte,cesure=80)
229   lignes = string.split(texte,'\n')
230   longueur = 0
231   for ligne in lignes :
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
243 separateurs=(' ',',','/')
244 def split(ligne,cesure):
245        ligne= string.rstrip(ligne)
246        if len(ligne) <= cesure :
247           return ligne
248        else:
249           coupure=cesure
250           while ligne[coupure] not in separateurs and coupure > 0:
251              coupure = coupure - 1
252           if coupure == 0:
253              # Il faut augmenter la cesure
254              coupure =cesure
255              while ligne[coupure] not in separateurs and coupure < len(ligne)-1 :
256                 coupure = coupure + 1
257           if coupure == len(ligne)-1:
258              return ligne
259           else:
260              return ligne[:coupure+1]+ '\n' + split(ligne[coupure+1:],cesure)
261
262 def justify_text(texte='',cesure=50):
263        texte = string.strip(texte)
264        liste_lignes = string.split(texte,'\n')
265        l=[split(l,cesure) for l in liste_lignes]
266        texte_justifie=string.join(l,'\n')
267        return texte_justifie
268
269 def encadre_message(texte,motif):
270   """
271      Retourne la chaine de caractères texte entourée d'un cadre formés
272      d'éléments 'motif'
273   """
274   texte = justify_text(texte,cesure=80)
275   lignes = string.split(texte,'\n')
276   longueur = 0
277   for ligne in lignes :
278     ligne=string.rstrip(ligne)
279     if len(ligne)> longueur : longueur = len(ligne)
280   longueur = longueur + 4
281   txt = motif*longueur+'\n'
282   for ligne in lignes :
283     txt = txt + motif + ' '+ligne+' '*(longueur-len(motif+ligne)-2)+motif+'\n'
284   txt = txt + motif*longueur+'\n'
285   return txt
286
287
288
289