Salome HOME
Version initiale de EFICAS 1.2
[tools/eficas.git] / generator / Formatage.py
1 """
2     Ce module contient la classe Formatage qui permet le formatage d'une 
3     liste de chaines de caractères dans une syntaxe représentative d'un
4     jeu de commandes en un texte présentable
5 """
6 import types,string
7
8 class Formatage :
9   """ 
10      Cette classe contient toutes les méthodes nécessaires au formatage
11      de la chaine de caracteres issue d'un generator en un fichier
12      'lisible' ie avec indentations
13   """
14   def __init__(self,l_jdc,code=None,mode=None,sep='=',l_max=72):
15     # l_jdc représente le jeu de commandes brut sous forme de liste
16     self.l_jdc = l_jdc
17     self.jdc_fini =''
18     self.count = 0
19     self.sep=sep
20     self.l_max=l_max
21     if mode == '.py':
22        self.sep = '='
23        self.l_max = 132 
24     elif code == 'ASTER':
25        self.sep = ':'
26        self.l_max = 72
27
28   def formate_jdc(self):
29     for etape in self.l_jdc:
30       self.count = self.count+1
31       self.texte_etape = ''
32       if type(etape)==types.ListType:
33         self.indent=[]
34         self.indent.append(len(etape[0]))
35         self.indent_courant = self.indent[0]
36         self.texte_etape = '\n' + etape[0]
37         if len(etape)>1 :
38           self.formate_etape(etape[1:])
39       else :
40         self.indent=[]
41         self.texte_etape = etape
42       self.jdc_fini = self.jdc_fini + '\n' + self.texte_etape
43     return self.jdc_fini
44
45   def formate_etape(self,liste):
46     ind = 0
47     for element in liste :
48       if type(element) == types.ListType:
49         # il s'agit d'un mot-clé facteur
50         # on écrit son nom
51         longueur = self.longueur(self.texte_etape)
52         try:
53           increment = len(('\n'+self.indent_courant*' ')*ind + element[0])
54         except:
55           print 'ERREUR'
56           print liste
57           print element
58         self.texte_etape = self.texte_etape + ('\n'+self.indent_courant*' ')*ind + element[0]
59         length = len(self.indent)
60         self.indent.insert(length,self.indent[length-1]+len(element[0]))
61         self.indent_courant = self.indent[length]
62         # on écrit ses fils
63         self.formate_etape(element[1:])
64       elif type(element) == types.StringType:
65         # il s'agit d'un mot-clé simple ou de ')' ou ');' ou '),'
66         if element == ')' or element == '),':
67           self.texte_etape = self.texte_etape + string.strip(element)
68           length = len(self.indent)
69           if length > 1:
70             last = self.indent[length-1]
71             self.indent.remove(last)
72             self.indent_courant=self.indent[length-2]
73           else :
74             self.indent_courant=self.indent[0]
75         elif element == ');':
76           length = len(self.indent)
77           if length > 1:
78             last = self.indent[length-1]
79             self.indent.remove(last)
80             self.indent_courant=self.indent[length-2]
81           else :
82             self.indent_courant=self.indent[0]
83           self.texte_etape = self.texte_etape + string.strip(element)
84         else :
85           longueur = self.longueur(self.texte_etape)
86           increment = len(('\n'+self.indent_courant*' ')*ind + string.strip(element))
87           #self.jdc_fini = self.jdc_fini + ('\n'+self.indent_courant*' ')*ind + string.strip(element)
88           if ((1-ind)*longueur+increment)  <= self.l_max :
89             self.texte_etape = self.texte_etape + ('\n'+self.indent_courant*' ')*ind + string.strip(element)
90           else :
91             # il faut couper ...
92             nom,valeur = string.split(element,self.sep,1)
93             chaine = self.creer_chaine(nom,valeur,'\n'+self.indent_courant*' ',ind)+','
94             #self.jdc_fini = self.jdc_fini + ('\n'+self.indent_courant*' ')*ind + string.strip(element)
95             self.texte_etape = self.texte_etape + chaine
96       ind = 1
97       
98   def longueur(self,texte):
99     """ 
100        texte est une string qui peut contenir des retours chariots
101        Cette méthode retourne la longueur de la dernière ligne de texte 
102     """
103     liste = string.split(texte,'\n')
104     return len(liste[-1])
105
106   def creer_chaine(self,nom,valeur,increment,ind):
107     s=''
108     if len(increment + nom + self.sep) <= self.l_max:
109       texte = increment*ind
110       label = nom + self.sep
111       s=texte + label
112       longueur = len(increment + label)
113       if len(string.split(valeur,'(')) == 1:
114         # il s'agit d'une vraie chaîne de caractères
115         val = len(valeur)
116         texte = (self.l_max-2-val)*' '+valeur
117         s=s+'\n'+texte
118       else :
119         # il s'agit d'une liste
120         liste = string.split(valeur,',')
121         i=0
122         for arg in liste :
123           ajout = string.strip(arg)
124           if len(ajout) == 0 : continue
125           longueur = self.longueur(texte = (texte + label)) + len(ajout +',') + (1-i)*len(increment)
126           if longueur  <= self.l_max:
127               if ajout[-1] != ')':
128                 texte = texte + ajout +','
129               else :
130                 texte = texte + ajout
131           else :
132             i=1
133             if ajout[-1] != ')':
134               texte = texte  + increment + (len(label)+2)*' ' + ajout +','
135             else :
136               texte = texte  + increment + (len(label)+2)*' ' + ajout
137       s=s+texte
138     return s
139