From b67993a16b71ab6f43ea32f7fc8f8e5447a00f05 Mon Sep 17 00:00:00 2001 From: Daniel Fernandes Martins Date: Sun, 30 Jan 2011 17:43:26 -0200 Subject: Added syntatic support for empty (self-closing) tags. Ex: input/#id.class type=text => --- zencoding-mode.el | 55 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 23 deletions(-) (limited to 'zencoding-mode.el') diff --git a/zencoding-mode.el b/zencoding-mode.el index 48d7d9d..b8af1b6 100644 --- a/zencoding-mode.el +++ b/zencoding-mode.el @@ -138,12 +138,12 @@ (defun zencoding-tag (input) "Parse a tag." (zencoding-run zencoding-tagname - (let ((result it) - (tagname (cdr expr))) + (let ((tagname (cadr expr)) + (has-body? (cddr expr))) (zencoding-pif (zencoding-run zencoding-identifier (zencoding-tag-classes - `(tag ,tagname ((id ,(cddr expr)))) input) - (zencoding-tag-classes `(tag ,tagname ()) input)) + `(tag (,tagname . ,has-body?) ((id ,(cddr expr)))) input) + (zencoding-tag-classes `(tag (,tagname . ,has-body?) ()) input)) (let ((expr-and-input it) (expr (car it)) (input (cdr it))) (zencoding-pif (zencoding-tag-props expr input) it @@ -192,8 +192,13 @@ (defun zencoding-tagname (input) "Parse a tagname a-zA-Z0-9 tagname (e.g. html/head/xsl:if/br)." - (zencoding-parse "\\([a-zA-Z][a-zA-Z0-9:-]*\\)" 2 "tagname, a-zA-Z0-9" - `((tagname . ,(elt it 1)) . ,input))) + (zencoding-parse "\\([a-zA-Z][a-zA-Z0-9:-]*\/?\\)" 2 "tagname, a-zA-Z0-9" + (let* ((tag-spec (elt it 1)) + (empty-tag (zencoding-regex "\\([^\/]*\\)\/" tag-spec 1)) + (tag (if empty-tag + (car empty-tag) + tag-spec))) + `((tagname . (,tag . ,(not empty-tag))) . ,input)))) (defun zencoding-pexpr (input) "A zen coding expression with parentheses around it." @@ -283,11 +288,6 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Zen coding transformer from AST to HTML -;; Fix-me: make mode specific -(defvar zencoding-single-tags - '("br" - "img")) - (defvar zencoding-inline-tags '("a" "abbr" @@ -316,7 +316,8 @@ Zencoding AST.") (defun zencoding-make-tag (tag &optional content) - (let* ((name (car tag)) + (let* ((name (caar tag)) + (has-body? (cdar tag)) (lf (if (or (member name zencoding-block-tags) @@ -325,21 +326,20 @@ (not (member name zencoding-inline-tags)) )) "\n" "")) - (single (member name zencoding-single-tags)) - (props (apply 'concat (mapcar - (lambda (prop) - (concat " " (symbol-name (car prop)) - "=\"" (cadr prop) "\"")) - (cadr tag))))) - (concat lf "<" name props ">" lf - (if single - "" - (concat + (props (apply 'concat (mapcar + (lambda (prop) + (concat " " (symbol-name (car prop)) + "=\"" (cadr prop) "\"")) + (cadr tag))))) + (concat lf "<" name props + (if has-body? + (concat ">" (if content content (if zencoding-leaf-function (funcall zencoding-leaf-function) "")) - lf ""))))) + lf "") + (concat "/>"))))) (defun zencoding-transform (ast) (let ((type (car ast))) @@ -366,6 +366,11 @@ ("a.x" "") ("a#q.x" "") ("a#q.x.y.z" "") + ;; Empty tags + ("a/" "") + ("a/.x" "") + ("a/#q.x" "") + ("a/#q.x.y.z" "") ;; Siblings ("a+b" "") ("a+b+c" "") @@ -385,16 +390,20 @@ ;; Multiplication ("a*1" "") ("a*2" "") + ("a/*2" "") ("a*2+b*2" "") ("a*2>b*2" "") ("a>b*2" "") ("a#q.x>b#q.x*2" "") + ("a#q.x>b/#q.x*2" "") ;; Properties ("a x=y" "") ("a x=y m=l" "") + ("a/ x=y m=l" "") ("a#foo x=y m=l" "") ("a.foo x=y m=l" "") ("a#foo.bar.mu x=y m=l" "") + ("a/#foo.bar.mu x=y m=l" "") ("a x=y+b" "") ("a x=y+b x=y" "") ("a x=y>b" "") -- cgit v1.2.3