1 # -*- coding: utf-8 -*-
4 from parseur import FactNode
5 from dictErreurs import EcritErreur
6 from dictErreurs import jdcSet
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.)
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
20 commands= jdc.root.childNodes[:]
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)
31 if boolChange : jdc.reset(jdc.getSource())
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)
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)
47 #----------------------------------------------------------------
48 def removeMotCleAvecErreur(jdc,command,mocle) :
49 #--------------------------------------------------------------
50 if command not in jdcSet : return
51 removeMotCle(jdc,command,mocle,erreur=1)
54 #--------------------------------------------------------------------
55 def removeCommande(jdc,command,ensemble=regles.SansRegle,erreur=0):
56 #--------------------------------------------------------------------
57 if command not in jdcSet : return
59 commands= jdc.root.childNodes[:]
62 if c.name != command:continue
63 if ensemble.verif(c) == 0 : continue
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())
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)
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)
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:]
88 #attention : supprimer les lignes à la fin
89 jdc.getLines()[mc.lineno:mc.endline-1]=[]
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)
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[:]
106 if c.name != command:continue
107 for mc in c.childNodes:
108 if mc.name != fact:continue
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)
119 if boolChange : jdc.reset(jdc.getSource())
121 #------------------------------------------------------------------
122 def removeMotCleInFactSiRegle(jdc,command,fact,mocle,liste_regles):
123 #------------------------------------------------------------------
124 if command not in jdcSet : return
126 mesRegles=regles.ensembleRegles(liste_regles)
127 removeMotCleInFact(jdc,command,fact,mocle,mesRegles,erreur)
129 #----------------------------------------------------------------------
130 def removeMotCleInFactSiRegleAvecErreur(jdc,command,fact,mocle,liste_regles):
131 #----------------------------------------------------------------------
132 if command not in jdcSet : return
134 mesRegles=regles.ensembleRegles(liste_regles)
135 removeMotCleInFact(jdc,command,fact,mocle,mesRegles,erreur)
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
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
149 texte=jdc.getLines()[numLigne]
151 while (index < len(texte)) :
152 if texte[index] not in (" ",",",")",";","\n") :
157 if fusion == 0 : return;
159 texte=jdc.getLines()[numLigne -1]
160 if texte.find("#") < 0 :
167 jdc.joinLineandNext(numLigne)