Update of /project/climacs/cvsroot/climacs In directory common-lisp.net:/tmp/cvs-serv21479
Modified Files: climacs.html html-syntax.lisp Log Message: Improvements to HTML syntax:
* defined a macro for creating nonempty lists
* the UL element now contains a nonempty list of LI elements
* the LI element can contain ordinary text as is allowed by the spec
* the </LI> closing tag is now optional as is allowed by the spec
Several things still do not conform to the spec, in particular optional tags for some elements.
Modified climacs.html to take advantage of these improvements.
Date: Mon Apr 11 07:28:51 2005 Author: rstrandh
Index: climacs/climacs.html diff -u climacs/climacs.html:1.5 climacs/climacs.html:1.6 --- climacs/climacs.html:1.5 Fri Apr 8 16:36:59 2005 +++ climacs/climacs.html Mon Apr 11 07:28:51 2005 @@ -1,4 +1,5 @@ -<HTML><HEAD><TITLE>Climacs, une version moderne de l'éditeur Emacs</TITLE></HEAD> +<HTML lang=fr> +<HEAD><TITLE>Climacs, une version moderne de l'éditeur Emacs</TITLE></HEAD>
<BODY>
@@ -12,36 +13,36 @@ l'époque posent quelques problèmes aujourd'hui :</p>
<ul> -<li><p>Emacs Lisp est un langage spécialement conçu pour implémenter +<li>Emacs Lisp est un langage spécialement conçu pour implémenter Emacs. Depuis la conception de GNU Emacs et du langage Emacs LIsp, Common Lisp a été normalisé et propose à la fois une efficacité bien supérieure à celle de Emacs Lisp (car Emacs Lisp est implémenté sous la forme d'un interpréteur écrit en C) et des fonctionnalités plus sophistiqués (macros, CLOS, etc). Le choix naturelle pour implémenter Emacs aujourd'hui est donc Common - Lisp.</p></li> + Lisp.</li>
-<li><p>GNU Emacs a été conçu avant l'existence de la norme +<li>GNU Emacs a été conçu avant l'existence de la norme Unicode. Malheureusement, la représentation interne d'un tampon (buffer) permet difficilement de représenter des caractères Unicode de manière compacte et efficace. Une représentation interne permettant à la fois l'ensemble des caractères Unicode et une représentation compacte du sous ensemble - ISO-latin-1 est souhaitable.</p></li> + ISO-latin-1 est souhaitable.</li>
-<li><p>Il y a 20 ans, les interfaces graphiques n'existait pratiquement +<li>Il y a 20 ans, les interfaces graphiques n'existait pratiquement pas. GNU Emacs a été conçu pour un terminal texte. D'autres modes d'interaction sont possibles aujourd'hui. En particulier, avec CLIM (Common Lisp Interface Manager) une interface basée sur la notion de "types de présentation" est à la - fois possible et souhaitable. </p></li> + fois possible et souhaitable. </li>
-<li><p>Pour des raisons de la performance limitée des ordinateurs de +<li>Pour des raisons de la performance limitée des ordinateurs de l'époque, GNU Emacs se sert d'un certain nombre d'approximations pour analyser le contenu d'un tampon, en particulier lorsque ce contenu est un programme. Ces approximations n'ont plus raison d'être, et avec la technologie d'aujourd'hui, il est possible de - maintenir un analyseur syntaxique incrémental et complet.</p></li> + maintenir un analyseur syntaxique incrémental et complet.</li>
</ul>
Index: climacs/html-syntax.lisp diff -u climacs/html-syntax.lisp:1.26 climacs/html-syntax.lisp:1.27 --- climacs/html-syntax.lisp:1.26 Fri Apr 8 16:36:59 2005 +++ climacs/html-syntax.lisp Mon Apr 11 07:28:51 2005 @@ -134,7 +134,36 @@
(add-html-rule (,name -> (,name ,item-name) (make-instance ',nonempty-name - :items ,name :item ,item-name))) + :items ,name :item ,item-name))) + + (defmethod display-parse-tree ((entity ,empty-name) (syntax html-syntax) pane) + (declare (ignore pane)) + nil) + + (defmethod display-parse-tree ((entity ,nonempty-name) (syntax html-syntax) pane) + (with-slots (items item) entity + (display-parse-tree items syntax pane) + (display-parse-tree item syntax pane)))))) + +(defmacro define-nonempty-list (name item-name) + (let ((empty-name (gensym)) + (nonempty-name (gensym))) + `(progn + (defclass ,name (html-nonterminal) ()) + (defclass ,empty-name (,name) ()) + + (defclass ,nonempty-name (,name) + ((items :initarg :items) + (item :initarg :item))) + + (add-html-rule (,name -> (,item-name) + (make-instance ',nonempty-name + :items (make-instance ',empty-name) + :item ,item-name))) + + (add-html-rule (,name -> (,name ,item-name) + (make-instance ',nonempty-name + :items ,name :item ,item-name)))
(defmethod display-parse-tree ((entity ,empty-name) (syntax html-syntax) pane) (declare (ignore pane)) @@ -274,20 +303,34 @@ (defclass inline-element (html-nonterminal) ()) (defclass block-level-element (html-nonterminal) ())
-;;;;;;;;;;;;;;; inline-element-or-text +;;;;;;;;;;;;;;; %inline
-(defclass inline-element-or-text (html-nonterminal) +(defclass $inline (html-nonterminal) ((contents :initarg :contents)))
-(add-html-rule (inline-element-or-text -> (inline-element) :contents inline-element)) -(add-html-rule (inline-element-or-text -> (word) :contents word)) -(add-html-rule (inline-element-or-text -> (delimiter) :contents delimiter)) +(add-html-rule ($inline -> (inline-element) :contents inline-element)) +(add-html-rule ($inline -> (word) :contents word)) +(add-html-rule ($inline -> (delimiter) :contents delimiter))
-(defmethod display-parse-tree ((entity inline-element-or-text) (syntax html-syntax) pane) +(defmethod display-parse-tree ((entity $inline) (syntax html-syntax) pane) (with-slots (contents) entity (display-parse-tree contents syntax pane)))
-(define-list inline-things inline-element-or-text) +(define-list $inlines $inline) + +;;;;;;;;;;;;;;; %flow + +(defclass $flow (html-nonterminal) + ((contents :initarg :contents))) + +(add-html-rule ($flow -> ($inline) :contents $inline)) +(add-html-rule ($flow -> (block-level-element) :contents block-level-element)) + +(defmethod display-parse-tree ((entity $flow) (syntax html-syntax) pane) + (with-slots (contents) entity + (display-parse-tree contents syntax pane))) + +(define-list $flows $flow)
;;;;;;;;;;;;;;; headings
@@ -310,8 +353,8 @@ (defclass ,class-name (heading) ())
(add-html-rule - (,class-name -> (,start-tag-name inline-things ,end-tag-name) - :start ,start-tag-name :contents inline-things :end ,end-tag-name)))) + (,class-name -> (,start-tag-name $inlines ,end-tag-name) + :start ,start-tag-name :contents $inlines :end ,end-tag-name))))
(define-heading h1 "h1" <h1> </h1>) @@ -361,8 +404,8 @@ (items :initarg :items) (</a> :initarg :</a>)))
-(add-html-rule (a-element -> (<a> inline-things </a>) - :<a> <a> :items inline-things :</a> </a>)) +(add-html-rule (a-element -> (<a> $inlines </a>) + :<a> <a> :items $inlines :</a> </a>))
(defmethod display-parse-tree ((entity a-element) (syntax html-syntax) pane) (with-slots (<a> items </a>) entity @@ -400,8 +443,8 @@ (contents :initarg :contents) (</p> :initarg :</p>)))
-(add-html-rule (p-element -> (<p> inline-things </p>) - :<p> <p> :contents inline-things :</p> </p>)) +(add-html-rule (p-element -> (<p> $inlines </p>) + :<p> <p> :contents $inlines :</p> </p>))
(defmethod display-parse-tree ((entity p-element) (syntax html-syntax) pane) (with-slots (<p> contents </p>) entity @@ -436,32 +479,22 @@
(define-end-tag </li> "li")
-(defclass li-item (html-nonterminal) - ((item :initarg :item))) - -(add-html-rule (li-item -> (block-level-element) :item block-level-element)) -(add-html-rule (li-item -> (inline-element) :item inline-element)) - -(defmethod display-parse-tree ((entity li-item) (syntax html-syntax) pane) - (with-slots (item) entity - (display-parse-tree item syntax pane))) - -(define-list li-items li-item) - (defclass li-element (html-nonterminal) ((<li> :initarg :<li>) (items :initarg :items) (</li> :initarg :</li>)))
-(add-html-rule (li-element -> (<li> li-items </li>) - :<li> <li> :items li-items :</li> </li>)) +(add-html-rule (li-element -> (<li> $flows </li>) + :<li> <li> :items $flows :</li> </li>)) +(add-html-rule (li-element -> (<li> $flows) + :<li> <li> :items $flows :</li> nil))
(defmethod display-parse-tree ((entity li-element) (syntax html-syntax) pane) (with-slots (<li> items </li>) entity (display-parse-tree <li> syntax pane) (display-parse-tree items syntax pane) - (display-parse-tree </li> syntax pane))) - + (when </li> + (display-parse-tree </li> syntax pane))))
;;;;;;;;;;;;;;; ul element
@@ -490,7 +523,7 @@
(define-end-tag </ul> "ul")
-(define-list li-elements li-element) +(define-nonempty-list li-elements li-element)
(defclass ul-element (block-level-element) ((<ul> :initarg :<ul>) @@ -511,8 +544,6 @@ (defclass body-item (html-nonterminal) ((item :initarg :item)))
-(add-html-rule (body-item -> (word) :item word)) -(add-html-rule (body-item -> (delimiter) :item delimiter)) (add-html-rule (body-item -> ((element block-level-element)) :item element))
(defmethod display-parse-tree ((entity body-item) (syntax html-syntax) pane)