PBSyntax - Mise en forme du code

Vous avez développé un logiciel en PureBasic et vous souhaitez le faire connaitre ?
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: PBSyntax - Mise en forme du code

Message par Le Soldat Inconnu »

C'est ici :
http://www.lsi-dev.com/index.php?mod=do ... rid&id=163

Pour info :
- On peut utiliser le glisser déposer pour ajouter des fichiers à traiter
- On peut mettre le programme en outil de PB, faut donner en param le nom du fichier et recharger le code après le traitement.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: PBSyntax - Mise en forme du code

Message par Kwai chang caine »

Tu va pas y croire, je suis arrivé à l'utiliser 8O

Par contre, j'ai comme habitude de faire des paragraphes pour separer les divers parties de mes codes
Et ton programme, a cadré à gauche mon mot "constantes" comme tous les autres qui sont dans ce cas

Code : Tout sélectionner

; @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;                                      CONSTANTES
; @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Remplacé par

Code : Tout sélectionner

; @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; CONSTANTES
; @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Autrement bravo, propre, simple, efficace....SOLDAT INCONNU quoi :mrgreen:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: PBSyntax - Mise en forme du code

Message par nico »

je croyais que ça fonctionnait en plugin, mais c'est pas le cas et c'est bien dommage.

Sinon il faut que je te dise que ton site à une très mauvaise réputation auprès de WOT, WOT est une extension pour chrome et firefox qui permet d'évaluer et de connaitre l'avis des autres navigateurs sur le sérieux d'un site.

Cela vient apparemment des exe que tu distribues et qui sont considérés comme des malwares etc..., je sais que tu connais le problème.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: PBSyntax - Mise en forme du code

Message par Ar-S »

Je viens de voter sur WOT pour remonter un peu la cote du site.
Ce problème de faux positif est vraiment embêtant !
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: PBSyntax - Mise en forme du code

Message par Le Soldat Inconnu »

c'est uniquement du aux fausses détection pour le WOT.

@Nico, tu entends quoi par plugin ?
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: PBSyntax - Mise en forme du code

Message par nico »

Un outil pour l'IDE de Purebasic
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: PBSyntax - Mise en forme du code

Message par Le Soldat Inconnu »

Ben ça fonctionne, moi, je l'utilise sous jaPBe avec le paramètre %FILE%

Sous PureBasic, avec %FILE en ligne de commande, cocher "attendre la fin de l’exécution" et cocher "recharger le code dans l'onglet courant". Fonctionne également, je viens de faire l'essai.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: PBSyntax - Mise en forme du code

Message par nico »

ah ok, vu qu'il y avait pas de fichier readme avec, j'ai supposé que non.

Tu l'avais peut être expliqué dans le topic mais j'ai du zappé, impeccable alors.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: PBSyntax - Mise en forme du code

Message par Le Soldat Inconnu »

oui, z'avais expliqué :)

C'est en test pour le moment. J'ai trouvé un petit bug si on ne définis pas le dossier de travail, et un autre pour les fichiers comportant des espaces envoyés en ligne de commande
J'ai mis le programme à jour

Si vous en trouvez d'autres. KCC, ton soucis n'est pas un bug puisque c'est voulu comme ça.

Je pense que je vais ajouter une fenêtre de configuration de la mise en forme pour :
- Activer la mise en forme des commentaires
- Ajout d'espace avant et après les opérateurs
- Ajout d'espace après les ","
- Ajout d'espace après "(" et avant ")"

Et faut que je regarde si je peux utiliser simplement le compilateur pour tester si un code est toujours compilable après mise en forme, et générer une erreur sinon.

A au fait, le point fort de cette version, c'est ceci :

Code : Tout sélectionner

CompilerIf #truc
	If a * *pointeur <> c
CompilerElse
	If -a * *pointeur >= c
CompilerEndIf
	c = @adresse + B + *pointeur
EndIf

CompilerSelect #machin
	CompilerCase 1
		If a + B < 0
			If bidule
	CompilerCase 2
		If a - B > 0
			If bidule <> 3
CompilerEndSelect
		oulala.s = "htre"
	EndIf
EndIf
Une gestion complète des CompilerIf et CompilerSelect


Vous pouvez également éditer le contenu des fichiers *.txt pour personnaliser la mise en forme, il faut que j'ajoute des lignes de commentaires dedans pour expliquer
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: PBSyntax - Mise en forme du code

Message par dayvid »

Dic donc LSI, tu avence sacrément bien a ce que je voie :o

Que tu es fort :D

Tu voudrait pas me filer un ch'ti coup de main dans mon projet :P

Ya pas grand chose a faire, juste corriger deux trois truc et
améliorer quelque commandes, en plus je rame un peut :(
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: PBSyntax - Mise en forme du code

Message par Le Soldat Inconnu »

Nouvelle version en ligne, j'ai ajouter les options de formatage.
il faut supprimer tous les fichiers PBSyntax créés pour les mettre à jour, merci.

Il me reste à zieuter pour le compilateur :) J'espère que c'est pas trop complexe, l'affaire


@ Dayvid : Charité bien ordonné commence par soi même, j'ai plein de projet à finir pour le moment (mon Agenda, Groupe Exploreur, mon logiciel de Sauvegarde et des soucis de fausse détection de virus à gérer pour mes programmes)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: PBSyntax - Mise en forme du code

Message par dayvid »

Ouais, je m'en doutais bien :roll:
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: PBSyntax - Mise en forme du code

Message par Le Soldat Inconnu »

J'ai apporté quelque correction sur la dernière version :
- Gestion des [ et ]
- Reconnaissance des @*Variable

Voir sur mon site.

Et comme promis, le code du logiciel :
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.

le lien du programme avec image et fichier texte :
http://partage.lsi-dev.com/PB/PBSyntax%20-%20Code.zip

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

Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: PBSyntax - Mise en forme du code

Message par Le Soldat Inconnu »

Suite du message précédent :
Pour les courageux, les fichiers textes nécessaires sont :

"PBSyntax - Compiler.txt"

Code : Tout sélectionner

; Mot-clé du compilateur permettant d'activer ou non une partie de code.
; Il faut indiquer si le mot-clé est une balise de début avec "start", une balise intermédiaire avec "middle" ou une balise de fin avec "end".
; Exemples :
; CompilerIf est un mot-clé à marquer avec "start".
; CompilerElse est un mot-clé à marquer avec "middle".
; CompilerEndIf est un mot-clé à marquer avec "end".

compilerif = start
compilerelse = middle
compilerelseif = middle
compilerendif = end
compilerselect = start
compilercase = middle
compilerdefault = middle
compilerendselect = end
"PBSyntax - Indentation -.txt"

Code : Tout sélectionner

; Avant chaque mot-clé de cette liste, on ajoute la valeur à l'indentation de la ligne.
; Exemple
; Avant EndIf, on ajoute -1 à l'indentation pour placer EndIf avec une indentation de moins que la ligne précédente.

else = -1
elseif = -1
endif = -1

case = -1
default = -1
endselect = -2

endprocedure = -1
endmacro = -1

forever = -1

next = -1

until = -1

wend = -1

includebinary = 1
data = 1
enddatasection = -1

endenumeration = -1

endinterface = -1
endstructure = -1

endwith = -1

stopdrawing( = -1
closegadgetlist( = -1
stop3d( = -1
closesubmenu( = -1

compilerendif = -1
compilerelse = -1
compilerelseif = -1

compilercase = -1
compilerdefault = -1
compilerendselect = -2
"PBSyntax - Indentation +.txt"

Code : Tout sélectionner

; Après chaque mot-clé de cette liste, on ajoute la valeur à l'indentation de la ligne.
; Exemple :
; Après If, on ajoute 1 à l'indentation pour obtenir une indentation de plus sur la ligne suivante.

select = 2
case = 1
default = 1

if = 1
else = 1
elseif = 1

for = 1
foreach = 1

procedure = 1
proceduredll = 1
macro = 1

repeat = 1

while = 1

with = 1

datasection = 1
data = -1
includebinary = -1

enumeration = 1
structure = 1
interface = 1

startdrawing( = 1
containergadget( = 1
panelgadget( = 1
scrollareagadget( = 1
opengadgetlist( = 1
start3d( = 1
opensubmenu( = 1

compilerif = 1
compilerelse = 1
compilerelseif = 1

compilerselect = 2
compilercase = 1
compilerdefault = 1
"PBSyntax - Keywords.txt"

Code : Tout sélectionner

; Liste des mot-clés PureBasic

if
else
elseif
endif

select
case
default
endselect

procedure
proceduredll
endprocedure
procedurereturn

while
wend

repeat
until
forever

for
foreach
to
step
next

macro
endmacro

import
endimport

prototype

enumeration
endenumeration

structure
endstructure

interface
endinterface

datasection
data
includebinary
enddatasection
Restore
read

xincludefile
includefile
includepath

with
endwith

global
shared
protected
static
define
declare
newlist
newmap
dim
redim

or
and

:
"PBSyntax - Operators.txt"

Code : Tout sélectionner

; Liste des opérateurs PureBasic

+
-
*
/
^
&
|
!
%
<<
>>
=
<
>
<=
>=
<>
"PBSyntax - Variables.txt"

Code : Tout sélectionner

; Liste des indicateurs pouvant être utilisés en début de variable, donc sans espace avec la variable qui suit.
; Exemples :
; Un pointeur *Pointer, le * doit être écrit sans ajouter d'espace avant Pointer.
; Une valeur négative -7, le - doit être écrit sans ajouter d'espace avant 7.

-
*
~
@
\
%
$
?
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: PBSyntax - Mise en forme du code

Message par Kwai chang caine »

Merci Soldat pour le partage 8)
Manque les png mais on devrait s'en sortir sans
Encore merci
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre