Update of /project/climacs/cvsroot/climacs
In directory common-lisp.net:/tmp/cvs-serv17330
Modified Files:
html-syntax.lisp
Log Message:
<html> tag now accepts LANG and DIR attributes.
Date: Mon Apr 4 08:20:52 2005
Author: rstrandh
Index: climacs/html-syntax.lisp
diff -u climacs/html-syntax.lisp:1.20 climacs/html-syntax.lisp:1.21
--- climacs/html-syntax.lisp:1.20 Sun Mar 20 09:25:21 2005
+++ climacs/html-syntax.lisp Mon Apr 4 08:20:52 2005
@@ -82,6 +82,9 @@
(defparameter *html-grammar* (grammar))
+(defmacro add-html-rule (rule)
+ `(add-rule (grammar-rule ,rule) *html-grammar*))
+
(defun word-is (word string)
(string-equal (coerce (buffer-sequence (buffer word) (start-offset word) (end-offset word)) 'string)
string))
@@ -90,30 +93,27 @@
`(progn
(defclass ,name (html-tag) ())
- (add-rule (grammar-rule
- (,name -> (tag-start
- (word (and (= (end-offset tag-start) (start-offset word))
- (word-is word ,string)))
- (tag-end (= (end-offset word) (start-offset tag-end))))))
- *html-grammar*)))
+ (add-html-rule
+ (,name -> (tag-start
+ (word (and (= (end-offset tag-start) (start-offset word))
+ (word-is word ,string)))
+ (tag-end (= (end-offset word) (start-offset tag-end))))))))
(defmacro define-end-tag (name string)
`(progn
(defclass ,name (html-tag) ())
- (add-rule (grammar-rule
- (,name -> (tag-start
- (slash (= (end-offset tag-start) (start-offset slash)))
- (word (and (= (end-offset slash) (start-offset word))
- (word-is word ,string)))
- (tag-end (= (end-offset word) (start-offset tag-end))))))
- *html-grammar*)))
+ (add-html-rule
+ (,name -> (tag-start
+ (slash (= (end-offset tag-start) (start-offset slash)))
+ (word (and (= (end-offset slash) (start-offset word))
+ (word-is word ,string)))
+ (tag-end (= (end-offset word) (start-offset tag-end))))))))
(defmacro define-tag-pair (start-name end-name string)
`(progn (define-start-tag ,start-name ,string)
(define-end-tag ,end-name ,string)))
-(define-tag-pair <html> </html> "html")
(define-tag-pair <head> </head> "head")
(define-tag-pair <title> </title> "title")
(define-tag-pair <body> </body> "body")
@@ -133,14 +133,12 @@
((items :initarg :items)
(item :initarg :item)))
- (add-rule (grammar-rule (,name -> ()
- (make-instance ',empty-name)))
- *html-grammar*)
-
- (add-rule (grammar-rule (,name -> (,name ,item-name)
- (make-instance ',nonempty-name
- :items ,name :item ,item-name)))
- *html-grammar*)
+ (add-html-rule (,name -> ()
+ (make-instance ',empty-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))
@@ -151,13 +149,95 @@
(display-parse-tree items syntax pane)
(display-parse-tree item syntax pane)))))
+;;;;;;;;;;;;;;; attributes
+
+(defclass html-attribute (html-nonterminal)
+ ((name :initarg :name)
+ (equals :initarg :equals)))
+
+(defmethod display-parse-tree :before ((entity html-attribute) (syntax html-syntax) pane)
+ (with-slots (name equals) entity
+ (display-parse-tree name syntax pane)
+ (display-parse-tree equals syntax pane)))
+
+;;;;;;;;;;;;;;; lang attribute
+
+(defclass lang-attr (html-attribute)
+ ((lang :initarg :lang)))
+
+(add-html-rule (lang-attr -> ((name word (word-is name "lang"))
+ (equals delimiter (and (= (end-offset name) (start-offset equals))
+ (word-is equals "=")))
+ (lang word (and (= (end-offset equals) (start-offset lang))
+ (= (- (end-offset lang) (start-offset lang))
+ 2))))
+ :name name :equals equals :lang lang))
+
+(defmethod display-parse-tree ((entity lang-attr) (syntax html-syntax) pane)
+ (with-slots (lang) entity
+ (display-parse-tree lang syntax pane)))
+
+;;;;;;;;;;;;;;; dir attribute
+
+(defclass dir-attr (html-attribute)
+ ((dir :initarg :dir)))
+
+(add-html-rule (dir-attr -> ((name word (word-is name "dir"))
+ (equals delimiter (and (= (end-offset name) (start-offset equals))
+ (word-is equals "=")))
+ (dir word (and (= (end-offset equals) (start-offset dir))
+ (or (word-is dir "rtl")
+ (word-is dir "ltr")))))
+ :name name :equals equals :dir dir))
+
+(defmethod display-parse-tree ((entity dir-attr) (syntax html-syntax) pane)
+ (with-slots (dir) entity
+ (display-parse-tree dir syntax pane)))
+
+
+;;;;;;;;;;;;;;; <html>-tag
+
+(defclass <html>-attribute (html-nonterminal)
+ ((attribute :initarg :attribute)))
+
+(defmethod display-parse-tree ((entity <html>-attribute) (syntax html-syntax) pane)
+ (with-slots (attribute) entity
+ (display-parse-tree attribute syntax pane)))
+
+(add-html-rule (<html>-attribute -> (lang-attr) :attribute lang-attr))
+(add-html-rule (<html>-attribute -> (dir-attr) :attribute dir-attr))
+
+(define-list <html>-attributes empty-<html>-attribute nonempty-<html>-attribute <html>-attribute)
+
+(defclass <html> (html-tag)
+ ((start :initarg :start)
+ (name :initarg :name)
+ (attributes :initarg :attributes)
+ (end :initarg :end)))
+
+(add-html-rule (<html> -> (tag-start
+ (word (and (= (end-offset tag-start) (start-offset word))
+ (word-is word "html")))
+ <html>-attributes
+ tag-end)
+ :start tag-start :name word :attributes <html>-attributes :end tag-end))
+
+(defmethod display-parse-tree ((entity <html>) (syntax html-syntax) pane)
+ (with-slots (start name attributes end) entity
+ (display-parse-tree start syntax pane)
+ (display-parse-tree name syntax pane)
+ (display-parse-tree attributes syntax pane)
+ (display-parse-tree end syntax pane)))
+
+(define-end-tag </html> "html")
+
;;;;;;;;;;;;;;; title-item, title-items
(defclass title-item (html-nonterminal)
((item :initarg :item)))
-(add-rule (grammar-rule (title-item -> (word) :item word)) *html-grammar*)
-(add-rule (grammar-rule (title-item -> (delimiter) :item delimiter)) *html-grammar*)
+(add-html-rule (title-item -> (word) :item word))
+(add-html-rule (title-item -> (delimiter) :item delimiter))
(defmethod display-parse-tree ((entity title-item) (syntax html-syntax) pane)
(with-slots (item) entity
@@ -172,9 +252,8 @@
(items :initarg :items)
(</title> :initarg :</title>)))
-(add-rule (grammar-rule (title -> (<title> title-items </title>)
- :<title> <title> :items title-items :</title> </title>))
- *html-grammar*)
+(add-html-rule (title -> (<title> title-items </title>)
+ :<title> <title> :items title-items :</title> </title>))
(defmethod display-parse-tree ((entity title) (syntax html-syntax) pane)
(with-slots (<title> items </title>) entity
@@ -188,9 +267,9 @@
(defclass body-item (html-nonterminal)
((item :initarg :item)))
-(add-rule (grammar-rule (body-item -> (word) :item word)) *html-grammar*)
-(add-rule (grammar-rule (body-item -> (delimiter) :item delimiter)) *html-grammar*)
-(add-rule (grammar-rule (body-item -> (a) :item a)) *html-grammar*)
+(add-html-rule (body-item -> (word) :item word))
+(add-html-rule (body-item -> (delimiter) :item delimiter))
+(add-html-rule (body-item -> (a) :item a))
(defmethod display-parse-tree ((entity body-item) (syntax html-syntax) pane)
(with-slots (item) entity
@@ -205,9 +284,8 @@
(items :initarg :items)
(</body> :initarg :</body>)))
-(add-rule (grammar-rule (body -> (<body> body-items </body>)
- :<body> <body> :items body-items :</body> </body>))
- *html-grammar*)
+(add-html-rule (body -> (<body> body-items </body>)
+ :<body> <body> :items body-items :</body> </body>))
(defmethod display-parse-tree ((entity body) (syntax html-syntax) pane)
(with-slots (<body> items </body>) entity
@@ -220,8 +298,8 @@
(defclass a-tag-item (html-nonterminal)
((item :initarg :item)))
-(add-rule (grammar-rule (a-tag-item -> (word) :item word)) *html-grammar*)
-(add-rule (grammar-rule (a-tag-item -> (delimiter) :item delimiter)) *html-grammar*)
+(add-html-rule (a-tag-item -> (word) :item word))
+(add-html-rule (a-tag-item -> (delimiter) :item delimiter))
(defmethod display-parse-tree ((entity a-tag-item) (syntax html-syntax) pane)
(with-slots (item) entity
@@ -235,13 +313,12 @@
(items :initarg :items)
(end :initarg :end)))
-(add-rule (grammar-rule (<a> -> (tag-start
+(add-html-rule (<a> -> (tag-start
(word (and (= (end-offset tag-start) (start-offset word))
(word-is word "a")))
a-tag-items
tag-end)
- :start tag-start :name word :items a-tag-items :end tag-end))
- *html-grammar*)
+ :start tag-start :name word :items a-tag-items :end tag-end))
(defmethod display-parse-tree ((entity <a>) (syntax html-syntax) pane)
(with-slots (start name items end) entity
@@ -257,9 +334,8 @@
(items :initarg :items)
(</a> :initarg :</a>)))
-(add-rule (grammar-rule (a -> (<a> body-items </a>)
- :<a> <a> :items body-items :</a> </a>))
- *html-grammar*)
+(add-html-rule (a -> (<a> body-items </a>)
+ :<a> <a> :items body-items :</a> </a>))
(defmethod display-parse-tree ((entity a) (syntax html-syntax) pane)
(with-slots (<a> items </a>) entity
@@ -274,9 +350,8 @@
(title :initarg :title)
(</head> :initarg :</head>)))
-(add-rule (grammar-rule (head -> (<head> title </head>)
- :<head> <head> :title title :</head> </head>))
- *html-grammar*)
+(add-html-rule (head -> (<head> title </head>)
+ :<head> <head> :title title :</head> </head>))
(defmethod display-parse-tree ((entity head) (syntax html-syntax) pane)
(with-slots (<head> title </head>) entity
@@ -292,9 +367,8 @@
(body :initarg :body)
(</html> :initarg :</html>)))
-(add-rule (grammar-rule (html -> (<html> head body </html>)
- :<html> <html> :head head :body body :</html> </html>))
- *html-grammar*)
+(add-html-rule (html -> (<html> head body </html>)
+ :<html> <html> :head head :body body :</html> </html>))
(defmethod display-parse-tree ((entity html) (syntax html-syntax) pane)
(with-slots (<html> head body </html>) entity