<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -11,10 +11,6 @@
   (:use clojure.contrib.def)
   (:use clojure.contrib.java-utils))
 
-(derive clojure.lang.IPersistentVector ::vector)
-(derive clojure.lang.IPersistentList ::list)
-(derive clojure.lang.ISeq ::seq)
-
 (defn escape-html
   &quot;Change special characters into HTML character entities.&quot;
   [string]
@@ -24,19 +20,6 @@
     (replace &quot;&gt;&quot;  &quot;&amp;gt;&quot;)
     (replace &quot;\&quot;&quot; &quot;&amp;quot;&quot;)))
 
-(defn quoted?
-  &quot;True if the form is a quoted value.&quot;
-  [x]
-  (and (list? x)
-       (= 'quote (first x))))
-
-(defn literal?
-  &quot;True if the value is a literal value.&quot;
-  [x]
-  (or (and (not (list? x))
-           (not (symbol? x)))
-      (quoted? x)))
-
 (defn- format-attr
   &quot;Turn a key-value pair into a pair of attribute-value strings.&quot;
   [[key value]]
@@ -62,6 +45,9 @@
   [tag]
   (rest (re-matches re-tag (as-str tag))))
 
+(derive clojure.lang.IPersistentVector ::vector)
+(derive clojure.lang.ISeq ::seq)
+
 (defmulti render-html
   &quot;Render a Clojure data structure to a seq of HTML at runtime.&quot;
   type)
@@ -108,6 +94,27 @@
   [x]
   (list (as-str x)))
 
+(defn quoted?
+  &quot;True if the form is a quoted value.&quot;
+  [x]
+  (and (list? x)
+       (= 'quote (first x))))
+
+(defn literal?
+  &quot;True if the value is a literal value.&quot;
+  [x]
+  (or (and (not (list? x))
+           (not (symbol? x)))
+      (quoted? x)))
+
+(derive clojure.lang.IPersistentList ::form)
+(derive clojure.lang.Symbol ::form)
+
+(defmulti compile-html
+  &quot;Render a Clojure data structure to a seq of HTML at compile-time when
+  possible, at runtime when not.&quot;
+  type)
+
 (defn compile-tag
   &quot;Attempt to pre-render a HTML tag.&quot;
   [tag-name content]
@@ -119,18 +126,39 @@
   &quot;Attempt to pre-render an attribute map.&quot;
   [attrs content]
   (if (map? attrs)
-    `(list ~@(render-attrs attrs content))
-    `(render-attrs ~attrs ~content)))
-
-;(defn compile-content
-;  &quot;Attempt to pre-render the contents of a tag.&quot;
-;  [content]
-;  (list*
-;    &quot;&gt;&quot;
-;    (render-html
-;      (if (map? (first content))
-;        (rest content)
-;        content))))
+    (render-attrs attrs content)
+    (if (not (literal? attrs))
+     `(render-attrs ~attrs ~content)
+      content)))
+
+(defn compile-content
+  &quot;Attempt to pre-render the contents of a tag.&quot;
+  [content]
+  (list*
+    &quot;&gt;&quot;
+    (if (map? (first content))
+      (mapcat compile-html (rest content))
+      (if (literal? (first content))
+        (mapcat compile-html content)
+        `(concat
+           (render-html ~(take 2 content))
+          ~(compile-html (drop 2 content)))))))
+
+(defmethod compile-html ::vector
+  [[tag &amp; content]]
+  (compile-tag tag
+    (compile-attrs (first content)
+      (compile-content content))))
+
+(defmethod compile-html ::form
+  [form]
+  (if (quoted? form)
+    (render-html form)
+   `(render-html ~form)))
+
+(defmethod compile-html :default
+  [x]
+  (render-html x))
 
 (defn collapse-strs
   &quot;Concatenate adjacent strings in a sequence.&quot;
@@ -143,7 +171,7 @@
     '()
     (reverse coll)))
 
-;(defmacro html
-;  &quot;Efficiently compile a Clojure data structure into a list of HTML.&quot;
-;  [&amp; content]
-;  `(list ~@(mapcat compile-html content)))
+(defmacro html
+  &quot;Efficiently render a Clojure data structure into a seq of HTML.&quot;
+  [&amp; content]
+  `(list ~@(map (comp collapse-strs compile-html) content)))</diff>
      <filename>src/hiccup.clj</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>a8897efc80778fdbdd01a1cba523c16c6e69c7a5</id>
    </parent>
  </parents>
  <author>
    <name>weavejester</name>
    <email>jreeves@weavejester.com</email>
  </author>
  <url>http://github.com/weavejester/hiccup/commit/3c001ec9152c12aa8a4cbae047b15e5bed550bb0</url>
  <id>3c001ec9152c12aa8a4cbae047b15e5bed550bb0</id>
  <committed-date>2009-11-06T16:33:46-08:00</committed-date>
  <authored-date>2009-11-06T16:33:46-08:00</authored-date>
  <message>Added almost-working compile-html multimethod</message>
  <tree>a1c1f76e9548dd97767ce9c29f985305db9f77c8</tree>
  <committer>
    <name>weavejester</name>
    <email>jreeves@weavejester.com</email>
  </committer>
</commit>
