From a325f9144e40a350eac16e25cc5925cf73606f46 Mon Sep 17 00:00:00 2001 From: "pascale.noyret" Date: Fri, 20 Mar 2020 14:16:30 +0100 Subject: [PATCH] 1er essai de factorisation --- Efi2Xsd/AccasXsd.py | 254 ++++++++++++++++++++++++++++-------------- Efi2Xsd/balisesXSD.py | 11 +- 2 files changed, 182 insertions(+), 83 deletions(-) diff --git a/Efi2Xsd/AccasXsd.py b/Efi2Xsd/AccasXsd.py index d932becc..c8cd6c8d 100755 --- a/Efi2Xsd/AccasXsd.py +++ b/Efi2Xsd/AccasXsd.py @@ -76,7 +76,6 @@ class X_definition: print (self.compare(objAComparer) ) if self.compare(objAComparer) : return objAComparer.nomDuTypePyxb indice += 1 - print ('jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj sortie de boucle') self.aCreer = True cata.dictTypesXSD[nom].append(self) nomAlter='T_'+self.nom+'_'+str(indice) @@ -113,13 +112,34 @@ class X_factCompoAmbigu(X_definition): for ligne in mc.arbrePossibles : if ligne not in self.arbrePossibles : self.arbrePossibles.append(ligne) - self.arbrePossibles.remove([]) # bien reflechir a l ordre des 2 lignes ci-dessous self.construitEntites(self.mcXSD) for i in self.entites : print (i,self.entites[i]) lesPossibles=deepcopy(self.arbrePossibles) - self.mcXSD=self.factorise(lesPossibles) + + #self.mcXSD=self.factorise(lesPossibles) + self.getNomDuCodeDumpe() + self.nomDuTypePyxb = self.definitNomDuTypePyxb() + self.texteSimple = '' + self.texteComplexeVenantDesFils = '' + self.texteComplexe = debutTypeSubstDsBlocFactorise.format(self.nomDuTypePyxb) + # on enleve [] des possibles puisque l elt sera optionnel + lesPossibles.remove([]) + self.mcXSD=self.factoriseEtCreeDump(lesPossibles,False) + self.texteComplexe += finTypeSubstDsBlocFactorise + self.texteComplexe +=self.texteComplexeVenantDesFils + print ('_________________________________') + print ('texteComplexe') + print (self.texteComplexe) + print ('_________________________________') + print ('texteSimple') + print (self.texteSimple) + print ('_________________________________') + print ('texteComplexeVenantDesFils') + print (self.texteComplexeVenantDesFils) + print ('_________________________________') + self.texteComplexe=self.texteComplexe+self.texteComplexeVenantDesFils self.label='BlocAmbigu' def construitEntites(self, laListe): @@ -129,95 +149,167 @@ class X_factCompoAmbigu(X_definition): self.construitEntites(mc.mcXSD) + def dumpXsd(self, dansFactorisation=False): - self.tousLesFils=[] - self.getNomDuCodeDumpe() - self.nomDuTypePyxb = self.definitNomDuTypePyxb() - self.texteSimple = "" - # il va falloir faire quelque chose d autre pour - # Bloc1, simp1 obligatoire Bloc2 - # a cause du 0 probablement un booleen + # on ne fait rien, tout a ete fait dans le init self.texteElt=substDsSequence.format(self.code,self.nomDuTypePyxb,0,1) - print ('dump de ', self.nomDuTypePyxb, self.aCreer) - self.texteComplexeVenantDesFils = '' - self.texteComplexe = debutTypeCompo.format(self.nomDuTypePyxb) - self.creeTexteComplexe(self.mcXSD) - self.texteComplexe += finTypeCompo - print (self.texteComplexe) - print ('oooooooo', self.mcXSD) - exit() - def creeTexteComplexe(self,laListe): - if (len(laListe))==1: - print ('creeTexteComplexe', laListe,' ____________________') - # on a une sequence - self.texteComplexe += debutTypeCompoSeq - eltSequence = laListe[0] - index=0 - while (type(eltSequence[index]) != types.ListType ): - nomFils=eltSequence[index] - index=index+1 - print (self.entites[nomFils]) - # if len(self.entites[nomFils]) == 1: - # il faut verifier le type normalement - # et creer le texteSimple du fils en fonction - if 1 == 1 : - mcFils=self.entites[nomFils][0] - mcFils.dumpXsd(dansFactorisation=True) - self.texteComplexe += mcFils.texteElt - self.texteSimple += mcFils.texteSimple - reste=eltSequence[index:][0] - if reste != [] :self.creeTexteComplexe(reste) - #self.texteComplexeVenantDesFils += self.CreeTexteComplexeVenantDesFils(dansFactorisation) - # PN ou doit on le faire ? - #self.texteComplexe = texteComplexeVenantDesFils + self.texteComplexe - self.texteComplexe += finTypeCompoSeq - else : - # on a un choix - eltChoix = laListe - print (eltChoix) - self.texteComplexe += choiceDsBloc - print ('traitement de', eltChoix) - for l in eltChoix : - if l != [] : self.creeTexteComplexe(l) - ##for nom in l : - # if len(self.entites[nomFils]) == 1: - # il faut verifier le type normalement - # et creer le texteSimple du fils en fonction - # if 1 == 1 : - # mcFils=self.entites[nom][0] - # mcFils.dumpXsd(dansFactorisation=True) - # self.texteComplexe += mcFils.texteElt - # self.texteSimple += mcFils.texteSimple - #reste=laListe[1:][0] - self.texteComplexe += finChoiceDsBloc - #if reste != [] :self.creeTexteComplexe(reste) - + +# def creeTexteComplexe(self,laListe): +# if (len(laListe))==1: +# print ('creeTexteComplexe', laListe,' ____________________') +# # on a une sequence +# self.texteComplexe += debutTypeCompoSeq +# eltSequence = laListe[0] +# print ( 'eltSequence', eltSequence) +# index=0 +# while (type(eltSequence[index]) != types.ListType ): +# #while (type(eltSequence[index]) == types.StringType ): +# nomFils=eltSequence[index] +# index=index+1 +# print ('ds while') +# print (nomFils, index) +# print (self.entites[nomFils]) +# # if len(self.entites[nomFils]) == 1: +# # il faut verifier le type normalement +# # et creer le texteSimple du fils en fonction +# if 1 == 1 : +# mcFils=self.entites[nomFils][0] +# mcFils.dumpXsd(dansFactorisation=True) +# self.texteComplexe += mcFils.texteElt +# self.texteSimple += mcFils.texteSimple +# reste=eltSequence[index:][0] +# if reste != [] :self.creeTexteComplexe(reste) +# #self.texteComplexeVenantDesFils += self.CreeTexteComplexeVenantDesFils(dansFactorisation) +# # PN ou doit on le faire ? +# #self.texteComplexe = texteComplexeVenantDesFils + self.texteComplexe +# self.texteComplexe += finTypeCompoSeq +# else : +# # on a un choix +# eltChoix = laListe +# print (eltChoix) +# self.texteComplexe += choiceDsBloc +# print ('traitement de', eltChoix) +# for l in eltChoix : +# if l != [] : self.creeTexteComplexe(l) +# ##for nom in l : +# # if len(self.entites[nomFils]) == 1: +# # il faut verifier le type normalement +# # et creer le texteSimple du fils en fonction +# # if 1 == 1 : +# # mcFils=self.entites[nom][0] +# # mcFils.dumpXsd(dansFactorisation=True) +# # self.texteComplexe += mcFils.texteElt +# # self.texteSimple += mcFils.texteSimple +# #reste=laListe[1:][0] +# self.texteComplexe += finChoiceDsBloc +# #if reste != [] :self.creeTexteComplexe(reste) +# - def factorise(self, laListe): + def factoriseEtCreeDump(self, laListe, dejaDansUneSequence=False, indent=2): + print ('debut factorise ********', laListe, indent) maListeRetour=[] aReduire={} + + if [] in laListe : + declencheChoiceAvecSeqVid=True + laListe.remove([]) + else : + declencheChoiceAvecSeqVid=False + for ligne in laListe : - if ligne == [] : continue - #print ('je traite', ligne) + #print (ligne) if aReduire.has_key(ligne[0]) : aReduire[ligne[0]].append(ligne[1:]) else : aReduire[ligne[0]]=[ligne[1:],] - #print ('clef = ', ligne[0], ' ', aReduire[ligne[0]]) - for clef in aReduire: - if len(aReduire[clef])==1 : - if aReduire[clef] != [[]]: maListeRetour.append([clef,]+aReduire[clef]) - else : maListeRetour.append([clef,]) - else : - nvlElt=[clef,] - #print ('je sors', nvlElt) - nvlElt.append(self.factorise(aReduire[clef])) - maListeRetour.append(nvlElt) - #print ('maListeRetour ',self.nom, maListeRetour) - #print ('________ fin factorise________' , laListe) - #print ('_________________________') - return maListeRetour + #print (aReduire) + if len(aReduire.keys()) == 1 : + creeSequence=True + if declencheChoiceAvecSeqVid == False : + creeChoice=False + else : + creeChoice=True + if dejaDansUneSequence : creeSequence = False + else : + creeChoice=True + creeSequence=False + self.texteComplexe += '\t'*indent + debutChoiceDsBloc + indent += 1 + + print ('creeChoice ', creeChoice, 'creeSequence', creeSequence) + + for nomMC in aReduire.keys(): + if creeSequence : self.texteComplexe += '\t'*(indent) + debSequenceDsBloc; indent=indent+1 + self.ajouteAuxTextes(nomMC,indent) + listeSuivante=aReduire[nomMC] + if listeSuivante == [[]] : continue # Est-ce toujours vrai ? + if len(listeSuivante) == 1 : self.ajouteAuxTextes(listeSuivante[0]) + else : self.factoriseEtCreeDump(listeSuivante,creeSequence, indent+int(creeSequence)) + if creeSequence : indent=indent -1 ; self.texteComplexe += '\t'*(indent) + finSequenceDsBloc + + if declencheChoiceAvecSeqVid : + self.texteComplexe += '\t'*indent + debSequenceDsBloc + self.texteComplexe += '\t'*indent + finSequenceDsBloc + if creeChoice : indent=indent -1 ; self.texteComplexe += '\t'*indent + finChoiceDsBloc + + print ('________ fin factorise________' , laListe) + return (maListeRetour) + + + def ajouteAuxTextes(self,nomMC,indent) : + if (indent > 3) : indent = indent - 3 + else : indent = 0 + # if len(self.entites[nomMC]]) == 1: + if (1 == 1): + mc=self.entites[nomMC][0] + mc.dumpXsd(dansFactorisation=True) + self.texteComplexe += '\t'*(indent) + mc.texteElt + self.texteComplexeVenantDesFils += mc.texteComplexe + self.texteSimple += mc.texteSimple + + # def verifieDisjoint(self, laListe): +# # != a un premier dans les communs car laListe n est pas composee de la +# # meme maniere dans les 2 cas +# # ici on a juste des noms et on se moque du caractere optionnel +# # tout le monde est obligatoire +# print ('verifieDisjoint', laListe) +# mesPremiers=set() +# for listeDeNoms in laListe : +# if listeDeNoms == [] : continue +# if listeDeNoms[0] in mesPremiers : return False +# return True +# +# +# +# def factorise(self, laListe): +# print ('debut factorise ********', laListe) +# suiteOptionnelle=False +# maListeRetour=[] +# aReduire={} +# for ligne in laListe : +# if ligne == [] : +# suiteOptionnelle=True +# continue # PN : faire qqchose pour transmettre le car optionnel +# print ('je traite', ligne) +# if aReduire.has_key(ligne[0]) : aReduire[ligne[0]].append(ligne[1:]) +# else : aReduire[ligne[0]]=[ligne[1:],] +# print ('clef = ', ligne[0], ' ', aReduire[ligne[0]]) +# for clef in aReduire: +# if len(aReduire[clef])==1 : +# if aReduire[clef] != [[]]: maListeRetour.append([clef,]+aReduire[clef]) +# else : maListeRetour.append([clef,]) +# else : +# nvlElt=[clef,] +# #print ('je sors', nvlElt) +# nvlElt.append(self.factorise(aReduire[clef])) +# maListeRetour.append(nvlElt) +# print ('maListeRetour ',laListe, maListeRetour, suiteOptionnelle) +# print ('________ fin factorise________' , laListe) +# print ('_________________________') +# return maListeRetour +# + # ---------------------------------------- diff --git a/Efi2Xsd/balisesXSD.py b/Efi2Xsd/balisesXSD.py index 5f310273..63a2f6d0 100644 --- a/Efi2Xsd/balisesXSD.py +++ b/Efi2Xsd/balisesXSD.py @@ -42,8 +42,15 @@ eltCompoDsSequenceInExtension = '\t\t\t\n' debutTypeSubst = '\t \n\t\t\n' finTypeSubst = '\t\t\n\t\n' substDsSequence = '\t\t\t\n' -choiceDsBloc='\t\t\t\n' -finChoiceDsBloc='\t\t\t\n' +#choiceDsBloc='\t\t\t\n' +debutChoiceDsBloc='\n' +finChoiceDsBloc='\n' +debutChoiceDsBloc='\n' +finChoiceDsBloc='\n' +debSequenceDsBloc='\n' +finSequenceDsBloc='\n' +debutTypeSubstDsBlocFactorise = '\t\n' +finTypeSubstDsBlocFactorise = '\t\n' # User OR ASSD -- 2.39.2