Si vous vous demandez comment générer des fichiers en Lisp, c’est par ici…
Disclaimer: Ce n’est pas un script prévu pour générer du html strict, mais plutôt un exemple sur les flux de fichiers en Lisp.
PARTIE 1 : Code Lisp
Ma fonction est divisée en une fonction principale + une sous-fonction:
Fonction principale: htmlwrite
(defun htmlwrite (code-html *file*)
"ouvre un filestream *filestream* a partir du chemin de fichier *file*"
(with-open-file
(*filestream* *file* :direction :output :if-exists :supersede)
(htmlout code-html *filestream*)));; envoi la liste dans le fichier de sortie
Sous-fonction: htmlout
(defun htmlout (liste_html *sortie*)
"Envoi dans *sortie* le contenu d'une liste de type HTML"
(if (listp liste_html)
(if (eq 1 (length liste_html))
(if (member 'br liste_html)
(format *sortie* "<~a />~%" (car liste_html))
(if (listp (car liste_html))
(htmlout (car liste_html) *sortie*) (format *sortie* "~a~%" (car liste_html))))
(if (not (listp (car liste_html)))
(progn
(format *sortie* "<~a>~%" (car liste_html))
(htmlout (cdr liste_html) *sortie*)
(format *sortie* "</~a>~%" (car liste_html)))
(progn
(htmlout (car liste_html) *sortie*)
(htmlout (cdr liste_html) *sortie*))))
(format *sortie* "~a~%" (car liste_html))))
Commentaire:
(htmlout ‘(a b c d) t) : Notez que si on met t comme deuxième argument, le code s’affichera dans la console, exactement comme le ferait la fonction (format t).
On peut donc tout à fait mettre un “file stream” (voir manuel lisp).
PARTIE 2: Utilisation
Il faut d’abord définir le fichier à ouvrir et/ou à créer :
(defparameter *monfichier*
(make-pathname :directory (list :absolute "tmp")
:name "index3"
:type "html"))
;; '--> cet exemple correspond à un chemin vers "/tmp/index3.html"
;; Lancez htmlwrite avec comme premier argument une liste valide du type:
(a (b c))
par exemple, la liste précédente afficherait:
<a>
<b>c</b>
</a>
N’oubliez pas comme deuxième argument votre *fichier* défini plus haut.
Exemple:
(htmlwrite
'(html
(head title "welcome")
(body
(br)
(h1 "Introduction...")
(p
("blahblahblah")
(strong "message en gras")
("fin du blah blah")
)
(br)
(h2 "Test de balise br:")
(p
("Ceci est un essai") (br)
("pour essayer la fonction htmlwrite") (br)
("avec des balises de retour de ligne.") (br)
)
(br)
) ;; </body>
) ;; </html>
*monfichier*)
Commentaire: ignorer le message “lisp stack overflow” qui peut apparaître, je crois que c’est juste l’historique des commandes CommonLisp qui se vide (ou pas)
Notez également que seule la balise auto fermante “<br />” est gérée dans ce script minimaliste (elle est gérée comme un cas particulier).
0 Responses to “Création d’une page html à partir d’une liste Lisp”
Leave a Reply