From 07e277195a17d1768250b53a44aad5fdd292d32d Mon Sep 17 00:00:00 2001 From: Ron Panduwana Date: Sat, 19 Feb 2011 21:37:36 +0700 Subject: [PATCH] Added commented-html filter (|c) --- zencoding-mode.el | 121 ++++++++++++++++++++++++++++------------------ 1 file changed, 74 insertions(+), 47 deletions(-) diff --git a/zencoding-mode.el b/zencoding-mode.el index 0cbbb06..de61fbf 100644 --- a/zencoding-mode.el +++ b/zencoding-mode.el @@ -162,7 +162,7 @@ (let* ((file-ext (car (zencoding-regex ".*\\(\\..*\\)"(buffer-file-name) 1))) (defaults '(".html" ("html") ".htm" ("html"))) - (default-else '("html")) + (default-else '("html")) (selected-default (member file-ext defaults))) (if selected-default (cadr selected-default) @@ -183,12 +183,12 @@ (has-body? (cddr expr))) (zencoding-pif (zencoding-run zencoding-identifier (zencoding-tag-classes - `(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 - expr-and-input)))) + `(tag (,tagname ,has-body? ,(cddr expr))) input) + (zencoding-tag-classes + `(tag (,tagname ,has-body? nil)) input)) + (let ((expr (car it)) + (input (cdr it))) + (zencoding-tag-props expr input)))) (zencoding-default-tag input))) (defun zencoding-default-tag (input) @@ -197,13 +197,11 @@ (zencoding-tag (concat "div" (elt it 0))))) (defun zencoding-tag-props (tag input) - (zencoding-run zencoding-props - (let ((tagname (cadr tag)) - (existing-props (caddr tag)) - (props (cdr expr))) - `((tag ,tagname - ,(append existing-props props)) - . ,input)))) + (let ((tag-data (cadr tag))) + (zencoding-run zencoding-props + (let ((props (cdr expr))) + `((tag ,(append tag-data (list props))) . ,input)) + `((tag ,(append tag-data '(nil))) . ,input)))) (defun zencoding-props (input) "Parse many props." @@ -236,16 +234,12 @@ `((,(read name) ,value) . ,input))))) (defun zencoding-tag-classes (tag input) - (zencoding-run zencoding-classes - (let ((tagname (cadr tag)) - (props (caddr tag)) - (classes `(class ,(mapconcat - (lambda (prop) - (cdadr prop)) - (cdr expr) - " ")))) - `((tag ,tagname ,(append props (list classes))) . ,input)) - `(,tag . ,input))) + (let ((tag-data (cadr tag))) + (zencoding-run zencoding-classes + (let ((classes (mapcar (lambda (cls) (cdadr cls)) + (cdr expr)))) + `((tag ,(append tag-data (list classes))) . ,input)) + `((tag ,(append tag-data '(nil))) . ,input)))) (defun zencoding-tagname (input) "Parse a tagname a-zA-Z0-9 tagname (e.g. html/head/xsl:if/br)." @@ -345,7 +339,6 @@ (zencoding-run zencoding-name `((class ,expr) . ,input) '(error "expected class name")))) - (defun zencoding-identifier (input) "Parse an identifier expression, e.g. #foo" (zencoding-parse "#" 1 "#" @@ -395,8 +388,9 @@ "Function to execute when expanding a leaf node in the Zencoding AST.") -(defvar zencoding-filters - '("html" (zencoding-primary-filter zencoding-make-html-tag))) +(setq zencoding-filters + '("html" (zencoding-primary-filter zencoding-make-html-tag) + "c" (zencoding-primary-filter zencoding-make-commented-html-tag))) (defun zencoding-primary-filter (input proc) "Process filter that needs to be executed first, ie. not given output from other filter." @@ -418,30 +412,59 @@ filter-output)) nil))) -(defun zencoding-make-html-tag (tag &optional content) - (let* ((name (caar tag)) - (has-body? (or content - (and (cdar tag) +(defun zencoding-make-tag (tag-maker tag-info &optional content) + (let* ((name (pop tag-info)) + (has-body? (pop tag-info)) + (id (pop tag-info)) + (classes (pop tag-info)) + (props (pop tag-info)) + (has-body (or content + (and has-body? (not (member name zencoding-self-closing-tags))))) (lf (if (or (and content (string-match "\n" content)) (member name zencoding-block-tags) (and (> (length name) 1) (not (member name zencoding-inline-tags)))) - "\n" "")) - (props (apply 'concat (mapcar (lambda (prop) - (concat " " (symbol-name (car prop)) - "=\"" (cadr prop) "\"")) - (cadr tag))))) - (concat lf "<" name props - (if has-body? - (concat ">" lf - (if content content - (if zencoding-leaf-function - (funcall zencoding-leaf-function) - "")) - lf "" lf) + "\n" ""))) + (funcall tag-maker name id classes props has-body lf + (if content content + (if zencoding-leaf-function (funcall zencoding-leaf-function) + ""))))) + +(defun zencoding-make-html-tag (tag-name tag-id tag-classes tag-props has-body lf content) + (let ((id (zencoding-concat-or-empty " id=\"" tag-id "\"")) + (classes (zencoding-mapconcat-or-empty " class=\"" tag-classes " " "\"")) + (props (zencoding-mapconcat-or-empty " " tag-props " " nil + (lambda (prop) + (concat (symbol-name (car prop)) "=\"" (cadr prop) "\""))))) + + (concat lf "<" tag-name id classes props + (if has-body + (concat ">" lf content lf "" lf) "/>\n")))) +(defun zencoding-make-commented-html-tag (tag-name tag-id tag-classes tag-props has-body lf content) + (let ((body (zencoding-make-html-tag tag-name tag-id tag-classes tag-props has-body lf content))) + (if (or tag-id tag-classes) + (let ((id (zencoding-concat-or-empty "#" tag-id)) + (classes (zencoding-mapconcat-or-empty "." tag-classes "."))) + (concat "\n" + body + "\n\n")) + body))) + +(defun zencoding-concat-or-empty (prefix body &optional suffix) + (if body + (concat prefix body suffix) + "")) + +(defun zencoding-mapconcat-or-empty (prefix list-body delimiter &optional suffix map-fun) + (if list-body + (let* ((mapper (if map-fun map-fun 'identity)) + (body (mapconcat mapper list-body delimiter))) + (concat prefix body suffix)) + "")) + (defun zencoding-transform (ast-with-filters) (let ((filters (car ast-with-filters)) (ast (cadr ast-with-filters))) @@ -457,11 +480,11 @@ (cadr ast) "")) ((eq type 'tag) - (funcall tag-maker (cdr ast))) + (zencoding-make-tag tag-maker (cadr ast))) ((eq type 'parent-child) - (let ((parent (cdadr ast)) + (let ((parent (cadadr ast)) (children (zencoding-transform-ast (caddr ast) tag-maker))) - (funcall tag-maker parent children))) + (zencoding-make-tag tag-maker parent children))) ((eq type 'sibling) (let ((sib1 (zencoding-transform-ast (cadr ast) tag-maker)) (sib2 (zencoding-transform-ast (caddr ast) tag-maker))) @@ -553,6 +576,8 @@ ("((a)*2)" "") ("(a>b)*2" "") ("(a+b)*2" "") + ;; Filters + ("#a.b|c" "\n\n
\n\n
\n\n\n") ))) (mapc (lambda (input) (let ((expected (cadr input)) @@ -565,6 +590,8 @@ tests) (concat (number-to-string (length tests)) " tests performed. All OK."))) +(zencoding-test-cases) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Zencoding minor mode