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.cfgLangage 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.pasLangage 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.

Avant le formatage

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 :

Après le formatage

Liens

Traduction : Yann Yvnec

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *