Tout dans le programme doit être parfait : à la fois les algorithmes et l’alignement du texte source.
Ace Breakpoint
Au début, il peut sembler que la mise en forme du texte source a été inventée par des ennuyeux, mais en fait, un texte aligné selon certaines règles est plus facile à percevoir, ce qui signifie que l’on
passe moins de temps à l’étudier. Et le temps, comme vous le savez, est la ressource la plus précieuse.
Étant donné que de nombreux utilitaires de formatage payants et gratuits ont déjà été écrits, j’ai décidé de ne pas réinventer la roue, mais d’en choisir un prêt à l’emploi.
Après quelques expérimentations, j’ai réussi à trouver la meilleure option : l’utilitaire ptop.exe, qui est inclus avec FreePascal.
Après nous au moins PTOP
Pour accéder à cet utilitaire, vous devez télécharger le fichier d’installation adapté à votre système d’exploitation à partir du site Web des développeurs. Si vous ne prévoyez pas d’utiliser Free Pascal, lors de l’installation, sélectionnez uniquement l’option d’installation des utilitaires.
Une fois l’installation terminée, rapprochez le fichier ptop.exe de votre projet (pour ma part, j’ai décidé que tous les utilitaires externes seraient stockés dans le dossier extras\, dans un sous-dossier portant le nom de l’utilitaire).
Pour générer un fichier de configuration, exécutez l’utilitaire sur la ligne de commande avec l’option -g, en spécifiant le nom du fichier de configuration à créer.
ptop.exe -g ptop.cfg
Langage du code : CSS (css)
Vous ne pouvez pas le créer, mais personnellement, je n’ai pas aimé que ptop.exe mette en majuscule (change le premier caractère en majuscule) tous les mots-clés, et pour annuler cela, vous devez parcourir le fichier de configuration, en supprimant le mot capital dans l’action descriptions pour tous les mots-clés.
Pour formater le fichier source et écraser le fichier d’origine, vous devrez exécuter la commande suivante :
ptop.exe -g ptop.cfg source.pas source.pas
Langage du code : CSS (css)
Module de formatage
Bien que vous n’ayez besoin d’écrire qu’un seul petit script pour le formatage, j’ai décidé de le séparer dans un module séparé, en le référant aux outils : (dossier Script\Tools\Formetter\Formattrer.pas).
const
FORMATTER_EXE = 'Extras\FreeFormat\ptop.exe';
FORMATTER_CONFIG = 'Extras\FreeFormat\ptop.cfg';
FORMATTER_PARAM = '-c %0.s %1.s %2.s '; // les nombres ne jouent pas de
rôle, les paramètres sont substitués à leur tour
function Formatter_FormatText( AText:string ):string;
// formatage du texte source Delphi par un utilitaire externe
var
tmpDataFile: string;
tmpConfigFile: string;
tmpFormatter: string;
tmpMemo: TMemo;
tmpParam: string;
begin
// Utilitaire et fichier de configuration sont dans un dossier spécial à
l'intérieur de notre projet
tmpFormatter := ExtractFilePath( Application.ExeName ) + FORMATTER_EXE;
tmpConfigFile := ExtractFilePath( Application.ExeName ) + FORMATTER_CONFIG;
// Si quelque chose n'est pas trouvé, alors lève une exception
if not FileExists(tmpFormatter) then
RaiseException('Utilitaire de formatagz introuvable: '+tmpFormatter)
else
if (FORMATTER_CONFIG <> '') and not FileExists(tmpConfigFile) then
RaiseException('Fichier de configuration introuvable: '+tmpConfigFile)
else
begin
// On crée un fichier temporaire
tmpDataFile := GetTempFileName+'.pas';
// On utilise un Mémo pour créer un fichier
tmpMemo := TMemo.Create(MainForm);
tmpMemo.Parent := MainForm; // Nécessaire pour que l'enregistrement sur le disque fonctionne
tmpMemo.Visible := False;
try
tmpMemo.Lines.Text := AText;
tmpMemo.Lines.SaveToFile(tmpDataFile); // On enregistre le texte dans un fichier temporaire
// On exécute la conversion
tmpParam := Format(FORMATTER_PARAM,[tmpConfigFile,tmpDataFile,tmpDataFile]);
OpenFile(tmpParam,tmpFormatter);
case WaitExternalExe( tmpFormatter ) of
-1: RaiseException('L''utilitaire de formatage n'a pas démarré:
'+tmpFormatter);
-2: RaiseException('Utilitaire de formatage bloqué: '+tmpFormatter)
end;
tmpMemo.Lines.Clear; // On charge le résultat
tmpMemo.Lines.LoadFromFile(tmpDataFile);
Result := tmpMemo.Lines.Text;
finally
tmpMemo.Free;
end;
end;
end;
Langage du code : Delphi (delphi)
La fonction Formatter_FormatText() appelle un utilitaire externe pour effectuer le formatage du texte. La configuration de l’utilitaire revient à définir trois constantes : deux d’entre elles stockent le chemin relatif vers l’utilitaire lui-même et le fichier de configuration, et la troisième contient une ligne décrivant les paramètres de l’appel de l’utilitaire, qui est conçu pour utiliser le standard Format( ) commande. Cette commande substitue des valeurs de différents types dans une chaîne de modèle. Dans notre cas, trois paramètres de chaîne sont remplacés : fichier de configuration, fichier source et fichier de résultat.
Une attention particulière doit être portée au script, qui peut être considéré comme universel. Il s’agit de la fonction WaitExternalExe() – attendant la fin d’un programme externe. Le principe de son fonctionnement est que le programme avec un certain en-tête doit démarrer pendant un temps spécifié, puis le script attend sa fin.
function WaitExternalExe( ACaption:string; AStartCount: integer = 10; AFinishCount:integer = 0; ACountDelay:integer = 10 ):integer;
// On attend la fin du programme externe
// La recherche par titre de fenêtre est utilisée
//
// ACaption - légende de la fenêtre
// AStartCount - le nombre de cycles d'attente pour le démarrage du
programme
// AFinishCount - nombre de cycles d'attente pour l'achèvement du
programme ; 0 - boucle d'attente infinie ;
// ACountDelay - délai dans le cycle d'attente, en ms
var
h: integer; // fenêtre de description
tmpCounter: integer;
begin
tmpCounter := AStartCount;
// En attente d'ouverture
// On cherche une fenêtre
while (h = 0) and (tmpCounter > 0) do
begin
Sleep(ACountDelay);
h := FindWindow('', ACaption);
Dec(tmpCounter);
end;
if h = 0 then
Result := -1 // Le programme n'a pas démarré
else
begin
tmpCounter := AFinishCount;
while (h <> 0) and (tmpCounter >= 0) do
begin
Sleep(ACountDelay);
h := FindWindow('', ACaption);
if AFinishCount > 0 then
Dec(tmpCounter);
end;
if h = 0 then
Result := 0 // Le programme est terminé
else
Result := -2; // Le programme ne répond pas
end;
end;
Langage du code : Delphi (delphi)
En cas de succès, la fonction renvoie 0, les autres valeurs signifient des erreurs. Ces erreurs doivent être traitées à l’endroit d’où cette fonction est appelée. Dans notre cas, dans Formatter_FormatText(). Mais comme cette fonction est également une fonction de bibliothèque, je n’utilise pas ShowMessage () et des fonctions similaires pour afficher les erreurs, mais lève une exception, transférant la responsabilité de la gestion des erreurs aux scripts de niveau supérieur. Dans notre cas, l’appel à la fonction de formatage de la couche application ressemble à ceci :
procedure efmExample_btnFormatCode_OnClick (Sender: TObject; var Cancel: boolean);
// Formatage du code
begin
try
// On appelle la fonction de formatage
efmExample.memSnippet.Text := Formatter_FormatText( efmExample.memSnippet.Text );
except
// En cas d'erreur, Formatter_FormatText() lève des exceptions,
// qui peuvent être interceptées et on affiche le texte de
l'exception
ShowMessage( ExceptionMessage );
end;
end;
Langage du code : Delphi (delphi)
Résultat
Désormais, vous n’avez plus à vous soucier d’aligner manuellement les exemples tirés de vos sources
ou du forum.
Ouvrez l’exemple pour l’édition et cliquez sur le bouton « Formater le code » (1), puis sur « Enregistrer » (2).
Maintenant, la source semble beaucoup plus nette :
Liens
- Guide du développeur 1.3 bêta
- Fichiers de projet avec codes sources:
- Lien vers l’article original (en russe)
Traduction : Yann Yvnec