Salome HOME
Version initiale de EFICAS 1.2
[tools/eficas.git] / convert / convert_asterv5.py
1 """
2     Ce module contient le plugin convertisseur de fichier
3     au format asterv5 pour EFICAS.
4
5     Un plugin convertisseur doit fournir deux attributs de classe :
6     extensions et formats et deux méthodes : readfile,convert.
7
8     L'attribut de classe extensions est une liste d'extensions
9     de fichiers préconisées pour ce type de format. Cette information
10     est seulement indicative.
11
12     L'attribut de classe formats est une liste de formats de sortie
13     supportés par le convertisseur. Les formats possibles sont :
14     eval, dict ou exec.
15     Le format eval est un texte source Python qui peut etre evalué. Le
16     résultat de l'évaluation est un objet Python quelconque.
17     Le format dict est un dictionnaire Python.
18     Le format exec est un texte source Python qui peut etre executé. 
19
20     La méthode readfile a pour fonction de lire un fichier dont le
21     nom est passé en argument de la fonction.
22        convertisseur.readfile(nom_fichier)
23
24     La méthode convert a pour fonction de convertir le fichier
25     préalablement lu dans un objet du format passé en argument.
26        objet=convertisseur.convert(outformat)
27
28     Ce convertisseur supporte uniquement le format de sortie exec
29
30 """
31 import sys,string,traceback
32
33 from Noyau import N_CR
34
35 def entryPoint():
36    """
37        Retourne les informations nécessaires pour le chargeur de plugins
38        Ces informations sont retournées dans un dictionnaire
39    """
40    return {
41         # Le nom du plugin
42           'name' : 'asterv5',
43         # La factory pour créer une instance du plugin
44           'factory' : AsterParser,
45           }
46
47 import Parserv5.conv
48 import parseur_python
49
50 class AsterParser:
51    """
52    """
53    # Les extensions de fichier préconisées
54    extensions=('.comm',)
55    # Les formats de sortie supportés (eval dict ou exec)
56    formats=('exec','execnoparseur')
57
58    def __init__(self,cr=None):
59       # Si l'objet compte-rendu n'est pas fourni, on utilise le compte-rendu standard
60       if cr :
61          self.cr=cr
62       else:
63          self.cr=N_CR.CR(debut='CR convertisseur format asterv5',
64                          fin='fin CR format asterv5')
65       self.oldtext=''
66       self.out=self.err=self.warn=''
67
68    def readfile(self,filename):
69       self.filename=filename
70       try:
71          self.text=open(filename).read()
72       except:
73          self.cr.fatal("Impossible ouvrir fichier %s" % filename)
74          return
75
76    def convert(self,outformat):
77       if outformat == 'exec':
78          return self.getexec()
79       elif outformat == 'execnoparseur':
80          return self.getexecnoparseur()
81       else:
82          raise "Format de sortie : %s, non supporté"
83
84    def getexec(self):
85       if self.text != self.oldtext:
86          self.out, self.err, self.warn= Parserv5.conv.conver(self.text)
87          if self.err:
88             self.cr.fatal("Erreur a l'interpretation de %s" % self.filename)
89             self.cr.fatal(str(self.err))
90             return self.out
91          # On transforme les commentaires et les parametres en objets Python
92          # avec un deuxième parseur
93          try:
94             self.out = parseur_python.PARSEUR_PYTHON(self.out).get_texte()
95          except:
96             self.cr.fatal("Erreur dans la deuxième phase d interpretation de %s" % self.filename)
97             tracebak.print_exc()
98             return ""
99          self.oldtext=self.text
100       return self.out
101
102    def getexecnoparseur(self):
103       if self.text != self.oldtext:
104          self.out, self.err, self.warn= Parserv5.conv.conver(self.text)
105          if self.err:
106             self.cr.fatal("Erreur a l'interpretation de %s" % self.filename)
107             self.cr.fatal(str(self.err))
108             return self.out
109          self.oldtext=self.text
110       return self.out
111