1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2013 EDF R&D
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 from Traducteur.parseur import FactNode
22 from Traducteur.load import jdcSet
23 from Traducteur.dictErreurs import EcritErreur
24 from Traducteur import regles
28 #-----------------------------------
29 def insereMotCle(jdc,recepteur,texte):
30 #-----------------------------------
31 # appelle la methode selon la classe
34 if recepteur.name not in jdcSet : return
35 if recepteur.__class__.__name__ == "Command" :
36 if debug : print " Ajout de ", texte, "dans la commande : " ,recepteur.name
37 insereMotCleDansCommande(jdc,recepteur,texte)
41 #--------------------------------------------
42 def insereMotCleDansCommande(jdc,command,texte):
43 #---------------------------------------------
44 # insere le texte comme 1er mot cle
46 if command.name not in jdcSet : return
47 if debug : print "insereMotCle ", texte , " dans ", command.name
48 numcol=chercheDebut1Mot(jdc,command)
50 jdc.splitLine(command.lineno,numcol)
52 while texte[indice] == " " or texte[indice] == "\n":
54 if texte[indice] != "," : texte=texte+","
57 jdc.addLine(texte,command.lineno)
58 logging.info("Insertion de : %s ligne %d", texteinfo,command.lineno)
59 if numcol > 0 : # Les mots clefs etaient sur la même ligne
60 jdc.joinLineandNext(command.lineno)
62 #-------------------------------------------------------------
63 def insereMotCleDansFacteur(jdc,facteur,texte,plusieursFois=True):
64 #----------------------------------------------------------------
65 if debug : print "insereMotCle ", texte , " dans ", facteur.name
67 if texte[-1] == "\n" : texte=texte[0:-1]
68 ancien=jdc.getLine(facteur.lineno)
70 # On va chercher la derniere ) pour ajouter avant
71 # on va verifier s il il y a un , avant
72 # si le texte ne finit pas par une ","
76 while texte[indice] == " " :
78 if texte[indice] != "," :
80 if (texte.find("#") > -1) and (texte.find("#") < texte.find(",")) :
86 ligneaCouper=facteur.lineno
87 while ligneaCouper < facteur.endline + 1 :
92 while ancien.find("_F") > 0 :
94 indice=ancien.find("_F")
96 # pour ne pas tenir compte des autres noms
97 # Attention si 2 MCF sur la meme ligne (la 1ere)
99 if ((ligneaCouper!=facteur.lineno) or ((ancien.find(facteur.name) < indice ) or (ancien.find(facteur.name) < 0))) :
101 indiceParcours=indice + 2
102 # attention pour regler DEFI_FONCTION ..
104 indiceDeCoupe=indiceDeCoupe+indice+2
105 ancien=ancien[indice +2:]
108 indiceDeCoupe=indiceDeCoupe+indice
109 # print "indice de Parcours" ,indiceParcours
110 # print ancien[indiceParcours]
111 # print ancien[indiceParcours+1]
112 # print ancien[indiceParcours+2]
113 while indiceParcours < longueur :
114 if ancien[indiceParcours] == "(" :
118 if ancien[indiceParcours] != " " :
122 indiceParcours = indiceParcours+1
123 trouve = trouveP * trouveF
125 ancien=ancien[indice+1:]
127 debut=indiceDeCoupe + 3
128 if(jdc.getLine(ligneaCouper)[debut:]!="\n"):
129 jdc.splitLine(ligneaCouper,debut)
130 jdc.addLine(texte,ligneaCouper)
131 jdc.joinLineandNext(ligneaCouper)
132 logging.info("Insertion de %s ligne %d", texteinfo,ligneaCouper)
134 # Gestion du cas particulier du mot clef facteur vide
135 if facteur.childNodes == []:
136 jdc.joinLineandNext(facteur.lineno)
138 ligneaCouper=ligneaCouper+1
139 ancien=jdc.getLine(ligneaCouper)
140 if not plusieursFois and trouve : break
143 #-----------------------------------
144 def chercheDebut1Mot(jdc,command):
145 #-----------------------------------
146 # Retourne le numero de colonne si le 1er mot clef est
147 # sur la meme ligne que le mot clef facteur
149 assert (command.childNodes != [])
151 node1=command.childNodes[0]
152 if hasattr(node1,"lineno"):
153 if node1.lineno == command.lineno :
156 debut=chercheDebutFacteur(jdc,command)
157 if debut == -1 and debug : print "attention!!! pb pour trouver le debut dans ", command
160 #-----------------------------------
161 def chercheDebutFacteur(jdc,facteur):
162 #-----------------------------------
164 ligne=jdc.getLines()[facteur.lineno]
165 debut=ligne.find("_F")
166 if debut > -1 : debut=debut + 3
170 #-----------------------------------
171 def chercheAlignement(jdc,command):
172 #-----------------------------------
173 # Retourne le nb de blanc
174 # pour aligner sur le 1er mot clef fils
175 assert (command.childNodes != [])
176 node1=command.childNodes[0]
180 #---------------------------------------------------------------------------------------------------------
181 def chercheOperInsereFacteur(jdc,nomcommande,nouveau,ensemble=regles.SansRegle, estunFacteur=1, erreur=0):
182 #--------------------------------------------------------------------------------------------------------
185 # appelle insereMotCle pour ajouter le texte
189 texte=nouveau+"=_F(),"
192 if nomcommande not in jdcSet : return
193 commands= jdc.root.childNodes[:]
196 if c.name != nomcommande:continue
197 if ensemble.verif(c) == 0 : continue
198 if erreur : EcritErreur((nomcommande,nouveau),c.lineno)
200 insereMotCle(jdc,c,texte)
201 if boolChange : jdc.reset(jdc.getSource())
203 #----------------------------------------------------------------------------------------
204 def chercheOperInsereFacteurSiRegle(jdc,nomcommande,nouveau,liste_regles, estunFacteur=1):
205 #----------------------------------------------------------------------------------------
208 # appelle insereMotCle pour ajouter le texte
210 if nomcommande not in jdcSet : return
211 mesRegles=regles.ensembleRegles(liste_regles)
212 chercheOperInsereFacteur(jdc,nomcommande,nouveau,mesRegles,estunFacteur)
214 #----------------------------------------------------------------------------------------
215 def chercheOperInsereMotCleSiRegle(jdc,nomcommande,nouveau,liste_regles, estunFacteur=0):
216 #----------------------------------------------------------------------------------------
217 if nomcommande not in jdcSet : return
218 mesRegles=regles.ensembleRegles(liste_regles)
219 chercheOperInsereFacteur(jdc,nomcommande,nouveau,mesRegles,estunFacteur)
222 #---------------------------------------------------------------------------------------------------------
223 def chercheOperInsereFacteurSiRegleAvecAvertissement(jdc,nomcommande,nouveau,liste_regles, estunFacteur=1):
224 #---------------------------------------------------------------------------------------------------------
225 if nomcommande not in jdcSet : return
226 mesRegles=regles.ensembleRegles(liste_regles)
227 chercheOperInsereFacteur(jdc,nomcommande,nouveau,mesRegles,estunFacteur,erreur=1)
229 #-------------------------------------------------------------------------------------------------
230 def AjouteMotClefDansFacteur(jdc,commande,fact,nouveau,ensemble=regles.SansRegle, estunFacteur=0):
231 #-------------------------------------------------------------------------------------------------
232 # Cherche la commande
235 # appelle insereMotCle pour ajouter le texte
237 if commande not in jdcSet : return
239 texte=nouveau+"=_F(),"
242 commands= jdc.root.childNodes[:]
246 if c.name != commande : continue
247 for mcF in c.childNodes:
248 if mcF.name != fact : continue
249 if ensemble.verif(c) == 0 : continue
251 insereMotCleDansFacteur(jdc,mcF,texte)
252 if boolChange : jdc.reset(jdc.getSource())
254 #-------------------------------------------------------------------------------------------
255 def AjouteMotClefDansFacteurSiRegle(jdc,commande,fact,nouveau,liste_regles,estunFacteur=0):
256 #-------------------------------------------------------------------------------------------
258 if commande not in jdcSet : return
259 mesRegles=regles.ensembleRegles(liste_regles)
260 AjouteMotClefDansFacteur(jdc,commande,fact,nouveau,mesRegles,estunFacteur)
262 #-------------------------------------------------------------------------------------------
263 def AjouteMotClefDansFacteurCourantSiRegle(jdc,commande,fact,nouveau,liste_regles):
264 #-------------------------------------------------------------------------------------------
266 if commande not in jdcSet : return
267 ensemble=regles.ensembleRegles(liste_regles)
268 commands= jdc.root.childNodes[:]
272 if c.name != commande : continue
273 for mcF in c.childNodes:
274 if mcF.name != fact : continue
278 if ensemble.verif(ll) == 0 : continue
281 ligneaCouper=n.lineno-1
283 jdc.splitLine(ligneaCouper+1,numcol)
285 jdc.addLine(texte,ligneaCouper+1)
286 logging.info("Insertion de %s dans %s : ligne %d", nouveau,c.name,ligneaCouper+1)
288 jdc.joinLineandNext(ligneaCouper+1)
289 if boolChange : jdc.reset(jdc.getSource())