Last active
December 5, 2016 03:45
-
-
Save whamtet/1bd06ed44edb72eb385a344ff8aa2c4b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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