[climacs-cvs] CVS update: climacs/climacs.html climacs/html-syntax.lisp

Robert Strandh rstrandh at common-lisp.net
Mon Apr 11 05:28:52 UTC 2005


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)




More information about the Climacs-cvs mailing list