Htmlc Fichier créé le 20 février 2000.
Htmlc
: un générateur de fichiers HTML
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.
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.
<!--#include virtual="nom du fichier à inclure"-->où «
nom du fichier à inclure
» est le nom du fichier
contenant le texte à inclure.
-I nom_de_répertoire
qui ajoute
nom_de_répertoire
à la liste des répertoires où chercher
les fichiers à inclure.
<
devient
<
dans le texte inclus, et sera de la sorte
correctement compris par le navigateur).<!--#include verbatim="nom du fichier à inclure"-->où «
nom du fichier à inclure
» est le nom du fichier
contenant le texte à inclure.
<!--#echo var="LAST_MODIFIED"-->et cette remarque est remplacée dans le fichier par la date en clair de la dernière modification du fichier.
htmlc
tente de déterminer le langage utilisé par le fichier source afin
d'inclure la date dans la langue du fichier source (et non pas
systématiquement en anglais). La langue est déterminée d'après le nom
du fichier traité. Les règles utilisées sont les suivantes:
nompropre-lang.extension
(ou bien
nompropre.lang.extension
), où
nompropre
est une suite de lettres (le nom
particulier du fichier),
-
ou d'un caractère
.
,
lang
de deux ou
trois lettres,
.
,
extension
(en général
html
).
lang
du nom du
fichier, qui est interprétée comme le fait Internet pour les noms de
pays. Si cette interprétation échoue, la langue du fichier
est supposée être l'anglais.
lang
n'existe pas, mais que
l'extension existe, on tente d'interpréter le nompropre
comme l'indication de langue.
htmlc
les seules langues
reconnues sont le français et l'anglais.
htmlc-fra.html
a pour indication de langue
fra
, comprise comme fr
;
htmlc-fra.html
est donc supposé
être un document écrit en français. De même pour
htmlc.fra.html
ou fra.html
ou
fr.html
ou même fr.ml
.
<
et >
,
ce texte est remplacé par la valeur de la variable d'environnement
citée. Ainsi
Mon nom est <\$USER> et mon répertoire principal a pour adresse <\$HOME>.
Mon nom est <$USER> et mon répertoire principal a pour adresse <$HOME>.
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.htmlexpanse 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.htmlexpanse le fichier
foo.html
en utilisant l'anglais comme
langue par défaut.
-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>
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:
.html
,
.htm
.
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:
SRC/Makefile
gère l'expansion de
l'ensemble des fichiers sources en les fichiers objets correspondants.WEB/Makefile
recopie les fichiers
expansés du répertoire SRC
dans le répertoire WEB
.
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
.
SRC
FILES=htmlc-fra.html htmlc-eng.html HTMLC=htmlc -I Includes OBJS=\$(FILES:.html=.htm) all: \$(OBJS) clean: /bin/rm -f \$(OBJS) .SUFFIXES: .SUFFIXES: .htm .html .html.htm: \$(HTMLC) -f \$< -t \$@
FILES
pour y mettre la liste des fichiers source (la
liste donnée ici correspond à la propre documentation de Htmlc
).
WEB
(ce fichier est disponible en ligne)
SRC=../doc_src FILES=htmlc-fra.htm htmlc-eng.htm AUTO=.Makefile.auto all: \$(AUTO) expand \$(FILES) expand: cd \$(SRC); make clean: \$(AUTO) cd \$(SRC); make clean /bin/rm -f \$(FILES) \$(AUTO): Makefile \$(AUTO): /bin/rm -f \$(AUTO) for i in \$(FILES); do \ j=`basename \$\$i .htm`; \ echo \$\$i: \$(SRC)/\$\$j.htm >> \$(AUTO); \ echo >> \$(AUTO); \ echo \$(SRC)/\$\$j.htm: >> \$(AUTO); \ echo -n " chmod +w \$\$j.htm; " >> \$(AUTO); \ echo "cp -p \$(SRC)/\$\$j.htm \$\$j.htm" >> \$(AUTO); \ done include \$(AUTO)
SRC
et FILES
pour y mettre respectivement
l'adresse du répertoire des sources et la liste des fichiers objets
désirés. La méthode de construction consiste à copier les fichiers du
répertoire \$(SRC)
dans le répertoire des objets. Pour
cela le Makefile fabrique l'ensemble des règles de copie correspondant
aux fichiers à créer. Ces règles sont alors incluses automatiquement
par la dernière ligne du fichier. Cela explique pourquoi, il faut
initialiser le processus lors de l'installation de ce Makefile, en
tapant
touch .Makefile.auto make allce qui crée le fichier de règles vide
.Makefile.auto
et
permet ensuite de lancer le Makefile pour créer les règles
nécessaires avant de compiler les fichiers.
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.
<!--#include virtual="doctype" -->ce qui ordonne l'inclusion du texte du fichier
doctype
dans 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>
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>
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 -> int = <fun>
<!--#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"-->
avanttitre-fra.html
contient:
<!--#include virtual="doctype" --> <!-- Fichier avanttitre-fra.html inclus avant le titre de la page --> <HTML> <HEAD> <TITLE>
aprestitre-fra.html
contient:
<!-- Fichier aprestitre-fra.html inclus après le titre de la page --> </TITLE> </HEAD> <BODY BGCOLOR="#FFFFFF"> <!--#include virtual="hautdepage-fra.html"-->
findepage-fra.html
contient:
<!-- Fichier findepage-fra.html inclus à la dernière ligne de la page --> <P> <HR> <EM>Dernière modification: </EM> <!--#echo var="LAST_MODIFIED" --> </BODY> </HTML>
hautdepage-fra.html
contient:
<ADDRESS>Contacter l'auteur <A HREF="mailto:Pierre.Weis@inria.fr">Pierre.Weis@inria.fr</A></ADDRESS>
doctype
et
findepage-fra.html
ont le même contenu que ci-dessus
<!--#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>
<!--#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: \$HtmlcVersionOn obtient
Voilà la version: $HtmlcVersionHtmlc is a $Htmlc!