Voir sur mon site.
Attention il faut télécharger le programme d'abord sur mon site et le lancer. Le programme va alors décompresser des fichiers *.txt qui sont nécessaires à l'éxécution du code.
Code : Tout sélectionner
; Mettre à 1 pour écrire le fichier mis en forme
#Ecriture = 1
Structure IndentationInfo
Keyword.s
Function.b
Indentation.l
EndStructure
Structure CompilerInfo
Keyword.s
Type.b
EndStructure
Structure CompilerIndentationInfo
Type.b
Indentation.l
EndStructure
Structure LigneInfo
List Mot.s()
List Texte.s()
List Carac.s()
Commentaire.s
Indentation.l
EndStructure
Structure OptionInfo
Backup.l
Tab.s
EndStructure
Enumeration
#Type_Autre = 0
#Type_Operateur = 1
#Type_MotClef = 2
#Type_Variable = 4
EndEnumeration
Enumeration 1
#Compiler_Start
#Compiler_Middle
#Compiler_End
#Compiler_After
EndEnumeration
Global NewList Keyword.s()
Global NewList Operator.s()
Global NewList Variable.s()
Global NewList IndentationP.IndentationInfo()
Global NewList IndentationN.IndentationInfo()
Global NewList Compiler.CompilerInfo()
Global NewList CompilerIndentation.CompilerIndentationInfo()
#FiltrePB = "pb"
#FiltrePBI = "pbi"
#Erreur_Temps_Maximum = 30 ; en seconde
Structure TraitementInfo
Fichier.s
Dossier.s
Filtre.s
Recurence.b
EndStructure
Global NewList ListeTraitement.TraitementInfo()
Enumeration
#Liste_Titre
#Liste_Fichier
#Liste_Dossier
#Liste_Dossier_Fenetre
#Liste_Dossier_Titre
#Liste_Dossier_Texte
#Liste_Dossier_SousDossier
#Liste_Dossier_FiltrePB
#Liste_Dossier_FiltrePBI
#Liste_Dossier_FiltreAutre
#Liste_Dossier_FiltreAutre_Texte
#Liste_Dossier_Selection
#Liste_Dossier_Valider
#Liste_Supprimer
#Liste
#Traitement_Titre
#Traitement_Lancer
#Traitement_Annuler
#Traitement_Texte
#Option_Titre
#Option_Indentation
#Option_CopieSauvegarde
EndEnumeration
Global Option.OptionInfo, Quitter, Parametre_Lancement, Traitement_Arret
SetCurrentDirectory(ProgramFiledirectory())
;{ Chargement des données
If FileSize("PBSyntax - Keywords.txt") = -1
If CreateFile(0, "PBSyntax - Keywords.txt")
WriteData(0, ?Keywords, ?Operators - ?Keywords)
CloseFile(0)
EndIf
EndIf
If ReadFile(0, "PBSyntax - Keywords.txt")
Repeat
AddElement(Keyword())
Keyword() = LCase(Trim(ReadString(0)))
If Keyword() And Left(Keyword(), 1) <> ";"
Keyword() = RSet(Str(Len(Keyword())), 4, "0") + Keyword()
Else
DeleteElement(Keyword())
EndIf
Until Eof(0)
; Triage du texte le plus long au plus court
SortList(Keyword(), #PB_Sort_Descending | #PB_Sort_NoCase)
ForEach Keyword()
Keyword() = Right(Keyword(), Len(Keyword()) - 4)
Next
CloseFile(0)
Else
MessageRequester("Erreur", "Chargement du fichier 'PBSyntax - Keywords.txt' impossible")
End
EndIf
If FileSize("PBSyntax - Operators.txt") = -1
If CreateFile(0, "PBSyntax - Operators.txt")
WriteData(0, ?Operators, ?Variables - ?Operators)
CloseFile(0)
EndIf
EndIf
If ReadFile(0, "PBSyntax - Operators.txt")
Repeat
AddElement(Operator())
Operator() = LCase(Trim(ReadString(0)))
If Operator() And Left(Operator(), 1) <> ";"
Operator() = RSet(Str(Len(Operator())), 4, "0") + Operator()
Else
DeleteElement(Operator())
EndIf
Until Eof(0)
; Triage du texte le plus long au plus court
SortList(Operator(), #PB_Sort_Descending | #PB_Sort_NoCase)
ForEach Operator()
Operator() = Right(Operator(), Len(Operator()) - 4)
Next
CloseFile(0)
Else
MessageRequester("Erreur", "Chargement du fichier 'PBSyntax - Operators.txt' impossible")
End
EndIf
If FileSize("PBSyntax - Variables.txt") = -1
If CreateFile(0, "PBSyntax - Variables.txt")
WriteData(0, ?Variables, ?IndentationP - ?Variables)
CloseFile(0)
EndIf
EndIf
If ReadFile(0, "PBSyntax - Variables.txt")
Repeat
AddElement(Variable())
Variable() = LCase(Trim(ReadString(0)))
If Variable() And Left(Variable(), 1) <> ";"
Variable() = RSet(Str(Len(Variable())), 4, "0") + Variable()
Else
DeleteElement(Variable())
EndIf
Until Eof(0)
; Triage du texte le plus long au plus court
SortList(Variable(), #PB_Sort_Descending | #PB_Sort_NoCase)
ForEach Variable()
Variable() = Right(Variable(), Len(Variable()) - 4)
Next
CloseFile(0)
Else
MessageRequester("Erreur", "Chargement du fichier 'PBSyntax - Variables.txt' impossible")
End
EndIf
If FileSize("PBSyntax - Compiler.txt") = -1
If CreateFile(0, "PBSyntax - Compiler.txt")
WriteData(0, ?Compiler, ?Keywords - ?Compiler)
CloseFile(0)
EndIf
EndIf
If OpenPreferences("PBSyntax - Compiler.txt")
If ExaminePreferenceKeys()
While NextPreferenceKey()
AddElement(Compiler())
Compiler()\Keyword = LCase(PreferenceKeyName())
Select LCase(PreferenceKeyValue())
Case "start"
Compiler()\Type = #Compiler_Start
Case "middle"
Compiler()\Type = #Compiler_Middle
Case "end"
Compiler()\Type = #Compiler_End
EndSelect
Wend
EndIf
ClosePreferences()
Else
MessageRequester("Erreur", "Chargement du fichier 'PBSyntax - Compiler.txt' impossible")
End
EndIf
If FileSize("PBSyntax - Indentation +.txt") = -1
If CreateFile(0, "PBSyntax - Indentation +.txt")
WriteData(0, ?IndentationP, ?IndentationN - ?IndentationP)
CloseFile(0)
EndIf
EndIf
If OpenPreferences("PBSyntax - Indentation +.txt")
If ExaminePreferenceKeys()
While NextPreferenceKey()
AddElement(IndentationP())
IndentationP()\Keyword = LCase(PreferenceKeyName())
If Right(IndentationP()\Keyword, 1) = "("
IndentationP()\Function = 1
IndentationP()\Keyword = Left(IndentationP()\Keyword, Len(IndentationP()\Keyword) - 1)
EndIf
IndentationP()\Indentation = Val(PreferenceKeyValue())
Wend
EndIf
ClosePreferences()
Else
MessageRequester("Erreur", "Chargement du fichier 'PBSyntax - Indentation +.txt' impossible")
End
EndIf
If FileSize("PBSyntax - Indentation -.txt") = -1
If CreateFile(0, "PBSyntax - Indentation -.txt")
WriteData(0, ?IndentationN, ?TxtIncludeBinary_End - ?IndentationN)
CloseFile(0)
EndIf
EndIf
If OpenPreferences("PBSyntax - Indentation -.txt")
If ExaminePreferenceKeys()
While NextPreferenceKey()
AddElement(IndentationN())
IndentationN()\Keyword = LCase(PreferenceKeyName())
If Right(IndentationN()\Keyword, 1) = "("
IndentationN()\Function = 1
IndentationN()\Keyword = Left(IndentationN()\Keyword, Len(IndentationN()\Keyword) - 1)
EndIf
IndentationN()\Indentation = Val(PreferenceKeyValue())
Wend
EndIf
ClosePreferences()
Else
MessageRequester("Erreur", "Chargement du fichier 'PBSyntax - Indentation -.txt' impossible")
End
EndIf
;}
;{ Chargement de l'interface
UsePNGImageDecoder()
Global Icone_Fichier_16, Icone_Dossier_16
Icone_Annuler = CatchImage(#PB_Any, ?Icone_Annuler)
Icone_Dossier = CatchImage(#PB_Any, ?Icone_Dossier)
Icone_Dossier_16 = CatchImage(#PB_Any, ?Icone_Dossier_16)
Icone_Fichier = CatchImage(#PB_Any, ?Icone_Fichier)
Icone_Fichier_16 = CatchImage(#PB_Any, ?Icone_Fichier_16)
Icone_Information = CatchImage(#PB_Any, ?Icone_Information)
Icone_Lancer = CatchImage(#PB_Any, ?Icone_Lancer)
Icone_Liste = CatchImage(#PB_Any, ?Icone_Liste)
Icone_Traitement = CatchImage(#PB_Any, ?Icone_Traitement)
;}
Procedure Traitement_Affichage(Fichier.s, Lecture.f, Indentation.f, Formatage.f, Erreur.l, Erreur_Temps.l, AffichageForce.b)
Static Temps.q
Protected Texte.s
Temps_Actuel = ElapsedMilliseconds()
If Temps_Actuel - Temps > 100 Or AffichageForce
Temps = Temps_Actuel
Texte = Chr(34) + GetFilePart(Fichier) + Chr(34)
If Lecture > 0 And (Erreur = 0 Or Lecture = 1)
Texte + Chr(10) + "Lecture : " + Str(Lecture * 100) + "%"
EndIf
If Indentation > 0 And (Erreur = 0 Or Indentation = 1)
Texte + Chr(10) + "Indentation : " + Str(Indentation * 100) + "%"
EndIf
If Formatage > 0 And (Erreur = 0 Or Formatage = 1)
Texte + Chr(10) + "Formatage : " + Str(Formatage * 100) + "%"
EndIf
If Erreur <> 0
Select Erreur
Case -100
Texte + Chr(10) + "Traitement du fichier annulé."
Case -2
Texte + Chr(10) + "Le code ne peut plus être compiler."
Case -1
Texte + Chr(10) + "Problème d'indentation non nulle à la fin du code."
Default
Texte + Chr(10) + "Problème d'indentation négative à la ligne " + Str(Erreur) + "."
EndSelect
If Erreur > -100
Texte + Chr(10) + "Vous avez " + Str(#Erreur_Temps_Maximum - Erreur_Temps) + "s pour annuler le traitement du fichier."
EndIf
EndIf
SetGadgetText(#Traitement_Texte, Texte)
EndIf
EndProcedure
Procedure Gestion_Indentation(Indentation_Valeur, *Indentation.IndentationInfo, Evolution) ; Gère l'évolution de l'indentation et les cas particuliers causés par les fonctions du type CompilerIf
ForEach Compiler()
If *Indentation\Keyword = Compiler()\Keyword
Type = Compiler()\Type
Break
EndIf
Next
If Evolution < 0
If Type = #Compiler_Middle And ListIndex(CompilerIndentation()) >= 0
Indentation_Valeur = CompilerIndentation()\Indentation
; Debug "Compiler milieu -"
; Debug CompilerIndentation()\Indentation
EndIf
If Type = #Compiler_End And ListIndex(CompilerIndentation()) >= 0
Indentation_Evolution = Indentation_Valeur - CompilerIndentation()\Indentation
Indentation_Valeur = CompilerIndentation()\Indentation
; Debug "Compiler fin"
; Debug CompilerIndentation()\Indentation
CompilerIndentation()\Type = #Compiler_After
CompilerIndentation()\Indentation + *Indentation\Indentation + Indentation_Evolution
EndIf
EndIf
If Evolution > 0
If Type = #Compiler_Middle And ListIndex(CompilerIndentation()) >= 0
CompilerIndentation()\Indentation = Indentation_Valeur + *Indentation\Indentation
; Debug "Compiler milieu +"
; Debug CompilerIndentation()\Indentation
EndIf
If Type = #Compiler_Start
AddElement(CompilerIndentation())
CompilerIndentation()\Type = Type
CompilerIndentation()\Indentation = Indentation_Valeur + *Indentation\Indentation
; Debug "Compiler départ"
; Debug CompilerIndentation()\Indentation
EndIf
EndIf
Indentation_Valeur + *Indentation\Indentation
ProcedureReturn Indentation_Valeur
EndProcedure
Procedure Traitement(Fichier.s)
Protected Format, Erreur, Position, Ligne.s, Mot.s, MotPrecedent1.s, MotPrecedent2.s, Compteur, Indentation, Depart, LastElement, Type, Type_MotPrecedent1, Type_MotPrecedent2
Protected Progression_Formatage.f, Progression_Indentation.f, Progression_Lecture.f
Protected NewList Ligne.LigneInfo()
If ReadFile(0, Fichier)
Format = ReadStringFormat(0)
Taille.q = Lof(0)
Repeat
Ligne.s = ReadString(0, Format)
;- Découpage de la ligne en mot
AddElement(Ligne())
; Extraction du commentaire, sans le ';'
Position = 0
Repeat
Position = FindString(Ligne, ";", Position + 1)
If Position > 0 And CountString(Left(Ligne, Position), Chr(34)) & %1 = 0 ; Si ';' trouvé et nombre de " avant le ';' paire donc le ';' n'est pas dans un texte
Ligne()\Commentaire = Trim(Right(Ligne, Len(Ligne) - Position))
Ligne = Left(Ligne, Position - 1)
EndIf
Until Position = 0 Or Ligne()\Commentaire
; Extraction des textes, les textes sont remplacer par des balises '§'
Position = 0
Repeat
Position = FindString(Ligne, Chr(34), Position + 1)
If Position > 0
PositionFinale = FindString(Ligne, Chr(34), Position + 1)
If PositionFinale > 0
AddElement(Ligne()\Texte())
Ligne()\Texte() = Mid(Ligne, Position, PositionFinale - Position + 1)
Ligne = Left(Ligne, Position - 1) + "§" + RSet(Str(ListIndex(Ligne()\Texte())), 4, "0") + Right(Ligne, Len(Ligne) - PositionFinale)
EndIf
EndIf
Until Position = 0
; Extraction des caractères, les caractères sont remplacer par des balises '¤'
Position = 0
Repeat
Position = FindString(Ligne, "'", Position + 1)
If Position > 0
PositionFinale = FindString(Ligne, "'", Position + 1)
If PositionFinale > 0
AddElement(Ligne()\Carac())
Ligne()\Carac() = Mid(Ligne, Position, PositionFinale - Position + 1)
Ligne = Left(Ligne, Position - 1) + "¤" + RSet(Str(ListIndex(Ligne()\Carac())), 4, "0") + Right(Ligne, Len(Ligne) - PositionFinale)
EndIf
EndIf
Until Position = 0
; Découpage des mots
; Ajoute des espaces dans la ligne pour permettre le découpage
Ligne = ReplaceString(Ligne, Chr(9), " ")
Ligne = ReplaceString(Ligne, "(", " ( ")
Ligne = ReplaceString(Ligne, ")", " ) ")
Ligne = ReplaceString(Ligne, "[", " [ ")
Ligne = ReplaceString(Ligne, "]", " ] ")
Ligne = ReplaceString(Ligne, ",", " , ")
Ligne = ReplaceString(Ligne, ":", " : ") ; Cas particulier du ':'
Position = 1
Repeat
ForEach Operator()
If Mid(Ligne, Position, Len(Operator())) = Operator()
Ligne = Left(Ligne, Position - 1) + " " + Operator() + " " + Right(Ligne, Len(Ligne) - Position - Len(Operator()) + 1)
Position + Len(Operator()) + 1
EndIf
Next
Position + 1
Until Position > Len(Ligne)
; Découpe la ligne en mot
Compteur = CountString(Ligne, " ") + 1
For Index = 1 To Compteur
Mot.s = StringField(Ligne, Index, " ")
If Mot
AddElement(Ligne()\Mot())
Ligne()\Mot() = Mot
EndIf
Next
Progression_Lecture = Loc(0) / Taille
Traitement_Affichage(Fichier, Progression_Lecture, Progression_Indentation, Progression_Formatage, 0, 0, 0)
If Quitter
ProcedureReturn
EndIf
Until Eof(0)
CloseFile(0)
Progression_Lecture = 1
Traitement_Affichage(Fichier, Progression_Lecture, Progression_Indentation, Progression_Formatage, 0, 0, 1)
;- Analyse de l'indentation
Indentation = 0
ForEach Ligne()
; Avant de commencer la ligne
ForEach Ligne()\Mot()
Depart = ListIndex(Ligne()\Mot())
Mot = StringField(LCase(Ligne()\Mot()), 1, ".")
ForEach IndentationN()
If Mot = IndentationN()\Keyword ; Si le mot correspond à un mot de l'indentation
If IndentationN()\Function = 0 ; Le mot clé n'est pas une fonction
Indentation = Gestion_Indentation(Indentation, @IndentationN(), -1)
; Debug "avant - " + IndentationN()\Keyword + " = " + Ligne()\Mot()
ElseIf NextElement(Ligne()\Mot()) ; Sinon, on vérifie que le mot suivant est une '('
If Ligne()\Mot() = "("
Indentation = Gestion_Indentation(Indentation, @IndentationN(), -1)
; Debug "avant - " + IndentationN()\Keyword
EndIf
PreviousElement(Ligne()\Mot())
EndIf
Break
EndIf
Next
ForEach IndentationP()
If Mot = IndentationP()\Keyword ; Si le mot correspond à un mot de l'indentation
If IndentationP()\Function = 0 ; Le mot clé n'est pas une fonction
; Debug "avant arrêt " + IndentationP()\Keyword + " = " + Ligne()\Mot()
Break 2
ElseIf NextElement(Ligne()\Mot()) ; Sinon, on vérifie que le mot suivant est une '('
If Ligne()\Mot() = "("
; Debug "avant arrêt " + IndentationP()\Keyword
Break 2
EndIf
PreviousElement(Ligne()\Mot())
EndIf
Break
EndIf
Next
Next
; Indentation de la ligne
If Indentation < 0 ; Si l'indentation devient négative
Ligne()\Indentation = 0
If Erreur = 0
Erreur = ListIndex(Ligne()) + 1 ; On génére une erreur avec le numéro de la première ligne qui pose problème
EndIf
Else
Ligne()\Indentation = Indentation
EndIf
; Après la ligne
ForEach Ligne()\Mot()
Mot = StringField(LCase(Ligne()\Mot()), 1, ".")
If ListIndex(Ligne()\Mot()) > Depart
ForEach IndentationN()
If Mot = IndentationN()\Keyword ; Si le mot correspond à un mot de l'indentation
If IndentationN()\Function = 0 ; Le mot clé n'est pas une fonction
Indentation = Gestion_Indentation(Indentation, @IndentationN(), -1)
; Debug "après - " + IndentationN()\Keyword + " = " + Ligne()\Mot()
ElseIf NextElement(Ligne()\Mot()) ; Sinon, on vérifie que le mot suivant est une '('
If Ligne()\Mot() = "("
Indentation = Gestion_Indentation(Indentation, @IndentationN(), -1)
; Debug "après - " + IndentationN()\Keyword
EndIf
PreviousElement(Ligne()\Mot())
EndIf
Break
EndIf
Next
EndIf
If ListIndex(Ligne()\Mot()) >= Depart
ForEach IndentationP()
If Mot = IndentationP()\Keyword ; Si le mot correspond à un mot de l'indentation
If IndentationP()\Function = 0 ; Le mot clé n'est pas une fonction
Indentation = Gestion_Indentation(Indentation, @IndentationP(), 1)
; Debug "après + " + IndentationP()\Keyword + " = " + Ligne()\Mot()
ElseIf NextElement(Ligne()\Mot()) ; Sinon, on vérifie que le mot suivant est une '('
If Ligne()\Mot() = "("
Indentation = Gestion_Indentation(Indentation, @IndentationP(), 1)
; Debug "après + " + IndentationP()\Keyword
EndIf
PreviousElement(Ligne()\Mot())
EndIf
Break
EndIf
Next
EndIf
Next
; Après un mot clef de type CompilerIf
If ListIndex(CompilerIndentation()) >= 0 And CompilerIndentation()\Type = #Compiler_After
Indentation = CompilerIndentation()\Indentation
; Debug "Compiler après"
; Debug CompilerIndentation()\Indentation
DeleteElement(CompilerIndentation())
EndIf
Progression_Indentation = ListIndex(Ligne()) / ListSize(Ligne())
Traitement_Affichage(Fichier, Progression_Lecture, Progression_Indentation, Progression_Formatage, 0, 0, 0)
If Quitter
ProcedureReturn
EndIf
Next
If Indentation > 0 ; Si à la fin du traitement, l'indentation n'est pas nulle, on génère une erreur.
Erreur = -1
EndIf
Progression_Indentation = 1
Traitement_Affichage(Fichier, Progression_Lecture, Progression_Indentation, Progression_Formatage, 0, 0, 1)
;- Ecriture du nouveau fichier
If Erreur = 0
CompilerIf #Ecriture
If CreateFile(0, "PBSyntax.temp")
WriteStringFormat(0, Format)
CompilerEndIf
;- Recompilation des lignes
LastElement = ListSize(Ligne()) - 1 ; Position du dernier élément
ForEach Ligne() ; Pour chaque ligne
Ligne.s = ""
; Indentation
For Index = 1 To Ligne()\Indentation
Ligne + Option\Tab
Next
; Initialisation
Type = 0
Type_MotPrecedent1 = 0
Type_MotPrecedent2 = 0
Mot = ""
MotPrecedent1.s = ""
MotPrecedent2.s = ""
; Création de la ligne
ForEach Ligne()\Mot()
Espace.s = " "
MotPrecedent2 = MotPrecedent1
MotPrecedent1 = Mot
Mot = StringField(LCase(Ligne()\Mot()), 1, ".")
; Type du mot
Type_MotPrecedent2 = Type_MotPrecedent1
Type_MotPrecedent1 = Type
Type = #Type_Autre
ForEach Keyword()
If Mot = Keyword()
Type = Type | #Type_MotClef
Break
EndIf
Next
ForEach Operator()
If Mot = Operator()
Type = Type | #Type_Operateur
Break
EndIf
Next
ForEach Variable()
If Mot = Variable()
Type = Type | #Type_Variable
Break
EndIf
Next
; Analyse des mots pour savoir si il ne faut pas mettre d'espace
If MotPrecedent1 = ""
Espace = ""
ElseIf Mot = ","
Espace = ""
ElseIf Mot = "["
Espace = ""
ElseIf Mot = "(" And ((Type_MotPrecedent1 & #Type_Operateur = 0 And Type_MotPrecedent1 & #Type_MotClef = 0) Or MotPrecedent1 = "(" Or MotPrecedent1 = "[")
Espace = ""
ElseIf MotPrecedent1 = "(" Or MotPrecedent1 = "["
Espace = ""
ElseIf Mot = ")" Or Mot = "]"
Espace = ""
ElseIf MotPrecedent1 = ")" And Type & #Type_Operateur = 0 And Type & #Type_MotClef = 0
Espace = ""
ElseIf Type_MotPrecedent1 & #Type_Operateur And Type_MotPrecedent1 & #Type_Variable And (Type_MotPrecedent2 & #Type_Operateur Or Type_MotPrecedent2 & #Type_Variable Or Type_MotPrecedent2 & #Type_MotClef Or MotPrecedent2 = "" Or MotPrecedent2 = "(" Or MotPrecedent2 = "," Or MotPrecedent2 = "[")
Espace = ""
ElseIf Type_MotPrecedent1 = #Type_Variable
Espace = ""
EndIf
If Left(Mot, 1) = "§" ; Remplace les balises '§' par les textes
SelectElement(Ligne()\Texte(), Val(Right(Mot, 4)))
Ligne + Espace + Ligne()\Texte()
ElseIf Left(Mot, 1) = "¤" ; Remplace les balises '¤' par les caractères
SelectElement(Ligne()\Carac(), Val(Right(Mot, 4)))
Ligne + Espace + Ligne()\Carac()
Else
Ligne + Espace + Ligne()\Mot()
EndIf
Next
; Mise en forme du commentaire
If Ligne()\Commentaire
;{ Traitement
If Left(Ligne()\Commentaire, 1) = "-"
Ligne()\Commentaire = "- " + Trim(Right(Ligne()\Commentaire, Len(Ligne()\Commentaire) - 1))
ElseIf Left(Ligne()\Commentaire, 1) = "\"
Ligne()\Commentaire = "\ " + Trim(Right(Ligne()\Commentaire, Len(Ligne()\Commentaire) - 1))
ElseIf Left(Ligne()\Commentaire, 2) = "{-"
Ligne()\Commentaire = "{- " + Trim(Right(Ligne()\Commentaire, Len(Ligne()\Commentaire) - 2))
ElseIf Left(Ligne()\Commentaire, 2) = "{\"
Ligne()\Commentaire = "{\ " + Trim(Right(Ligne()\Commentaire, Len(Ligne()\Commentaire) - 2))
ElseIf Left(Ligne()\Commentaire, 1) = "{"
Ligne()\Commentaire = "{ " + Trim(Right(Ligne()\Commentaire, Len(Ligne()\Commentaire) - 1))
ElseIf Left(Ligne()\Commentaire, 1) = "}"
Ligne()\Commentaire = "} " + Trim(Right(Ligne()\Commentaire, Len(Ligne()\Commentaire) - 1))
ElseIf Left(Ligne()\Commentaire, 1) = "[-"
Ligne()\Commentaire = "[- " + Trim(Right(Ligne()\Commentaire, Len(Ligne()\Commentaire) - 2))
ElseIf Left(Ligne()\Commentaire, 1) = "[\"
Ligne()\Commentaire = "[\ " + Trim(Right(Ligne()\Commentaire, Len(Ligne()\Commentaire) - 2))
ElseIf Left(Ligne()\Commentaire, 1) = "["
Ligne()\Commentaire = "[ " + Trim(Right(Ligne()\Commentaire, Len(Ligne()\Commentaire) - 1))
ElseIf Left(Ligne()\Commentaire, 1) = "]"
Ligne()\Commentaire = "] " + Trim(Right(Ligne()\Commentaire, Len(Ligne()\Commentaire) - 1))
Else
Ligne()\Commentaire = " " + Ligne()\Commentaire
EndIf
;}
; Ajout du Commentaire
If ListSize(Ligne()\Mot()) > 0
Ligne + " ;" + Ligne()\Commentaire
Else
Ligne + ";" + Ligne()\Commentaire
EndIf
EndIf
CompilerIf #Ecriture
If ListIndex(Ligne()) < LastElement
WriteStringN(0, Ligne, Format)
Else
WriteString(0, Ligne, Format)
EndIf
CompilerEndIf
Debug Str(Ligne()\Indentation) + " " + Ligne
Progression_Formatage = ListIndex(Ligne()) / ListSize(Ligne())
Traitement_Affichage(Fichier, Progression_Lecture, Progression_Indentation, Progression_Formatage, 0, 0, 0)
If Quitter
ProcedureReturn
EndIf
Next
CompilerIf #Ecriture
CloseFile(0)
EndIf
CompilerEndIf
EndIf
Progression_Formatage = 1
Traitement_Affichage(Fichier, Progression_Lecture, Progression_Indentation, Progression_Formatage, 0, 0, 1)
If Erreur <> 0
HideGadget(#Traitement_Lancer, 1)
HideGadget(#Traitement_Annuler, 0)
Traitement_Affichage(Fichier, Progression_Lecture, Progression_Indentation, Progression_Formatage, Erreur, 0, 1)
For Index = 1 To #Erreur_Temps_Maximum
Delay(1000)
Traitement_Affichage(Fichier, Progression_Lecture, Progression_Indentation, Progression_Formatage, Erreur, Index, 1)
If Traitement_Arret
Erreur = -100
Traitement_Affichage(Fichier, Progression_Lecture, Progression_Indentation, Progression_Formatage, Erreur, Index, 1)
Delay(4000)
Break
EndIf
Next
HideGadget(#Traitement_Annuler, 1)
HideGadget(#Traitement_Lancer, 0)
EndIf
Traitement_Affichage(Fichier, Progression_Lecture, Progression_Indentation, Progression_Formatage, 0, 0, 1)
CompilerIf #Ecriture
If Option\Backup And FileSize(Fichier + ".bak") >= 0
DeleteFile(Fichier + ".bak")
EndIf
If Quitter = 0 And Traitement_Arret = 0 And (Option\Backup = 0 Or RenameFile(Fichier, Fichier + ".bak"))
DeleteFile(Fichier)
RenameFile("PBSyntax.temp", Fichier)
RemoveGadgetItem(#Liste, ListIndex(ListeTraitement()))
DeleteElement(ListeTraitement())
EndIf
CompilerElse
If Quitter = 0 And Traitement_Arret = 0
RemoveGadgetItem(#Liste, ListIndex(ListeTraitement()))
DeleteElement(ListeTraitement())
EndIf
CompilerEndIf
EndIf
Traitement_Arret = 0
EndProcedure
Global Tache
Procedure Tache_AnalyseDossier(Dossier.s, Filtre.s, Recurence, Index = 0)
If Right(Dossier, 1) <> "\"
Dossier + "\"
EndIf
If ExamineDirectory(Index, Dossier, "")
While NextDirectoryEntry(Index)
If Quitter
Break
EndIf
If DirectoryEntryType(Index) = #PB_DirectoryEntry_File
Fichier.s = DirectoryEntryName(Index)
Extension.s = LCase(GetExtensionPart(Fichier))
If FindString(";" + Filtre + ";", ";" + Extension + ";", 0)
Traitement(Dossier + Fichier)
EndIf
Else
SousDossier.s = DirectoryEntryName(Index)
If SousDossier <> "." And SousDossier <> ".."
Tache_AnalyseDossier(Dossier + SousDossier, Filtre, Recurence, Index + 1)
EndIf
EndIf
Wend
FinishDirectory(Index)
EndIf
EndProcedure
Procedure Tache_Thread(Parametre)
ForEach ListeTraitement()
If ListeTraitement()\Fichier
Traitement(ListeTraitement()\Fichier)
Else
Tache_AnalyseDossier(ListeTraitement()\Dossier, ListeTraitement()\Filtre, ListeTraitement()\Recurence)
EndIf
If Quitter
Break
EndIf
Next
SetGadgetText(#Traitement_Texte, "Traitement terminé")
DisableGadget(#Liste, 0)
DisableGadget(#Liste_Fichier, 0)
DisableGadget(#Liste_Dossier, 0)
DisableGadget(#Traitement_Lancer, 0)
DisableGadget(#Option_Indentation, 0)
DisableGadget(#Option_CopieSauvegarde, 0)
If Parametre_Lancement
Quitter = 1
EndIf
EndProcedure
Procedure Tache()
DisableGadget(#Liste, 1)
DisableGadget(#Liste_Fichier, 1)
DisableGadget(#Liste_Dossier, 1)
DisableGadget(#Traitement_Lancer, 1)
DisableGadget(#Option_Indentation, 1)
DisableGadget(#Option_CopieSauvegarde, 1)
Tache = CreateThread(@Tache_Thread(), 0)
EndProcedure
Procedure Liste_Ajouter(Fichier.s, Dossier.s, Filtre.s, Recurence.b = 0)
Protected Texte.s
If Fichier Or (Dossier And Filtre)
LastElement(ListeTraitement())
AddElement(ListeTraitement())
ListeTraitement()\Fichier = Fichier
If Dossier And Right(Dossier, 1) <> "\"
Dossier + "\"
EndIf
ListeTraitement()\Dossier = Dossier
ListeTraitement()\Filtre = Filtre
ListeTraitement()\Recurence = Recurence
If Fichier
Texte = GetFilePart(Fichier)
Icone = Icone_Fichier_16
Else
Texte = StringField(Dossier, CountString(Dossier, "\"), "\") + "\ *." + ReplaceString(Filtre, ";", "; *.")
Icone = Icone_Dossier_16
EndIf
AddGadgetItem(#Liste, -1, Texte, ImageID(Icone))
EndIf
EndProcedure
Procedure Liste_Supprimer()
For Index = 0 To CountGadgetItems(#Liste) - 1
If GetGadgetItemState(#Liste, Index) & #PB_ListIcon_Selected
SelectElement(ListeTraitement(), Index)
DeleteElement(ListeTraitement())
RemoveGadgetItem(#Liste, Index)
Index - 1
EndIf
Next
EndProcedure
Procedure Option_Charge()
OpenPreferences("PBSyntax.ini")
Option\Tab = ReadPreferenceString("Tab", "")
If Option\Tab = ""
Option\Tab = Chr(9)
SetGadgetState(#Option_Indentation, 0)
Else
Option\Tab = ReplaceString(Option\Tab, "_", " ")
SetGadgetState(#Option_Indentation, Len(Option\Tab))
EndIf
Option\Backup = ReadPreferenceLong("Backup", 1)
SetGadgetState(#Option_CopieSauvegarde, Option\Backup)
ClosePreferences()
EndProcedure
Procedure Option_Sauve()
If CreatePreferences("PBSyntax.ini")
If Option\Tab = Chr(9)
WritePreferenceString("Tab", "")
Else
WritePreferenceString("Tab", ReplaceString(Option\Tab, " ", "_"))
EndIf
WritePreferenceLong("Backup", Option\Backup)
ClosePreferences()
EndIf
EndProcedure
SetCurrentDirectory(ProgramFiledirectory())
;{- Interface
Procedure Titre(Gadget, Image, Icone, Icone_Dimension, Texte.s, Police)
StartDrawing(ImageOutput(Image))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0, 0, OutputWidth(), OutputHeight(), 0)
DrawingMode(#PB_2DDrawing_Gradient | #PB_2DDrawing_AlphaBlend)
GradientColor(0, $60A0A0A0)
GradientColor(0.3, $80A0A0A0)
GradientColor(1, $00FFFFFF)
LinearGradient(0, 0, 0.3 * 1.5 * OutputHeight() * OutputHeight() / OutputWidth(), OutputHeight())
Box(0, 0, OutputWidth(), OutputHeight())
DrawingMode(#PB_2DDrawing_Transparent | #PB_2DDrawing_AlphaBlend)
DrawingFont(FontID(Police))
DrawText(OutputHeight(), (OutputHeight() - TextHeight(Texte)) / 2, " " + Texte, $FF000000)
DrawAlphaImage(ImageID(Icone), (OutputHeight() - Icone_Dimension) / 2, (OutputHeight() - Icone_Dimension) / 2)
DrawingMode(#PB_2DDrawing_Outlined | #PB_2DDrawing_AlphaBlend)
Line(0, 0, OutputWidth(), 1, $30000000)
StopDrawing()
SetGadgetState(Gadget, ImageID(Image))
EndProcedure
#Fenetre_B = 4
#Fenetre_L = 300
#Fenetre_H = 36 + 80 + #Fenetre_B + 36 + 120 + #Fenetre_B + 36 + 24 + 32
Police_Normal = LoadFont(#PB_Any, "Verdana", 8, #PB_Font_HighQuality)
Police_Titre = LoadFont(#PB_Any, "Verdana", 10, #PB_Font_HighQuality)
SetGadgetFont(#PB_Default, FontID(Police_Normal))
If OpenWindow(0, 0, 0, #Fenetre_L + 2 * #Fenetre_B, #Fenetre_H + 2 * #Fenetre_B, "PBSyntax", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_SystemMenu) = 0
End
EndIf
x = #Fenetre_B
y = #Fenetre_B
CreateImage(#Liste_Titre, #Fenetre_L, 36, 32)
ImageGadget(#Liste_Titre, x, y, #Fenetre_L, 36, ImageID(#Liste_Titre))
Titre(#Liste_Titre, #Liste_Titre, Icone_Liste, 32, "Liste de traitement", Police_Titre)
y + 36
ListIconGadget(#Liste, x, y, #Fenetre_L - 40, 80, "Fichier(s) ou dossier(s) à traiter", #Fenetre_L - 40 - 32, #PB_ListIcon_MultiSelect | #PB_ListIcon_FullRowSelect)
ButtonImageGadget(#Liste_Fichier, x + #Fenetre_L - 40, y, 40, 40, ImageID(Icone_Fichier))
GadgetToolTip(#Liste_Fichier, "Ajouter un ou plusieurs fichiers")
y + 40
ButtonImageGadget(#Liste_Dossier, x + #Fenetre_L - 40, y, 40, 40, ImageID(Icone_Dossier))
GadgetToolTip(#Liste_Dossier, "Ajouter un dossier")
y + 40 + #Fenetre_B
CreateImage(#Traitement_Titre, #Fenetre_L, 36, 32)
ImageGadget(#Traitement_Titre, x, y, #Fenetre_L, 36, ImageID(#Traitement_Titre))
Titre(#Traitement_Titre, #Traitement_Titre, Icone_Traitement, 32, "Traitement", Police_Titre)
y + 36
EditorGadget(#Traitement_Texte, x, y, #Fenetre_L - 40, 120, #PB_Editor_ReadOnly)
SendMessage_(GadgetID(#Traitement_Texte), #EM_SETTARGETDEVICE, #Null, 0) ; Retour à la ligne
ButtonImageGadget(#Traitement_Lancer, x + #Fenetre_L - 40, y, 40, 40, ImageID(Icone_Lancer))
GadgetToolTip(#Traitement_Lancer, "Lancer le traitement")
ButtonImageGadget(#Traitement_Annuler, x + #Fenetre_L - 40, y, 40, 40, ImageID(Icone_Annuler))
GadgetToolTip(#Traitement_Annuler, "Annuler le traitement")
HideGadget(#Traitement_Annuler, 1)
y + 120 + #Fenetre_B
CreateImage(#Option_Titre, #Fenetre_L, 36, 32)
ImageGadget(#Option_Titre, x, y, #Fenetre_L, 36, ImageID(#Option_Titre))
Titre(#Option_Titre, #Option_Titre, Icone_Information, 32, "Options", Police_Titre)
y + 36
ComboBoxGadget(#Option_Indentation, x, y, #Fenetre_L - 40, 24)
AddGadgetItem(#Option_Indentation, -1, "Indentation : Vrai tabulation")
AddGadgetItem(#Option_Indentation, -1, "Indentation : " + "1" + " espace")
For Index = 2 To 10
AddGadgetItem(#Option_Indentation, -1, "Indentation : " + Str(Index) + " espaces")
Next
y + 24
CheckBoxGadget(#Option_CopieSauvegarde, x, y, #Fenetre_L - 40, 32, "Faire une copie de sauvegarde avant le traitement d'un fichier", #PB_Button_MultiLine)
; ComboBoxGadget(#Option_CopieSauvegarde, x, y, #Fenetre_L - 40, 24)
; AddGadgetItem(#Option_CopieSauvegarde, -1, "Aucune copie de sauvegarde")
; AddGadgetItem(#Option_CopieSauvegarde, -1, "Faire une copie de sauvegarde")
; AddGadgetItem(#Option_CopieSauvegarde, -1, "Faire une copie de sauvegarde uniquement si une erreur est détectée durant le traitement")
AddKeyboardShortcut(0, #PB_Shortcut_Delete, #Liste_Supprimer)
EnableGadgetDrop(#Liste, #PB_Drop_Files, #PB_Drag_Move)
#FenetreDossier_B = 4
#FenetreDossier_L = 250
#FenetreDossier_H = 36 + 40 + 32 + #Fenetre_B + 24 + 24 + 24 + #Fenetre_B + 24
Police_Normal = LoadFont(#PB_Any, "Verdana", 8, #PB_Font_HighQuality)
Police_Titre = LoadFont(#PB_Any, "Verdana", 10, #PB_Font_HighQuality)
SetGadgetFont(#PB_Default, FontID(Police_Normal))
If OpenWindow(#Liste_Dossier_Fenetre, 0, 0, #FenetreDossier_L + 2 * #Fenetre_B, #FenetreDossier_H + 2 * #Fenetre_B, "PBSyntax", #PB_Window_Invisible | #PB_Window_WindowCentered | #PB_Window_SystemMenu, WindowID(0)) = 0
End
EndIf
x = #Fenetre_B
y = #Fenetre_B
CreateImage(#Liste_Dossier_Titre, #FenetreDossier_L, 36, 32)
ImageGadget(#Liste_Dossier_Titre, x, y, #FenetreDossier_L, 36, ImageID(#Liste_Dossier_Titre))
Titre(#Liste_Dossier_Titre, #Liste_Dossier_Titre, Icone_Liste, 32, "Ouvrir un dossier", Police_Titre)
y + 36
EditorGadget(#Liste_Dossier_Texte, x, y, #FenetreDossier_L - 40, 40, #PB_Editor_ReadOnly)
ButtonImageGadget(#Liste_Dossier_Selection, x + #FenetreDossier_L - 40, y, 40, 40, ImageID(Icone_Dossier))
GadgetToolTip(#Liste_Dossier_Selection, "Sélection du dossier")
y + 40
CheckBoxGadget(#Liste_Dossier_SousDossier, x, y, #FenetreDossier_L - 40, 32, "Rechercher également les fichiers dans les sous-dossiers", #PB_Button_MultiLine)
y + 32 + #Fenetre_B
CheckBoxGadget(#Liste_Dossier_FiltrePB, x, y, #FenetreDossier_L - 40, 24, "Traiter tous les fichiers 'pb'", #PB_Button_MultiLine)
y + 24
CheckBoxGadget(#Liste_Dossier_FiltrePBI, x, y, #FenetreDossier_L - 40, 24, "Traiter tous les fichiers 'pbi'", #PB_Button_MultiLine)
y + 24
CheckBoxGadget(#Liste_Dossier_FiltreAutre, x, y, #FenetreDossier_L - 40, 24, "Traiter tous les fichiers :", #PB_Button_MultiLine)
StringGadget(#Liste_Dossier_FiltreAutre_Texte, x + #FenetreDossier_L - 40, y, 40, 24, "")
y + 24 + #Fenetre_B
ButtonGadget(#Liste_Dossier_Valider, x, y, #FenetreDossier_L, 24, "Valider")
;}
Option_Charge()
;{ Paramètre de lancement
Fichier.s = ""
For Index = 1 To CountProgramParameters()
If Fichier
Fichier + " "
EndIf
Fichier + ProgramParameter()
Next
If Fichier
If FileSize(Fichier) = -2
Liste_Ajouter("", Fichier, #FiltrePB + ";" + #FiltrePBI)
Else
Liste_Ajouter(Fichier, "", "")
EndIf
Parametre_Lancement = 1
Tache()
EndIf
;}
Repeat
Event = WaitWindowEvent(50)
Select EventWindow()
Case 0
Select Event
Case #PB_Event_CloseWindow
Quitter = 1
Case #PB_Event_Gadget
Select EventGadget()
Case #Liste
Position = GetGadgetState(#Liste)
If Position >= 0 And IsThread(Tache) = 0
SelectElement(ListeTraitement(), Position)
EndIf
Case #Liste_Dossier_Valider
Fichier.s = PathRequester("Ajouter un dossier", GetPathPart(Fichier))
If Fichier
Filtre.s = ""
If GetGadgetState(#Liste_Dossier_FiltrePB)
Filtre + #FiltrePB
EndIf
If GetGadgetState(#Liste_Dossier_FiltrePBI)
If Filtre
Filtre + ";"
EndIf
Filtre + #FiltrePBI
EndIf
If GetGadgetState(#Liste_Dossier_FiltreAutre)
If Filtre
Filtre + ";"
EndIf
Filtre + LCase(GetGadgetText(#Liste_Dossier_FiltreAutre_Texte))
EndIf
Liste_Ajouter("", Fichier, Filtre)
EndIf
Case #Liste_Fichier
Fichier = OpenFileRequester("Ajouter un fichier", Fichier, "Code PureBasic|*.pb;*.pbi|Tous les fichiers|*.*", 0, #PB_Requester_MultiSelection)
While Fichier
Liste_Ajouter(Fichier, "", "")
Fichier = NextSelectedFileName()
Wend
Case #Liste_Dossier
DisableGadget(#Liste_Dossier, 1)
SetGadgetText(#Liste_Dossier_Texte, "")
SetGadgetState(#Liste_Dossier_SousDossier, 0)
SetGadgetState(#Liste_Dossier_FiltrePB, 1)
SetGadgetState(#Liste_Dossier_FiltrePBI, 1)
SetGadgetState(#Liste_Dossier_FiltreAutre, 0)
SetGadgetText(#Liste_Dossier_FiltreAutre_Texte, "")
DisableGadget(#Liste_Dossier_FiltreAutre_Texte, 1)
HideWindow(#Liste_Dossier_Fenetre, 0)
Fichier.s = PathRequester("Ouvrir un dossier", GetPathPart(Fichier))
If Fichier
SetGadgetText(#Liste_Dossier_Texte, Fichier)
EndIf
Case #Traitement_Lancer
Tache()
Case #Traitement_Annuler
Traitement_Arret = 1
Case #Option_CopieSauvegarde
Option\Backup = GetGadgetState(#Option_CopieSauvegarde)
Case #Option_Indentation
Select GetGadgetState(#Option_Indentation)
Case 0
Option\Tab = Chr(9)
Default
Option\Tab = Space(GetGadgetState(#Option_Indentation))
EndSelect
EndSelect
Case #PB_Event_Menu
Select EventMenu()
Case #Liste_Supprimer
If IsThread(Tache) = 0
Liste_Supprimer()
EndIf
EndSelect
Case #PB_Event_GadgetDrop
Select EventGadget()
Case #Liste
Fichiers.s = EventDropFiles()
Count = CountString(Fichiers, Chr(10)) + 1
For Index = 1 To Count
Fichier.s = StringField(Fichiers, Index, Chr(10))
If FileSize(Fichier) >= 0
Liste_Ajouter(Fichier, "", "")
Else
Liste_Ajouter("", Fichier, #FiltrePB + ";" + #FiltrePBI)
EndIf
Next
EndSelect
EndSelect
Case #Liste_Dossier_Fenetre
Select Event
Case #PB_Event_CloseWindow
HideWindow(#Liste_Dossier_Fenetre, 1)
DisableGadget(#Liste_Dossier, 0)
Case #PB_Event_Gadget
Select EventGadget()
Case #Liste_Dossier_Selection
Fichier.s = PathRequester("Ouvrir un dossier", GetPathPart(Fichier))
If Fichier
SetGadgetText(#Liste_Dossier_Texte, Fichier)
EndIf
Case #Liste_Dossier_FiltreAutre
DisableGadget(#Liste_Dossier_FiltreAutre_Texte, 1 - GetGadgetState(#Liste_Dossier_FiltreAutre))
Case #Liste_Dossier_Valider
HideWindow(#Liste_Dossier_Fenetre, 1)
DisableGadget(#Liste_Dossier, 0)
Filtre.s = ""
If GetGadgetState(#Liste_Dossier_FiltrePB)
Filtre + #FiltrePB
EndIf
If GetGadgetState(#Liste_Dossier_FiltrePBI)
If Filtre
Filtre + ";"
EndIf
Filtre + #FiltrePBI
EndIf
If GetGadgetState(#Liste_Dossier_FiltreAutre)
If Filtre
Filtre + ";"
EndIf
Filtre + GetGadgetText(#Liste_Dossier_FiltreAutre_Texte)
EndIf
Liste_Ajouter("", GetGadgetText(#Liste_Dossier_Texte), Filtre, GetGadgetState(#Liste_Dossier_SousDossier))
EndSelect
EndSelect
EndSelect
Until Quitter And IsThread(Tache) = 0
Option_Sauve()
DataSection
TxtIncludeBinary_Begin:
Compiler:
IncludeBinary "PBSyntax - Compiler.txt"
Keywords:
IncludeBinary "PBSyntax - Keywords.txt"
Operators:
IncludeBinary "PBSyntax - Operators.txt"
Variables:
IncludeBinary "PBSyntax - Variables.txt"
IndentationP:
IncludeBinary "PBSyntax - Indentation +.txt"
IndentationN:
IncludeBinary "PBSyntax - Indentation -.txt"
TxtIncludeBinary_End:
Icone_Annuler:
IncludeBinary "Interface\Annuler.png"
Icone_Dossier:
IncludeBinary "Interface\Dossier.png"
Icone_Dossier_16:
IncludeBinary "Interface\Dossier 16.png"
Icone_Fichier:
IncludeBinary "Interface\Fichier.png"
Icone_Fichier_16:
IncludeBinary "Interface\Fichier 16.png"
Icone_Information:
IncludeBinary "Interface\Information.png"
Icone_Lancer:
IncludeBinary "Interface\Lancer.png"
Icone_Liste:
IncludeBinary "Interface\Liste.png"
Icone_Traitement:
IncludeBinary "Interface\Traitement.png"
EndDataSection