diff options
Diffstat (limited to 'zencoding-mode.el')
-rw-r--r-- | zencoding-mode.el | 349 |
1 files changed, 7 insertions, 342 deletions
diff --git a/zencoding-mode.el b/zencoding-mode.el index 824b15c..370d570 100644 --- a/zencoding-mode.el +++ b/zencoding-mode.el @@ -1,3 +1,4 @@ + ;;; zencoding-mode.el --- Unfold CSS-selector-like expressions to markup ;; Copyright (C) 2009, Chris Done @@ -41,6 +42,8 @@ ;; (add-to-list 'load-path "~/Emacs/zencoding/") ;; (require 'zencoding-mode) ;; (add-hook 'sgml-mode-hook 'zencoding-mode) ;; Auto-start on any markup modes +;; (add-hook 'html-mode-hook 'zencoding-mode) +;; (add-hook 'css-mode-hook 'zencoding-mode) ;; ;; Enable the minor mode with M-x zencoding-mode. ;; @@ -114,9 +117,8 @@ (mapcar (lambda (ref) (match-string ref string)) (if (sequencep refs) refs (list refs))) nil)) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Zen coding parsers +;; XML abbrev (defun zencoding-expr (input) "Parse a zen coding expression with optional filters." @@ -709,346 +711,9 @@ (replace-regexp-in-string "\n" "\n " (concat "\n" text)) nil)) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Test-cases - -(defun zencoding-test-cases () - (let ((tests '(;; Tags - ("a" "<a></a>") - ("a.x" "<a class=\"x\"></a>") - ("a#q.x" "<a id=\"q\" class=\"x\"></a>") - ("a#q.x.y.z" "<a id=\"q\" class=\"x y z\"></a>") - ("#q" "<div id=\"q\">" - "</div>") - (".x" "<div class=\"x\">" - "</div>") - ("#q.x" "<div id=\"q\" class=\"x\">" - "</div>") - ("#q.x.y.z" "<div id=\"q\" class=\"x y z\">" - "</div>") - ;; Empty tags - ("a/" "<a/>") - ("a/.x" "<a class=\"x\"/>") - ("a/#q.x" "<a id=\"q\" class=\"x\"/>") - ("a/#q.x.y.z" "<a id=\"q\" class=\"x y z\"/>") - ;; Self-closing tags - ("input type=text" "<input type=\"text\"/>") - ("img" "<img/>") - ("img>metadata/*2" "<img>" - " <metadata/>" - " <metadata/>" - "</img>") - ;; Siblings - ("a+b" "<a></a>" - "<b></b>") - ("a+b+c" "<a></a>" - "<b></b>" - "<c></c>") - ("a.x+b" "<a class=\"x\"></a>" - "<b></b>") - ("a#q.x+b" "<a id=\"q\" class=\"x\"></a>" - "<b></b>") - ("a#q.x.y.z+b" "<a id=\"q\" class=\"x y z\"></a>" - "<b></b>") - ("a#q.x.y.z+b#p.l.m.n" "<a id=\"q\" class=\"x y z\"></a>" - "<b id=\"p\" class=\"l m n\"></b>") - ;; Tag expansion - ("table+" "<table>" - " <tr>" - " <td>" - " </td>" - " </tr>" - "</table>") - ("dl+" "<dl>" - " <dt></dt>" - " <dd></dd>" - "</dl>") - ("ul+" "<ul>" - " <li></li>" - "</ul>") - ("ul++ol+" "<ul>" - " <li></li>" - "</ul>" - "<ol>" - " <li></li>" - "</ol>") - ("ul#q.x.y m=l+" "<ul id=\"q\" class=\"x y\" m=\"l\">" - " <li></li>" - "</ul>") - ;; Parent > child - ("a>b" "<a><b></b></a>") - ("a>b>c" "<a><b><c></c></b></a>") - ("a.x>b" "<a class=\"x\"><b></b></a>") - ("a#q.x>b" "<a id=\"q\" class=\"x\"><b></b></a>") - ("a#q.x.y.z>b" "<a id=\"q\" class=\"x y z\"><b></b></a>") - ("a#q.x.y.z>b#p.l.m.n" "<a id=\"q\" class=\"x y z\"><b id=\"p\" class=\"l m n\"></b></a>") - ("#q>.x" "<div id=\"q\">" - " <div class=\"x\">" - " </div>" - "</div>") - ("a>b+c" "<a>" - " <b></b>" - " <c></c>" - "</a>") - ("a>b+c>d" "<a>" - " <b></b>" - " <c><d></d></c>" - "</a>") - ;; Multiplication - ("a*1" "<a></a>") - ("a*2" "<a></a>" - "<a></a>") - ("a/*2" "<a/>" - "<a/>") - ("a*2+b*2" "<a></a>" - "<a></a>" - "<b></b>" - "<b></b>") - ("a*2>b*2" "<a>" - " <b></b>" - " <b></b>" - "</a>" - "<a>" - " <b></b>" - " <b></b>" - "</a>") - ("a>b*2" "<a>" - " <b></b>" - " <b></b>" - "</a>") - ("a#q.x>b#q.x*2" "<a id=\"q\" class=\"x\">" - " <b id=\"q\" class=\"x\"></b>" - " <b id=\"q\" class=\"x\"></b>" - "</a>") - ("a#q.x>b/#q.x*2" "<a id=\"q\" class=\"x\">" - " <b id=\"q\" class=\"x\"/>" - " <b id=\"q\" class=\"x\"/>" - "</a>") - ;; Numbering - ("a.$x*3" "<a class=\"1x\"></a>" - "<a class=\"2x\"></a>" - "<a class=\"3x\"></a>") - ("ul>li.item$*3" "<ul>" - " <li class=\"item1\"></li>" - " <li class=\"item2\"></li>" - " <li class=\"item3\"></li>" - "</ul>") - ("ul>li.item$$$*3" "<ul>" - " <li class=\"item001\"></li>" - " <li class=\"item002\"></li>" - " <li class=\"item003\"></li>" - "</ul>") - ("ul>li.item$@-*2" "<ul>" - " <li class=\"item2\"></li>" - " <li class=\"item1\"></li>" - "</ul>") - ("ul>li.item$@-1000*2" "<ul>" - " <li class=\"item1001\"></li>" - " <li class=\"item1000\"></li>" - "</ul>") - ("a.$*2>b.$$@-*3" "<a class=\"1\">" - " <b class=\"03\"></b>" - " <b class=\"02\"></b>" - " <b class=\"01\"></b>" - "</a>" - "<a class=\"2\">" - " <b class=\"03\"></b>" - " <b class=\"02\"></b>" - " <b class=\"01\"></b>" - "</a>") - ("(div>(a#id$$*2)+b.c$@-3+c#d$)*2" - "<div>" - " <a id=\"id01\"></a>" - " <a id=\"id02\"></a>" - " <b class=\"c4\"></b>" - " <c id=\"d1\"></c>" - "</div>" - "<div>" - " <a id=\"id01\"></a>" - " <a id=\"id02\"></a>" - " <b class=\"c3\"></b>" - " <c id=\"d2\"></c>" - "</div>") - ("a:b$$$-c$$@-:d$@-3-e$$@100/#b.c$*3" - "<a:b001-c03:d5-e100 id=\"b\" class=\"c1\"/>" - "<a:b002-c02:d4-e101 id=\"b\" class=\"c2\"/>" - "<a:b003-c01:d3-e102 id=\"b\" class=\"c3\"/>") - ("ul>li.item${name: item$ price: $\\$}*3" - "<ul>" - " <li class=\"item1\">name: item1 price: 1$</li>" - " <li class=\"item2\">name: item2 price: 2$</li>" - " <li class=\"item3\">name: item3 price: 3$</li>" - "</ul>") - ;; Properties - ("a x" "<a x=\"\"></a>") - ("a x=" "<a x=\"\"></a>") - ("a x=\"\"" "<a x=\"\"></a>") - ("a x=y" "<a x=\"y\"></a>") - ("a x=\"y\"" "<a x=\"y\"></a>") - ("a x=\"()\"" "<a x=\"()\"></a>") - ("a x m" "<a x=\"\" m=\"\"></a>") - ("a x= m=\"\"" "<a x=\"\" m=\"\"></a>") - ("a x=y m=l" "<a x=\"y\" m=\"l\"></a>") - ("a/ x=y m=l" "<a x=\"y\" m=\"l\"/>") - ("a#foo x=y m=l" "<a id=\"foo\" x=\"y\" m=\"l\"></a>") - ("a.foo x=y m=l" "<a class=\"foo\" x=\"y\" m=\"l\"></a>") - ("a#foo.bar.mu x=y m=l" "<a id=\"foo\" class=\"bar mu\" x=\"y\" m=\"l\"></a>") - ("a/#foo.bar.mu x=y m=l" "<a id=\"foo\" class=\"bar mu\" x=\"y\" m=\"l\"/>") - ("a x=y+b" "<a x=\"y\"></a>" - "<b></b>") - ("a x=y+b x=y" "<a x=\"y\"></a>" - "<b x=\"y\"></b>") - ("a x=y>b" "<a x=\"y\"><b></b></a>") - ("a x=y>b x=y" "<a x=\"y\"><b x=\"y\"></b></a>") - ("a x=y>b x=y+c x=y" "<a x=\"y\">" - " <b x=\"y\"></b>" - " <c x=\"y\"></c>" - "</a>") - ;; Parentheses - ("(a)" "<a></a>") - ("(a)+(b)" "<a></a>" - "<b></b>") - ("a>(b)" "<a><b></b></a>") - ("(a>b)>c" "<a><b></b></a>") - ("(a>b)+c" "<a><b></b></a>" - "<c></c>") - ("z+(a>b)+c+k" "<z></z>" - "<a><b></b></a>" - "<c></c>" - "<k></k>") - ("(a)*2" "<a></a>" - "<a></a>") - ("((a)*2)" "<a></a>" - "<a></a>") - ("((a))*2" "<a></a>" - "<a></a>") - ("(a>b)*2" "<a><b></b></a>" - "<a><b></b></a>") - ("(a+b)*2" "<a></a>" - "<b></b>" - "<a></a>" - "<b></b>") - ;; Text - ("a{Click me}" "<a>Click me</a>") - ("a>{Click me}*3" "<a>" - " Click me" - " Click me" - " Click me" - "</a>") - ("a{click}+b{here}" "<a>click</a>" - "<b>here</b>") - ("a>{click}+b{here}" "<a>" - " click" - " <b>here</b>" - "</a>") - ("p>{Click }+a{here}+{ to continue}" - "<p>" - " Click " - " <a>here</a>" - " to continue" - "</p>") - ("p{Click }+a{here}+{ to continue}" - "<p>" - " Click " - "</p>" - "<a>here</a>" - " to continue") - ;; Climb-up - ("a>b>c^d" "<a>" - " <b><c></c></b>" - " <d></d>" - "</a>") - ("a>b>c^^d" "<a><b><c></c></b></a>" - "<d></d>") - ("a*2>b*2>c^d" "<a>" - " <b><c></c></b>" - " <b><c></c></b>" - " <d></d>" - "</a>" - "<a>" - " <b><c></c></b>" - " <b><c></c></b>" - " <d></d>" - "</a>") - ("div+a>p>span{foo}+em>b^^^p" - "<div>" - "</div>" - "<a>" - " <p>" - " <span>foo</span>" - " <em><b></b></em>" - " </p>" - "</a>" - "<p>" - "</p>") - ("div+div>p>span+em^blockquote{foo}" - "<div>" - "</div>" - "<div>" - " <p>" - " <span></span>" - " <em></em>" - " </p>" - " <blockquote>" - " foo" - " </blockquote>" - "</div>") - ;; Filter: comment - ("a.b|c" "<!-- .b -->" - "<a class=\"b\"></a>" - "<!-- /.b -->") - ("#a>.b|c" "<!-- #a -->" - "<div id=\"a\">" - " <!-- .b -->" - " <div class=\"b\">" - " </div>" - " <!-- /.b -->" - "</div>" - "<!-- /#a -->") - ;; Filter: HAML - ("a|haml" "%a") - ("a#q.x.y.z|haml" "%a#q.x.y.z") - ("a#q.x x=y m=l|haml" "%a#q.x{:x => \"y\", :m => \"l\"}") - ("div|haml" "%div") - ("div.footer|haml" ".footer") - (".footer|haml" ".footer") - ("p>{This is haml}*2+a href=#+br|haml" - "%p" - " This is haml" - " This is haml" - " %a{:href => \"#\"}" - " %br") - - ;; Filter: Hiccup - ("a|hic" "[:a]") - ("a#q.x.y.z|hic" "[:a#q.x.y.z]") - ("a#q.x x=y m=l|hic" "[:a#q.x {:x \"y\", :m \"l\"}]") - (".footer|hic" "[:div.footer]") - ("p>a href=#+br|hic" "[:p" - " [:a {:href \"#\"}]" - " [:br]]") - ("#q>(a*2>b{x})+p>{m}+b|hic" - "[:div#q" - " [:a [:b \"x\"]]" - " [:a [:b \"x\"]]" - " [:p" - " \"m\"" - " [:b]]]") - ;; Filter: escape - ("script src="|e" "<script src=\"&quot;\">" - "</script>") - ))) - (mapc (lambda (input) - (let ((expected (mapconcat 'identity (cdr input) "\n")) - (actual (zencoding-transform (car (zencoding-expr (car input)))))) - (if (not (equal expected actual)) - (error (concat "Assertion " (car input) " failed:" - expected - " == " - actual))))) - tests) - (concat (number-to-string (length tests)) " tests performed. All OK."))) - +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; CSS abbrev: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Zencoding minor mode |