summaryrefslogtreecommitdiff
path: root/home/src/highlight.clj
diff options
context:
space:
mode:
Diffstat (limited to 'home/src/highlight.clj')
-rw-r--r--home/src/highlight.clj50
1 files changed, 50 insertions, 0 deletions
diff --git a/home/src/highlight.clj b/home/src/highlight.clj
new file mode 100644
index 0000000..f229b1a
--- /dev/null
+++ b/home/src/highlight.clj
@@ -0,0 +1,50 @@
+(ns highlight
+ (:require [clojure.java.shell :as shell]
+ [borkdude.html :refer [html]]
+ [zprint.core :as zp]
+ [clojure.string :refer [join]]))
+
+(defn highlight [lang src]
+ (let [result (shell/sh "pygmentize" "-l" lang "-f" "html" :in src)]
+ (:out result)))
+
+(defn code [style v]
+ (html
+ (let [s style]
+ [:div
+ {:class s}
+ v])))
+
+(defmacro highlight-clj [& body]
+ (let [out (atom [])
+ _res ;; return value of final form; currently unused
+ (let [prev-ns *ns*
+ t #(swap! out conj %)]
+ (ns example)
+ (add-tap (bound-fn* t))
+ (let [res
+ (last (map eval body))]
+ (remove-tap (bound-fn* t))
+ (in-ns (ns-name prev-ns))
+ res))
+ code
+ (join "\n\n" (map zp/zprint-str body))
+ tap-out (join "\n" (map zp/zprint-str @out {:style :backtranslate}))
+ joined (apply str
+ (concat code))]
+ `(html
+ [:div
+ {:style {:border-left "5px solid #ddd"}}
+ [:div {:class "code"}
+ [:$
+ (highlight "clojure"
+ ~joined)]]
+ [:p {:style {:padding-left "6px"}} "tap contents:"]
+ [:div {:class "output"}
+ [:$
+ (highlight "clojure"
+ ~tap-out)]]])))
+
+(defn highlight-styles [k style]
+ (let [result (shell/sh "pygmentize" "-S" style "-f" "html" "-a" (str "." (name k)))]
+ (:out result)))