commit 9038b5e53cc92bdb20994f05a0163ac5a14b511f
parent 697342f01e64c5241a9e73bb2e853dfe0373d7f1
Auteur: Selve <selve@asteride.xyz>
Date: Fri, 26 Jan 2024 13:28:05 -0500
[cont] ajout d'un exemple
Diffstat:
1 file changed, 67 insertions(+), 5 deletions(-)
diff --git a/src/articles/aplat_1_documents_structures_unix.aplat b/src/articles/aplat_1_documents_structures_unix.aplat
@@ -2,6 +2,7 @@
(@ (type "article")
(titre "aplat(1) : documents structurés pour Unix")
(date-pub "2024-01-25")
+ (date-mod "2024-01-26")
(auteur "Selve")
(lien:ref-std "ART_APLAT_1")
(uuid "89352ae7-b5d5-4c87-bf51-edd280ae0c62"))
@@ -246,8 +247,12 @@ l’attribut « " (code "ref") " » porte sur celui nommé « " (code "lien")
:doc: )
""")
-(par "Il est composé d’une série de lignes et de trois champs, séparés par des
-caractères de tabulation.")
+(par "On voit tout de suite pourquoi ce format n’est pas destiné à être manipulé
+par des humains. Il est en revanche très adapté à des outils analysant les
+fichiers ligne par ligne et champ par champ.")
+
+(par "Un document " (code "plat(5)") " est composé d’une série de lignes et de
+trois champs, séparés par des caractères de tabulation.")
(par "Le premier champ correspond au nom du domaine. Il prend la forme de la
liste des toutes les étiquettes des domaines parents, précédées d’un deux-points
@@ -281,8 +286,8 @@ ligne commençant par « " (code ":doc:pre:") " » dans l’exemple ci-dessus.
(section "Utilisation d’" (code "aplat(1)"))
-(par "Le programme " (code "aplat(1)") " ne lit aucun argument de ligne de
-commande : ni options ni nom de fichier ; il se contente de lire en entrée
+(par "Le programme " (code "aplat(1)") " ne lit aucun argument en ligne de
+commandes : ni options ni nom de fichier ; il se contente de lire en entrée
standard et d’écrire en sortie standard.")
(par "Il s’ulitise donc de la manière suivante.")
@@ -290,6 +295,30 @@ standard et d’écrire en sortie standard.")
(par (@:césure "pre")
"$ aplat <entree.aplat >sortie.plat")
+(par "En supposant que le document " (code "aplat(5)") " de l’exemple précédent
+se trouve dans le fichier " (code "bonjour.aplat" ) ", on pourrait écrire la
+séquence de commandes suivantes pour en extraire le programme, le compiler et
+l’exécuter.")
+
+(par (@:césure "pre")
+"""
+$ aplat <bonjour.aplat | grep '^:doc:pre: ' | cut -f3 |
+ { tr -d '\n'; echo; } | xargs -0 printf '%b' |
+ cc -o bonjour -x c - && ./bonjour
+Bonjour tout le monde!
+""")
+
+(par "Ici, " (code "aplat") " fait passer du format " (code "aplat(5)") " au
+format " (code "plat(5)") " le contenu du fichier " (code "bonjour.aplat") " ; "
+(code "grep") " ne retient de la sortie de la commande précédente que les lignes
+dont l'étiquette est " (code ":doc:pre:") " ; " (code "cut") " isole le
+troisième champ ; " (code "tr") " fusionne toutes les lignes en supprimant tous
+les caractère de saut de ligne ; " (code "echo") " réinsère la dernière nouvelle
+ligne, que " (code "tr") " avait supprimé en trop ; " (code "xargs -0 printf
+'%b'") " a pour effet de déséchapper les caractères de nouvelle ligne et de
+tabulation, " (code "cc") " compile le texte résultant et, finalement, " (code
+"./bonjour") " exécute le programme.")
+
(section "Conclusion")
(par "J’ai créé cet utilitaire après de nombreuses heures de patentatage avec
@@ -298,9 +327,42 @@ les solutions existantes. Je cherchais un format de document sémantique qui soi
Je suis content de dire que cette recherche est maintenant terminée ; je suis
satisfait de ma création.")
+(par "Je ne prétends pas que ce programme et que les formats qu’il utilise
+soient d’une utilité universelle. On a vu dans le dernier exemple que les
+chaînes de commandes qui manipulent des documents " (code "plat(5)") " sont
+assez complexes. Cet exemple est même relativement simple dans son genre,
+puisqu’il ignore complètement le deuxième champ, celui des parenthèses, dont on
+n’aurait pas pu se passer si on n’avait pas préssuposé que le champ ne
+contiendrait qu’un seul domaine avec l’étiquette " (code ":doc:pre:") ". Aussi
+le format " (code "plat(5)") " est-il mieux adapté à être manipulé dans des
+scripts qu’à la ligne de commandes. On peut cependant abstraire une partie de la
+chaîne de commandes de cet exemple et en la plaçant dans un fichier " (code
+"compiler_c") ".")
+
+(par (@:césure "pre")
+"""
+$ cat compiler_c
+#!/bin/sh
+
+grep '^:doc:pre: ' |
+ cut -f3 |
+ { tr -d '\n'; echo; } |
+ xargs -0 printf '%b' |
+ cc -o "$1" -x c -
+$ chmod +x compiler_c
+""")
+
+(par "On peut alors composer :")
+
+(par (@:césure "pre")
+"""
+$ aplat <bonjour.aplat | ./compiler_c "bonjour" && ./bonjour
+Bonjour tout le monde!
+""")
+
(par "J’ai de nombreuses idées de programmes auxiliaires qui permettront de
faciliter l’utilisation des formats " (code "aplat(5)") " et " (code "plat(5)")
-". Je leur dédirai certainement d’autres articles.")
+". Je leur dédierai certainement d’autres articles.")
(section "Voir aussi")