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)