Skip to content

Instantly share code, notes, and snippets.

@whamtet
Last active December 5, 2016 03:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save whamtet/1bd06ed44edb72eb385a344ff8aa2c4b to your computer and use it in GitHub Desktop.
Save whamtet/1bd06ed44edb72eb385a344ff8aa2c4b to your computer and use it in GitHub Desktop.
(ns render.format)
(defn standardize [form]
(cond
(vector? form)
(let [[k m & rest] form]
(if (map? m)
(vec (list* k m (map standardize rest)))
(vec (list* k {} (standardize m) (map standardize rest)))))
(seq? form)
(map standardize form)
:default form))
(def inline-tags #{"span" "pre" "a"})
(defn render
([form] (render 0 false (standardize form)))
([indent inline? form]
(let [
indent-str (if inline? "" (apply str (repeat indent " ")))
newline (if inline? "" "\r\n")
]
(cond
(vector? form)
(let [[k m & rest] form
k (name k)
inline? (or inline? (inline-tags k))
attrs (apply str (map (fn [[k v]] (str " " (name k) "=\"" v "\"")) m))
subforms (apply str (map #(render (inc indent) inline? %) rest))
]
(cond
(inline-tags k) (format "%s<%s%s>%s</%s>\r\n" indent-str k attrs subforms k)
inline? (format "<%s%s>%s</%s>" k attrs subforms k)
:default (format "%s<%s%s>\r\n%s%s</%s>\r\n" indent-str k attrs subforms indent-str k)))
(seq? form) (apply str (map #(render indent inline? %) form))
(string? form)
(apply str (map #(str indent-str (.trim %) newline) (.split (.trim form) "\n")))
:default (str indent-str form newline)))))
(defn html5 [& forms]
(str "<!DOCTYPE html>\r\n" (render [:html forms])))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment