2 Ce module contient le plugin generateur de fichier au format
10 from Noyau.N_utils import repr_float
11 from Accas import ETAPE,PROC_ETAPE,MACRO_ETAPE,ETAPE_NIVEAU,JDC,FORM_ETAPE
12 from Accas import MCSIMP,MCFACT,MCBLOC,MCList,EVAL
13 from Accas import GEOM,ASSD,MCNUPLET
14 from Accas import COMMENTAIRE,PARAMETRE, PARAMETRE_EVAL,COMMANDE_COMM
15 from Formatage import Formatage
19 Retourne les informations nécessaires pour le chargeur de plugins
21 Ces informations sont retournées dans un dictionnaire
26 # La factory pour créer une instance du plugin
27 'factory' : PythonGenerator,
31 class PythonGenerator:
33 Ce generateur parcourt un objet de type JDC et produit
34 un fichier au format python
36 L'acquisition et le parcours sont réalisés par la méthode
37 generator.gener(objet_jdc,format)
39 L'écriture du fichier au format ini par appel de la méthode
40 generator.writefile(nom_fichier)
42 Ses caractéristiques principales sont exposées dans des attributs
45 - extensions : qui donne une liste d'extensions de fichier préconisées
48 # Les extensions de fichier préconisées
51 def __init__(self,cr=None):
52 # Si l'objet compte-rendu n'est pas fourni, on utilise le compte-rendu standard
56 self.cr=N_CR.CR(debut='CR generateur format python pour python',
57 fin='fin CR format python pour python')
58 # Le texte au format python est stocké dans l'attribut text
61 def writefile(self,filename):
66 def gener(self,obj,format='brut'):
68 Retourne une représentation du JDC obj sous une
69 forme qui est paramétrée par format.
70 Si format vaut 'brut', retourne une liste de listes de ...
71 Si format vaut 'standard', retourne un texte obtenu par concaténation de la liste
72 Si format vaut 'beautifie', retourne le meme texte beautifié
74 liste= self.generator(obj)
77 elif format == 'standard':
78 self.text=string.join(liste)
79 elif format == 'beautifie':
80 jdc_formate = Formatage(liste,mode='.py')
81 self.text=jdc_formate.formate_jdc()
83 raise "Format pas implémenté : "+format
86 def generator(self,obj):
88 Cette methode joue un role d'aiguillage en fonction du type de obj
89 On pourrait utiliser les méthodes accept et visitxxx à la
90 place (dépend des gouts !!!)
92 # ATTENTION a l'ordre des tests : il peut avoir de l'importance (héritage)
93 if isinstance(obj,PROC_ETAPE):
94 return self.generPROC_ETAPE(obj)
95 elif isinstance(obj,MACRO_ETAPE):
96 return self.generMACRO_ETAPE(obj)
97 elif isinstance(obj,FORM_ETAPE):
98 return self.generFORM_ETAPE(obj)
99 elif isinstance(obj,ETAPE):
100 return self.generETAPE(obj)
101 elif isinstance(obj,MCFACT):
102 return self.generMCFACT(obj)
103 elif isinstance(obj,MCList):
104 return self.generMCList(obj)
105 elif isinstance(obj,MCBLOC):
106 return self.generMCBLOC(obj)
107 elif isinstance(obj,MCSIMP):
108 return self.generMCSIMP(obj)
109 elif isinstance(obj,ASSD):
110 return self.generASSD(obj)
111 elif isinstance(obj,ETAPE_NIVEAU):
112 return self.generETAPE_NIVEAU(obj)
113 elif isinstance(obj,COMMENTAIRE):
114 return self.generCOMMENTAIRE(obj)
115 # Attention doit etre placé avant PARAMETRE (raison : héritage)
116 elif isinstance(obj,PARAMETRE_EVAL):
117 return self.generPARAMETRE_EVAL(obj)
118 elif isinstance(obj,PARAMETRE):
119 return self.generPARAMETRE(obj)
120 elif isinstance(obj,EVAL):
121 return self.generEVAL(obj)
122 elif isinstance(obj,COMMANDE_COMM):
123 return self.generCOMMANDE_COMM(obj)
124 elif isinstance(obj,JDC):
125 return self.generJDC(obj)
126 elif isinstance(obj,MCNUPLET):
127 return self.generMCNUPLET(obj)
129 raise "Type d'objet non prévu",obj
131 def generJDC(self,obj):
133 Cette méthode convertit un objet JDC en une liste de chaines de
134 caractères à la syntaxe python
137 if obj.definition.l_niveaux == ():
138 # Il n'y a pas de niveaux
139 for etape in obj.etapes:
140 l.append(self.generator(etape))
143 for etape_niveau in obj.etapes_niveaux:
144 l.extend(self.generator(etape_niveau))
146 # Si au moins une étape, on ajoute le retour chariot sur la dernière étape
147 if type(l[-1])==types.ListType:
148 l[-1][-1] = l[-1][-1]+'\n'
149 elif type(l[-1])==types.StringType:
153 def generMCNUPLET(self,obj):
155 Méthode générant une représentation de self permettant son ecriture
156 dans le format python
160 for v in obj.mc_liste:
161 text = re.sub(".*=","",self.generator(v))
166 def generCOMMANDE_COMM(self,obj):
168 Cette méthode convertit un COMMANDE_COMM
169 en une liste de chaines de caractères à la syntaxe python
171 l_lignes = string.split(obj.valeur,'\n')
173 for ligne in l_lignes:
174 txt = txt + '##'+ligne+'\n'
177 def generEVAL(self,obj):
179 Cette méthode convertit un EVAL
180 en une liste de chaines de caractères à la syntaxe python
182 return 'EVAL("""'+ obj.valeur +'""")'
184 def generCOMMENTAIRE(self,obj):
186 Cette méthode convertit un COMMENTAIRE
187 en une liste de chaines de caractères à la syntaxe python
189 l_lignes = string.split(obj.valeur,'\n')
191 for ligne in l_lignes:
192 txt = txt + '#'+ligne+'\n'
195 def generPARAMETRE_EVAL(self,obj):
197 Cette méthode convertit un PARAMETRE_EVAL
198 en une liste de chaines de caractères à la syntaxe python
200 if obj.valeur == None:
201 return obj.nom + ' = None ;\n'
203 return obj.nom + ' = '+ self.generator(obj.valeur) +';\n'
205 def generPARAMETRE(self,obj):
207 Cette méthode convertit un PARAMETRE
208 en une liste de chaines de caractères à la syntaxe python
210 if type(obj.valeur) == types.StringType:
211 return obj.nom + " = '" + obj.valeur + "';\n"
213 return obj.nom + ' = ' + str(obj.valeur) + ';\n'
215 def generETAPE_NIVEAU(self,obj):
217 Cette méthode convertit une étape niveau
218 en une liste de chaines de caractères à la syntaxe python
221 if obj.etapes_niveaux == []:
222 for etape in obj.etapes:
223 l.append(self.generator(etape))
225 for etape_niveau in obj.etapes_niveaux:
226 l.extend(self.generator(etape_niveau))
229 def generETAPE(self,obj):
231 Cette méthode convertit une étape
232 en une liste de chaines de caractères à la syntaxe python
235 sdname= self.generator(obj.sd)
239 label=sdname + '='+obj.definition.nom+'('
241 if obj.reuse != None :
242 str = 'reuse ='+ self.generator(obj.reuse) + ','
244 for v in obj.mc_liste:
245 if isinstance(v,MCBLOC) :
246 liste=self.generator(v)
249 elif isinstance(v,MCSIMP) :
250 text=self.generator(v)
251 l.append(v.nom+'='+text)
254 liste=self.generator(v)
255 liste[0]=v.nom+'='+liste[0]
263 def generFORM_ETAPE(self,obj):
265 Méthode particulière pour les objets de type FORMULE
269 if nom == '' : nom = 'sansnom'
270 if len(obj.mc_liste)>0:
271 l.append(nom + ' = FORMULE(')
272 s=obj.type_retourne + ' = ' + "'''" + obj.arguments + ' = ' + obj.corps+"'''"
276 l.append(nom+' = FORMULE();')
279 def generMACRO_ETAPE(self,obj):
281 Cette méthode convertit une macro-étape
282 en une liste de chaines de caractères à la syntaxe python
284 if obj.definition.nom == 'FORMULE' : return self.gen_formule(obj)
289 sdname= self.generator(obj.sd)+'='
293 label = sdname + obj.definition.nom+'('
295 if obj.reuse != None:
296 # XXX faut il la virgule ou pas ????
297 str = "reuse =" + self.generator(obj.reuse) + ','
299 for v in obj.mc_liste:
300 if isinstance(v,MCBLOC) :
301 liste=self.generator(v)
304 elif isinstance(v,MCSIMP) :
305 text=self.generator(v)
306 l.append(v.nom+'='+text)
309 liste=self.generator(v)
310 liste[0]=v.nom+'='+liste[0]
319 def gen_formule(self,obj):
321 Méthode particuliere aux objets de type FORMULE
327 sdname= self.generator(obj.sd)
331 label=sdname + ' = FORMULE('
333 for v in obj.mc_liste:
335 s= v.nom+':'+sdname+'('+v.valeur+')'
343 def generPROC_ETAPE(self,obj):
345 Cette méthode convertit une PROC étape
346 en une liste de chaines de caractères à la syntaxe python
349 label=obj.definition.nom+'('
351 for v in obj.mc_liste:
352 if isinstance(v,MCBLOC) :
353 liste=self.generator(v)
356 elif isinstance(v,MCSIMP) :
357 text=self.generator(v)
358 l.append(v.nom+'='+text)
361 liste=self.generator(v)
362 liste[0]=v.nom+'='+liste[0]
371 def generASSD(self,obj):
373 Convertit un objet dérivé d'ASSD en une chaine de caractères à la
376 return obj.get_name()
378 def generMCFACT(self,obj):
380 Convertit un objet MCFACT en une liste de chaines de caractères à la
385 for v in obj.mc_liste:
386 if not isinstance(v,MCSIMP) and not isinstance (v,MCBLOC) :
387 # on est en présence d'une entite composée : on récupère une liste
388 liste=self.generator(v)
389 liste[0]=v.nom+'='+liste[0]
391 elif isinstance(v,MCBLOC):
392 liste=self.generator(v)
396 # on a est en présence d'un MCSIMP : on récupère une string
397 text =self.generator(v)
398 l.append(v.nom+'='+text)
399 # il faut être plus subtil dans l'ajout de la virgule en différenciant
400 # le cas où elle est obligatoire (si self a des frères cadets
401 # dans self.parent) ou non
402 # (cas où self est seul ou le benjamin de self.parent)
406 def generMCList(self,obj):
408 Convertit un objet MCList en une liste de chaines de caractères à la
414 for mcfact in obj.data:
415 l.append(self.generator(mcfact))
419 def generMCBLOC(self,obj):
421 Convertit un objet MCBLOC en une liste de chaines de caractères à la
425 for v in obj.mc_liste:
426 if isinstance(v,MCBLOC) :
427 liste=self.generator(v)
430 elif isinstance(v,MCList):
431 liste=self.generator(v)
432 liste[0]=v.nom+'='+liste[0]
436 data=self.generator(v)
437 if type(data) == types.ListType:
438 data[0]=v.nom+'='+data[0]
444 def generMCSIMP(self,obj) :
446 Convertit un objet MCSIMP en une liste de chaines de caractères à la
449 if type(obj.valeur) in (types.TupleType,types.ListType) :
451 for val in obj.valeur :
452 if type(val) == types.InstanceType :
453 if hasattr(obj.etape,'sdprods'):
454 if val in obj.etape.sdprods :
455 s = s + "CO('"+ self.generator(val) +"')"
457 s = s + self.generator(val)
458 elif isinstance(val,PARAMETRE):
459 # il ne faut pas prendre la string que retourne gener
460 # mais seulement le nom dans le cas d'un paramètre
463 s = s + self.generator(val)
467 if len(obj.valeur) > 1:
471 if type(val) == types.InstanceType :
472 if hasattr(obj.etape,'sdprods'):
473 if val in obj.etape.sdprods :
474 s = "CO('"+ self.generator(val) +"')"
476 s = self.generator(val)
477 elif isinstance(val,PARAMETRE):
478 # il ne faut pas prendre la string que retourne gener
479 # mais seulement le nom dans le cas d'un paramètre
482 s = self.generator(val)
483 elif type(val) == types.FloatType :
484 # Pour un réel on fait un formattage spécial
485 # XXX bizarrement ce n'est pas fait pour une liste