Htmlc Fichier créé le 20 février 2000.

Htmlc: un générateur de fichiers HTML

Où trouver le logiciel ?

Les sources d'Htmlc sont ici.

De quoi s'agit-il ?

On utilise htmlc pour produire des pages HTML dont certaines parties doivent être calculées à la demande (par exemple la date de dernière modification de la page) ou bien incluses systématiquement dans toutes les pages d'un site (par exemple une entête ou un pied de page). À partir d'un fichier source annoté, htmlc produit un fichier HTML parfaitement normal qui intègre les parties calculées du fichier source. htmlc vous offre ainsi le moyen de gérer un site WEB en définissant un ensemble de modèles de pages qui factorise une bonne fois pour toutes l'écriture des parties répétitives des pages HTML.

I Principe

Pour diriger la génération des pages HTML on utilise des directives pour htmlc; ces directives sont des commentaires HTML présents dans le fichier source HTML, et htmlc les exécute et écrit leur résultat dans le fichier de sortie.

Les directives pour htmlc ont la syntaxe des directives des serveurs Apache (lorsque les directives Apache correspondantes existent). htmlc est donc une sorte de compilateur des pages HTML servies par le serveur, puisque les macros sont complètement expansées dans les fichiers produits par htmlc. L'intérêt de cette pratique est évidemment que le serveur Apache n'a plus à faire dynamiquement l'analyse des fichiers qu'il sert à la recherche des directives: le travail est réalisé statiquement lors de la génération de la page. Avantage supplémentaire: on détecte les erreurs très tôt, pendant la phase d'expansion des directives, au lieu de découvrir ces erreurs lors du service des pages (ce qui est de toutes façons trop tard puisque la page erronée est déjà parvenue au client).

De plus, vos pages sources ne sont plus dépendantes des spécificités d'un serveur HTTP particulier qui comprenne et traite les directives des pages: les directives htmlc n'ont pas à être réécrites si vous changez votre serveur ou sa configuration.

Bien plus, les pages produites par htmlc sont aussi complètement indépendantes d'un serveur HTTP: elle peuvent être consultées sans serveur. C'est une propriété généralement souhaitable, mais bien entendu indispensable dès qu'il s'agit de produire un site WEB consultable localement, en dehors de tout accès réseau. Par exemple, un site dont les pages sont expansées par htmlc est directement utilisable sur CD-ROM, ses pages sont lisibles par tout navigateur, sans nécessiter l'installation d'un serveur HTTP sur l'ordinateur de l'utilisateur.

II Comment s'en servir ?

Lors de l'écriture des pages HTML
Lors de la génération des pages HTML définitives
htmlc offre la possibilité de fixer la langue utilisée pour l'expansion des fichiers: le mécanisme de recherche de la langue par détection des suffix dans les noms de fichiers n'est alors plus utilisé et c'est la langue spécifiée en ligne de commande qui prévaut. Par exemple
htmlc -lang fr foo.html
expanse le fichier foo.html en utilisant le français.
htmlc permet aussi de fixer la langue par défaut (celle qui est utilisée si aucune règle de suffixe ne s'applique). Par exemple
htmlc -default-lang uk foo.html
expanse le fichier foo.html en utilisant l'anglais comme langue par défaut.
Le générateur de pages HTML est une commande qui traite les noms de fichiers donnés en argument sur sa ligne de commande, expansant les directives qu'ils contiennent. Par défaut le résultat est écrit sur la sortie standard. On précise le fichier de sortie à l'aide de l'option -t (ou -to) suivie du nom du fichier de sortie. On précise le fichier d'entrée à l'aide de l'option -f (ou -from) suivie du nom du fichier d'entrée.
Usage: htmlc [-I] [include-dir] <source> <destination>
or htmlc <source>
or htmlc [-i|-f|-from] <source> [-o|-t|-to] <destination>

III Comment utiliser htmlc pour gérer un grand nombre de fichiers ?

La méthode la plus simple est de bien distinguer entre les sources des fichiers HTML et les objets: les sources sont les fichiers non expansés (ceux qu'on édite), et les objets sont les fichiers expansés (ceux qu'on n'édite pas et qui sont produits automatiquement par htmlc).

On adopte les conventions suivantes:

Les fichiers objets seront placés dans un répertoire accessible au serveur HTTP (quelquefois appelé aussi serveur WEB), nommons-le répertoire WEB, puisque ce sont précisément ces fichiers que le serveur HTTP enverra sur le réseau. En revanche les fichiers sources seront placés dans un répertoire gérés par les éditeurs du site, nommons-le répertoire SRC, qui sera sans doute inaccessible au serveur WEB.

La méthode préconisée consiste à utiliser deux Makefiles pour gérer le site:

On remarque donc que le répertoire WEB ne comporte que les fichiers strictement nécessaires à la consultation des pages HTML, tandis que le répertoire SRC comporte à la fois les sources de ces pages et leurs objets. Le répertoire SRC comporte aussi un sous-répertoire pour les fichiers à inclure; on supposera dans la suite que ce répertoire s'appelle Includes, et la commande d'expansion des fichiers sources comportera donc systématiquement l'option -I Includes.

Discussion

Cette organisation en deux répertoires séparés présente de nombreux avantages: le site proprement dit ne comporte que les fichiers strictement nécessaires, les fichiers auxiliaires ne se trouvant que dans le répertoire SRC; en outre les modifications apportées au site ne sont pas immédiatement effectives et visibles de l'ensemble des lecteurs du site Web: on peut modifier les pages sources et même les expanser et les examiner à loisir sans troubler les utilisateurs du site; après toutes les vérifications utiles, une simple commande make exécutée dans le répertoire WEB publie ces modifications en les rendant accessibles au server WEB.

Cette organisation s'est révélée extrêmement efficace pour l'écriture et le développement de l'ensemble des pages HTML de la FAQ du langage Caml.

IV Exemples

Inclusion d'entêtes
Pour inclure systématiquement le type du document, on écrira en première ligne de chaque fichier:
  <!--#include virtual="doctype" -->
  
ce qui ordonne l'inclusion du texte du fichier doctype dans le fichier.
Si le fichier doctype contient:
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
   "http://www.w3.org/TR/REC-html40/loose.dtd">
  
alors le fichier
  <!--#include virtual="doctype" -->

  <HTML>

  <HEAD>
  <TITLE>Foire aux questions au sujet de Caml</TITLE>
  </HEAD>
  
devient
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
   "http://www.w3.org/TR/REC-html40/loose.dtd">

  <HTML>

  <HEAD>
  <TITLE>Foire aux questions au sujet de Caml</TITLE>
  </HEAD>
  
Inclusion d'un pied de page
Pour inclure dans une page HTML, un pied de page défini une fois pour toutes dans le fichier basdepage-fra.html, il suffit d'écrire, la ligne:
  <!--#include virtual="basdepage-fra.html"-->
  
Alors, si le fichier basdepage-fra.html contient:
   <P>
   <HR>
   <EM>Dernière modification: </EM>
   <!--#echo var="LAST_MODIFIED" -->
   <BR>
   <A HREF="copyright-fra.html">Copyright</A>
   © 1997 - 2003 INRIA, tous droits réservés.
  
le fichier source
  <!--#include virtual="basdepage-fra.html"-->

  </BODY>
  </HTML>
  
est transformé par htmlc en:
   <P>
   <HR>
   <EM>Dernière modification: </EM>
   <!--#echo var="LAST_MODIFIED" -->
   mardi 15 février 2003
   <BR>
   <A HREF="copyright-fra.html">Copyright</A>
   © 1997 - 2003 INRIA, tous droits réservés.

  </BODY>
  </HTML>
  
Inclusion d'un programe
Pour inclure dans votre texte le programme Caml contenu dans le fichier exemple_caml.ml, il suffit d'écrire, la ligne:
  <!--#include verbatim="exemple_caml.ml"-->
  
Alors, si le fichier exemple_caml.ml contient:
   let succ x = x + 1;;
   succ : int -> int = <fun>
  
la ligne d'inclusion sera remplacé par:
   let succ x = x + 1;;
   succ : int -&gt; int = &lt;fun&gt;
  
Maquettes de pages HTML
Pour alléger l'écriture des pages d'un site WEB, on peut très bien définir un ensemble de maquettes comportant des inclusions prédéfinies.
Par exemple, le fichier maquette de trois lignes suivant, permet d'abstraire le type du document, son entête et son pied de page:
  <!--#include virtual="avanttitre-fra.html"-->

  <!--#include virtual="aprestitre-fra.html"-->


  <!--#include virtual="findepage-fra.html"-->
 
Le créateur des pages html n'a plus qu'à mettre le titre de la page entre les deux lignes d'inclusion pour obtenir un fichier HTML complet:
  <!--#include virtual="avanttitre-fra.html"-->
  L'expanseur <CODE>htmlc</CODE>
  <!--#include virtual="aprestitre-fra.html"-->

  <H2 ALIGN=LEFT>De quoi s'agit-il ?</H2>

  <P>On utilise ...

  <!--#include virtual="findepage-fra.html"-->
 

En effet, si l'on suppose que
Alors le fichier:
  <!--#include virtual="avanttitre-fra.html"-->
  L'expanseur <CODE>htmlc</CODE>
  <!--#include virtual="aprestitre-fra.html"-->

  <H2 ALIGN=LEFT>De quoi s'agit-il ?</H2>

  <P>On utilise ...

  <!--#include virtual="findepage-fra.html"-->
 
est expansé par htmlc en le fichier:
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
   "http://www.w3.org/TR/REC-html40/loose.dtd">
  <!-- Fichier avanttitre-fra.html inclus avant le titre de la page -->

  <HTML>

  <HEAD>
  <TITLE> 
  L'expanseur <CODE>htmlc</CODE>
  <!-- Fichier aprestitre-fra.html inclus après le titre de la page -->
  </TITLE> 
  </HEAD>

  <BODY BGCOLOR="#FFFFFF">

  <ADDRESS>Contacter l'auteur <A HREF="mailto:Pierre.Weis@inria.fr">Pierre.Weis@inria.fr</A></ADDRESS>
  
  <H2 ALIGN=LEFT>De quoi s'agit-il ?</H2>

  <P>On utilise ...

  <!-- Fichier findepage-fra.html inclus à la dernière ligne de la page -->
  <P>
  <HR>
  <EM>Dernière modification: </EM>
  <!--#echo var="LAST_MODIFIED" -->
  mardi 15 février 2003
  <BR>
  <A HREF="copyright-fra.html">Copyright</A>
  © 1997 - 2003 INRIA, tous droits réservés.

  </BODY>
  </HTML>
  
Nous définissons une variable spécifique à l'expansion de ce fichier:
 <!--#define \$HtmlcVersion="1.40"-->
La version de Htmlc est maintenant connue du compilateur. Par exemple
Voilà la version:
<!--#echo var="\$HtmlcVersion"-->.
donne
Voilà la version:
.
Mais cette méthode est trop compliquée, puisqu'il suffit en fait d'utiliser directement la variable HtmlcVersion dans le code HTML: Htmlc sait maintenant la remplacer par sa valeur. On écrit simplement
Voilà la version: \$HtmlcVersion
On obtient
Voilà la version: $HtmlcVersion
Htmlc is a $Htmlc!