Commit d460f937 authored by Robert Strandh's avatar Robert Strandh

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.
parent 7fd918b0
<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 @@ construit il y a plus de 20 ans maintenant, et les choix techniques de
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>
......
......@@ -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 (html-nonterminal)
((contents :initarg :contents)))
(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) (syntax html-syntax) pane)
(with-slots (contents) entity
(display-parse-tree contents syntax pane)))
(define-list $inlines $inline)
;;;;;;;;;;;;;;; %flow
(defclass inline-element-or-text (html-nonterminal)
(defclass $flow (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 ($flow -> ($inline) :contents $inline))
(add-html-rule ($flow -> (block-level-element) :contents block-level-element))
(defmethod display-parse-tree ((entity inline-element-or-text) (syntax html-syntax) pane)
(defmethod display-parse-tree ((entity $flow) (syntax html-syntax) pane)
(with-slots (contents) entity
(display-parse-tree contents syntax pane)))
(define-list inline-things inline-element-or-text)
(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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment