Sommaire Carte Index Recherche Nouvelles Archives Liens A propos
[Barre Superieure]
[Barre Inferieure]
[Photo de l'auteur]
par John Perr

L´auteur:

Utilisateur Linux depuis 1994; il est l'�diteur fran�ais de la revue LinuxFocus.


Sommaire:

  1. Introduction
  2. D�finition
  3. Un exemple
  4. Version HTML
  5. Version macro
  6. D�finition des macros
  7. Description
  8. Cr�ation des pages
  9. R�capitulatif
  10. Conclusion

Construire des fichiers avec des macros m4

[Illustration]

Résumé:

Cette introduction � l'utilisation du macro processeur m4 explique comment simplifier la mise � jour de fichiers textes ou HTML � l'aide de macros commandes m4.



 

Introduction

Il est fr�quent d'avoir besoin d'un langage de macros commandes lorsqu'on utilise un �diteur. La plupart d'entre eux un en poss�de d'ailleur un int�gr� et même le compilateur C poss�de son propre pr�-processeur CPP. Lorsque l'on doit �diter des fichiers de configuration au format texte, ou même �diter des pages HTML pour maintenir un petit site web, il peut s'av�rer pratique d'utiliser le macro processeur GNU/m4 qui est livr� avec toutes les distributions de linux et qui est devenu un standard de facto dans le monde Unix.

Dans ce qui suit, nous allons voir comment utiliser le processeur de macro m4 pour construire des pages HTML et ainsi maintenir la coh�rence d'un site web. Bien s�r, il existe quantit� d'autres moyens d'obtenir le même r�sultat; c'est ce qui fait la beaut� de ce syst�me.

Cette technique est celle utilis�e pour la g�n�ration du fameux fichier sendmail.cf. Voir � ce sujet l'article de Eric Jacoboni dans LinuxMagazine n�2 de janvier 99.

L'utilisation du langage macro m4 n'est pas limit� � l'�dition de fichier texte ou HTML, il pourra s'av�rer tr�s utile pour les programmeurs qui souhaitent �tendre les possibilit�s du pr�processeur du langage C ou pour ceux qui veulent disposer de possibilit�s �quivalentes au C avec un autre langage.

 

D�finition

On parle de processeur de macro pour d�finir un programme qui interpr�te des commandes (les macros) elles même d�finies par l'utilisateur. Par exemple avec une d�finition comme la suivante:

define(AUTEUR,`Aghata Christie<[email protected]>')

il suffira de mettre le mot "AUTEUR" dans le texte pour qu'il soit remplac� par le texte "Aghata Christie<[email protected]>" apr�s utilisation du processeur de macros. Il existe bien s�r des fonctions plus �volu�es comme nous le verrons dans ce qui suit.

 

Un exemple

Supposons que nous ayons � maintenir un site web qui comporte les même pages dans des langues diff�rentes. De plus, chaque page poss�de une ent�te et un pied de page qui assure un aspect coh�rent � l'ensemble du site. Pour faire simple et �viter d'avoir � utiliser un navigateur pour voir le r�sultat, notre exemple se limitera � du texte. Cela permettra aussi aux puristes qui utilisent lynx de naviguer sans probl�mes. Voici le code html d'une page:

 

Version HTML

  
<!-- D�but de l'ent�te -->
<HTML>
<HEAD>
<TITLE>Un site pour les utilisateurs de lynx</TITLE>
<META name="description" content="Site lynx et m4"> 
<META name="keywords" content="m4, lynx, GPL">
</HEAD>
<BODY BGCOLOR="#FFFFFF" LINK="#008000"
    VLINK="#808080" ALINK="#8080FF">
<TABLE>
  <TBODY>
  <TR><TD align=middle colspan="2">
      <H1>Lynx un navigateur en mode console</H1>
  <TR><TD align="left" valign="top" width="15%">
      <a href="./index-en.html">Anglais</A><BR>
      <a href="./index-fr.html">Fran�ais</A><BR>
      <a href="./index-es.html">Espagnol</A><BR>
      <a href="./index-it.html">Italien</A><BR>
      <a href="./index-de.html">Allemand</A><BR>
      <TD align=left>
<!-- Fin de l'ent�te -->

<!-- Corps de la page -->
   <P>Visitez le
   <A HREF="http://lynx.browser.org/">
   site officiel de lynx</A>
   pour plus d'informations sur Lynx,
   y compris les nouvelles mises � jour.</P>
       
   <P>Les liens vers les sources de la version
   courante et divers supports pour Lynx sont
   tenus � jour sur le site
   <A HREF="http://www.crl.com/~subir/lynx.html">
   liens Lynx</A>.</P>

   <P>Lynx est distribu� dans le cadre de la lisence GNU
   (General Public License - GPL)
   sans restriction sur son utilisation ni sa distribution.
   Les mentions des droits de
   reproduction de Lynx, "COPYHEADER", et GNU GPL, "COPYING",
   sont inclus dans la racine de l'arborescence de la distribution.
   Lynx est support� par la communaut� des utilisateurs de Lynx,
   une communaut� enti�rement b�n�vole (et non-officielle).</P>
<!-- Fin du corps de la page -->

<!-- D�but du pied de page -->
</TBODY>
</TABLE>
<HR size="0" noshadow>
<FONT SIZE=-2>
<EM>Date de mise à jour : 11/07/99
- &copy <A HREF="mailto:[email protected]">
lynx.browser.org</A> 1999
</EM></FONT>
</BODY>
</HTML>
<!-- Fin du pied de page -->

Voici l'apparence de cette page:

[Cliquez ici pour agrandir l'image] [Cliquez ici pour agrandir l'image]
avec lynx avec netscape

Pour la coh�rence du site, toutes les pages auront les m�mes styles d'ent�tes et de pieds de page, seul le corps de la page changera. Nous allons donc cr�er des macros m4 que nous ins�rerons dans le texte HTML de nos pages et qui remplacerons tous les �l�ments r�p�titifs.
Avant de donner le d�tail des macros, regardons ce que donneras l'exemple ci-dessus une fois r��crit de cette mani�re:

 

Version macro

  
LYNX_TITRE(Lynx un navigateur en mode console)
LYNX_ENTETE(Un site pour les utilisateurs de lynx)

   <P>Visitez le
   <A HREF="http://lynx.browser.org/">
   site officiel de lynx</A>
   pour plus d'informations sur Lynx,
   y compris les nouvelles mises � jour.</P>
       
   <P>Les liens vers les sources de la version
   courante et divers supports pour Lynx sont
   tenus � jour sur le site
   <A HREF="http://www.crl.com/~subir/lynx.html">
   liens Lynx</A>.</P>

   <P>Lynx est distribu� dans le cadre de la lisence GNU
   (General Public License - GPL)
   sans restriction sur son utilisation ni sa distribution.
   Les mentions des droits de reproduction de Lynx, "COPYHEADER",
   et GNU GPL, "COPYING", sont inclus dans la racine de
   l'arborescence de la distribution. Lynx est support� par
   la communaut� des utilisateurs de Lynx, une communaut�
   enti�rement b�n�vole (et non-officielle).</P>
LYNX_PIED

De cette mani�re, l'�criture des pages est beaucoup plus concises et le texte n'est pas noy� dans les balises HTML de d�but et de fin de page. De m�me pour cr�er les pages dans les autres langues, nous cr�eront des fichiers �quivalents � celui-ci mais traduits. La version anglaise donnerait:

  
LYNX_TITRE(Lynx a fully-featured World Wide Web
            client for character-cell displays)
LYNX_ENTETE(Lynx homepage)

      <P>Links to the current sources and support materials
      for Lynx are maintained at
      <A HREF="http://www.crl.com/~subir/lynx.html">
      Lynx links</A></P>
      <P> and at the Lynx homepage
      <A HREF="http://lynx.browser.org/">
      Lynx Information.</A></P>
      <P>View these pages for information about Lynx,
      including new updates.</P>

      <P>Lynx is distributed under the
      GNU General Public License (GPL) without
   restrictions on usage or redistribution.
   The Lynx copyright statement, "COPYHEADER",
   and GNU GPL, "COPYING", are included in the top-level
   directory of the distribution.
   Lynx is supported by the Lynx user community,
   an entirely volunteer (and unofficial) organization.</P>
LYNX_PIED

On utilise pour chaque langue les m�mes macros LYNX_TITRE, LYNX_ENTETE et LYNX_PIED mais avec des arguments diff�rents. Ces trois macros permettent de remplacer efficacement tout le code HTML de d�but et de fin de page. L'avantage non n�gligeable de ce syst�me r�side dans le fait que la d�finition des ent�tes et pieds de page est unique pour tout le site. Ainsi, en cas de modification du style des pages du site, il n'y aura qu'un fichier � modifier: celui qui contient les d�finitions des macros au lieu de reprendre toutes les pages une par une.

 

D�finition des macros

Ci-dessus, nous avons d�finis le besoin de 3 macros qui feront le gros du travail. Voici le fichier qui contient la d�finition de ces macros. Les explications suivent:

  
divert(-1)
# Fichier mac.css
# Version 1.0 des macros m4 pour Lynx
#
# Pour chaque langue est definit un fichier
# trans-LANG.m4 bas� sur le mod�le fran�ais.
# Si aucun fichier de traduction n'existe,
# le fran�ais est pris par d�faut.
#
divert(0)
changequote({,})dnl # changer les apostrophes en accolades
ifdef({LANG},,{define({LANG},{fr})})dnl # D�faut= fran�ais
include({trans-}LANG{.m4})dnl	  # Appeler le fichier de traduction
undefine({format})dnl		  # Supprimer la d�finition de format
define({_ANNEE_},esyscmd(date +%Y))dnl 	  #Ann�e en cours
define({LYNX_TITRE},{define(_TITLE_,$1)})dnl # D�claration de la 1�re macro
dnl # D�claration de la 2i�me macro
define({LYNX_ENTETE},{<!-- D�but de l'ent�te -->
<HTML>
<HEAD>
<TITLE>$1</TITLE>
<META name="description" content="Site lynx et m4"> 
<META name="keywords" content="m4, lynx, GPL">
</HEAD>
<BODY BGCOLOR="#FFFFFF" LINK="#008000" VLINK="#808080" ALINK="#8080FF">
<TABLE>
  <TBODY>
  <TR><TD align=middle colspan="2">
      <H1>_TITLE_</H1>
  <TR><TD align="left" valign="top" width="15%">
      <a href="./index-en.html">_ANGLAIS_</A><BR>
      <a href="./index-fr.html">_FRANCAIS_</A><BR>
      <a href="./index-es.html">_ESPAGNOL_</A><BR>
      <a href="./index-it.html">_ITALIEN_</A><BR>
      <a href="./index-de.html">_ALLEMAND_</A><BR>
      <TD align=left>
<!-- Fin de l'ent�te -->})dnl
dnl # D�claration de la 3i�me macro
define({LYNX_PIED},{<!-- D�but du pied de page -->
</TBODY>
</TABLE>
<HR size="0" noshadow>
<FONT SIZE=-2>
<EM>_MAINTENEUR_.<BR>
_MAJ_
esyscmd(date +%d/%m/%y)
- &copy <A HREF="mailto:[email protected]">
lynx.browser.org</A>
_ANNEE_</EM></FONT>
</BODY>
</HTML>
<!-- Fin du pied de page -->})dnl
 

Description

Les lignes comprises entre "divert(-1)" et "divert(0)" sont des commentaires. "Divert" est une des macros pr�d�finies du processeur m4 qui permet de retarder les r�sultats d'interpr�tations du fichier d'entr�e. En utilisant -1, les lignes qui suivent ne sont pas retranscrites dans le fichier HTML d�finitif, ce qui est bien le r�sultat recherch�.

La macro "changequote" permet de red�finir les apostrophes qui permettent d'encadrer les arguments des macros par d�faut. Ici elles sont remplac�es par des accolades car dans la plupart des textes en fran�ais, les apostrophes appara�ssent r�guli�rement et faussent l'interpr�tation des macros. Les accolades sont moins utilis�es pour du texte ou du HTML c'est pourquoi elles ont �t� choisies ici.

La macro "ifdef" permet de tester si la macro LANG est d�finie ce qui permet de la d�finir comme "fr" si elle n'existe pas. La macro LANG permet de pr�ciser la langue utilis�e. Nous verrons par la suite qu'elle sera d�finie lors de l'appel au macro-processeur m4 afin de choisir en quelle langue construire la page HTML.

La ligne "include" � le m�me sens qu'en C et permet d'inclure un fichier externe. Ici il s'agit du fichier de traduction qui contient des d�finitions propres � chaque langue. Voici son contenu en fonction de la langue:

  
divert(-1)
# Fichier trans-fr.m4
# D�finitions pour le fran�ais
divert(0)
define({_ANGLAIS_},{Anglais})dnl
define({_FRANCAIS_},{Fran�ais})dnl
define({_ITALIEN_},{Espagnol})dnl
define({_ESPAGNOL_},{Italien})dnl
define({_ALLEMAND_},{Allemand})dnl
define({_WEBMASTER_},{John Perr})dnl
define({_MAINTENEUR_},{Page maintenue par _WEBMASTER_})dnl 
define({_MAJ_},{Date de mise à jour:})dnl
  
divert(-1)
# Fichier trans-en.m4
# D�finitions pour l'anglais
divert(0)
define({_ANGLAIS_},{English})dnl
define({_FRANCAIS_},{French})dnl
define({_ITALIEN_},{Spanish})dnl
define({_ESPAGNOL_},{Italian})dnl
define({_ALLEMAND_},{German})dnl
define({_WEBMASTER_},{John Perr})dnl
define({_MAINTENEUR_},{Page maintained by _WEBMASTER_})dnl
define({_MAJ_},{Page updated on })dnl

Si vous parlez Espagnol, Italien ou Allemand, vous pourrez sans difficult� cr�er les fichiers pour ces langues � partir des deux exemples ci-dessus.

La ligne "undefine" supprime la d�finition par d�faut de la macro pr�d�finie de m4 qui s'appelle "format" car elle n'est pas utilis�e ici. Si cette ligne est omise, chaque apparition du mot "format" dans le texte sera supprim� � moins de l'encadrer par des accolades ce qui est contraignant pour r�diger une simple page web.

Vient ensuite la d�finition de l'ann�e courante � partir de la macro "easyscmd" qui appelle la commande syst�me "date". On retrouve cette commande dans la d�finition du pied de page pour afficher la date de mise � jour de la page.

La ligne suivante d�finie la premi�re de nos trois macros principales: LYNX_TITRE. C'est en fait une macro qui en d�finie une autre appel�e _TITRE_. Cette fa�on de faire permet d'utiliser si n�cessaire plusieurs fois le titre dans l'ent�te ou le pied de page � partir d'une d�claration. Notez l'utilisation du symbole $1 pour appeler le premier argument de la macro.

Les lignes restantes d�finissent les deux autres macros principales: LYNX_ENTETE et LYNX_PIED qui correspondent respectivement au contenu de l'ent�te et du pied de notre page HTML � quelques d�tails pr�s. Les diff�rences concernent les �l�ments variables de ces parties de la page, � savoir:

Le "dnl" qui apparait � la fin de chaque ligne est une macro pr�d�finie de m4 qui permet de ne pas prendre en compte le reste de la ligne et �vite aussi la cr�ation d'une ligne blanche dans le fichier de sortie lors de l'interpr�tation d'une ligne de macro.

 

Cr�ation des pages

L'ensemble du dispositif �tant en place, la g�n�ration d'une page html � partir du fichier de base contenant le corps du texte se fait part la commande:

O� "XX" est le code de la langue � utiliser.Si aucune langue n'est sp�cifi�e, le fran�ais est utilis� soit "XX=fr". Notez que l'option -D permet, tout comme avec gcc, de d�finir une macro depuis la ligne de commande.

 

R�capitulatif

Le tableau ci-dessous r�sume l'ensemble des fichiers utilis�s et leur fonctions dans le cadre de cette application.

Les fichiers suivants servent � la g�n�rations des pages HTML:
index-XX.html Le corps de article, c'est � dire le texte �crit par l'auteur ou le traducteur. Il est different pour chaque article et chaque langue. (le code XX=en pour l'anglais, es pour l'espagnol, etc...)
mac.css Les d�finitions standards pour tous les groupes. Ce fichier est commun � toutes les pages et toutes les langues. Il peut �tre vu comme un mod�le ou une feuille de style.
trans-XX.m4 Les d�finitions standards pour une langue (le code XX=en pour l'anglais, es pour l'espagnol, etc...). Ce fichier est commun � toutes les pages et une langue.
 

Conclusion

Bien qu'il soit puissant, le macro processeur m4 n'est qu'un processeur de macros commandes et ne saurait �tre compar� � un langage de programmation de script comme perl ou tcl. Une fois ses quelques particularit�s maîtris�es, il reste quand m�me un outils rapide et pratique tel que seul le monde Unix � su en cr�er. Pour en savoir plus, consulter la documentation fournie avec votre distribution. Il y figure en particulier un didacticiel � m4 d'une trentaine de pages qui couvre tous les aspects de son utilisation. Vous pouvez aussi consulter � titre d'exemple le site de l'Association Bordelaise des Utilisateurs Linux qui est maintenu avec un jeu de macros similaires � celles pr�sent�es ici.


Site Web maintenu par l´équipe d´édition LinuxFocus
© John Perr
LinuxFocus 1999

1999-08-23, generated by lfparser version 0.6