Salome HOME
CCAR: merge de la version de developpement V1_12a2 dans la branche principale
[tools/eficas.git] / Traducteur / removemocle.py
1 # -*- coding: utf-8 -*-
2 import logging
3 import regles
4 from parseur import FactNode
5 from dictErreurs import EcritErreur
6 from dictErreurs import jdcSet
7
8 #debug=1
9 debug=0
10 #on n'a qu'un mocle par commande. On peut donc supprimer le mocle sans trop de précautions (a part iterer a l'envers sur les commandes)
11 #avant de supprimer un autre mocle, on remet à jour l'arbre syntaxique (lineno,colno,etc.)
12
13
14 #-----------------------------------------------------------------------
15 def removeMotCle(jdc,command,mocle,ensemble=regles.SansRegle,erreur = 0):
16 #-----------------------------------------------------------------------
17     #on itere sur les commandes a l'envers pour ne pas polluer les numeros de ligne avec les modifications
18     if command not in jdcSet : return
19     boolChange=0
20     commands= jdc.root.childNodes[:]
21     commands.reverse()
22     for c in commands:
23         if c.name != command:continue
24         for mc in c.childNodes:
25             if mc.name != mocle:continue
26             if ensemble.verif(c) == 0 : continue
27             if erreur : EcritErreur((command,mocle),c.lineno)
28             boolChange=1
29             removeMC(jdc,c,mc)
30
31     if boolChange : jdc.reset(jdc.getSource())
32
33 #-------------------------------------------------------
34 def removeMotCleSiRegle(jdc,command,mocle,liste_regles) :
35 #-------------------------------------------------------
36     if command not in jdcSet : return
37     mesRegles=regles.ensembleRegles(liste_regles)
38     removeMotCle(jdc,command,mocle,mesRegles,erreur=0)
39
40 #----------------------------------------------------------------
41 def removeMotCleSiRegleAvecErreur(jdc,command,mocle,liste_regles) :
42 #--------------------------------------------------------------
43     if command not in jdcSet : return
44     mesRegles=regles.ensembleRegles(liste_regles)
45     removeMotCle(jdc,command,mocle,mesRegles,erreur=1)
46
47 #----------------------------------------------------------------
48 def removeMotCleAvecErreur(jdc,command,mocle) :
49 #--------------------------------------------------------------
50     if command not in jdcSet : return
51     removeMotCle(jdc,command,mocle,erreur=1)
52       
53
54 #--------------------------------------------------------------------
55 def removeCommande(jdc,command,ensemble=regles.SansRegle,erreur=0):
56 #--------------------------------------------------------------------
57     if command not in jdcSet : return
58     boolChange=0
59     commands= jdc.root.childNodes[:]
60     commands.reverse()
61     for c in commands:
62         if c.name != command:continue
63         if ensemble.verif(c) == 0 : continue
64         boolChange=1
65         if erreur : EcritErreur((command,),c.lineno)
66         jdc.supLignes(c.lineno,c.endline)
67         logging.warning("Suppression de: %s ligne %s",c.name,c.lineno)
68     if boolChange : jdc.reset(jdc.getSource())
69
70 #-------------------------------------------------------------
71 def removeCommandeSiRegleAvecErreur(jdc,command,liste_regles):
72 #-------------------------------------------------------------
73     if command not in jdcSet : return
74     mesRegles=regles.ensembleRegles(liste_regles)
75     removeCommande(jdc,command,mesRegles,1)
76                 
77 #---------------------------------
78 def removeMC(jdc,c,mc):
79 #---------------------------------
80     if debug : print "Suppression de:",c.name,mc.name,mc.lineno,mc.colno,mc.endline,mc.endcol
81     logging.info("Suppression de: %s, %s, ligne %d",c.name,mc.name,mc.lineno)
82
83     if mc.endline > mc.lineno:
84         if debug:print "mocle sur plusieurs lignes--%s--" % jdc.getLines()[mc.lineno-1][mc.colno:]
85         jdc.getLines()[mc.lineno-1]=jdc.getLines()[mc.lineno-1][:mc.colno]
86         jdc.getLines()[mc.endline-1]=jdc.getLines()[mc.endline-1][mc.endcol:]
87
88         #attention : supprimer les lignes à la fin
89         jdc.getLines()[mc.lineno:mc.endline-1]=[]
90     else:
91         if debug:print "mocle sur une ligne--%s--" % jdc.getLines()[mc.lineno-1][mc.colno:mc.endcol]
92         s=jdc.getLines()[mc.lineno-1]
93         jdc.getLines()[mc.lineno-1]=s[:mc.colno]+s[mc.endcol:]
94         fusionne(jdc,mc.lineno-1)
95
96 #---------------------------------------------------------------------------------
97 def removeMotCleInFact(jdc,command,fact,mocle,ensemble=regles.SansRegle,erreur=0):
98 #----------------------------------------------------------------------------------
99     # on itere sur les commandes a l'envers pour ne pas polluer 
100     # les numeros de ligne avec les modifications
101     if command not in jdcSet : return
102     commands= jdc.root.childNodes[:]
103     commands.reverse()
104     boolChange=0
105     for c in commands:
106         if c.name != command:continue
107         for mc in c.childNodes:
108             if mc.name != fact:continue
109             l=mc.childNodes[:]
110             l.reverse()
111             for ll in l:
112                 for n in ll.childNodes:
113                     if n.name != mocle:continue
114                     if ensemble.verif(c) == 0 : continue
115                     if erreur : EcritErreur((command,fact,mocle),c.lineno)
116                     boolChange=1
117                     removeMC(jdc,c,n)
118
119     if boolChange : jdc.reset(jdc.getSource())
120
121 #------------------------------------------------------------------
122 def removeMotCleInFactSiRegle(jdc,command,fact,mocle,liste_regles):
123 #------------------------------------------------------------------
124     if command not in jdcSet : return
125     erreur=0
126     mesRegles=regles.ensembleRegles(liste_regles)
127     removeMotCleInFact(jdc,command,fact,mocle,mesRegles,erreur)
128
129 #----------------------------------------------------------------------
130 def removeMotCleInFactSiRegleAvecErreur(jdc,command,fact,mocle,liste_regles):
131 #----------------------------------------------------------------------
132     if command not in jdcSet : return
133     erreur=1
134     mesRegles=regles.ensembleRegles(liste_regles)
135     removeMotCleInFact(jdc,command,fact,mocle,mesRegles,erreur)
136
137
138 #------------------------------------------
139 def fusionne(jdc,numLigne):
140 #------------------------------------------
141 #   fusionne la ligne numLigne et numLigne+1
142 #   si la ligne numLigne+1 ne contient que des parentheses
143 #   fermantes
144 #   et si la ligne  numLigne ne contient pas par un "#"
145 #   Attention a la difference de numerotation
146 #        jdc.getLines()[numLigne] donne la ligne numLigne + 1
147 #        alors que joinLineandNext(numLigne) travaille sur le tableau
148     index=0
149     texte=jdc.getLines()[numLigne]
150     fusion=1
151     while (index < len(texte)) :
152       if texte[index] not in (" ",",",")",";","\n") :
153          fusion=0
154          break
155       index=index+1
156        
157     if fusion == 0 : return;
158
159     texte=jdc.getLines()[numLigne -1]
160     if texte.find("#") < 0 :
161        fusion=1
162     else :
163        fusion=0
164  
165     if fusion : 
166        import load 
167        jdc.joinLineandNext(numLigne)