From 2d8d9ea5145c6bacf122373ecf5ea036db5332d1 Mon Sep 17 00:00:00 2001
From: Simon Brooke <simon@journeyman.cc>
Date: Mon, 19 Mar 2018 00:38:03 +0000
Subject: [PATCH] Added a very simple-minded as-html pretty-printer

---
 .gitignore                 |  2 +
 project.clj                | 10 +++--
 src/cljc/fedit/format.cljc | 81 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 89 insertions(+), 4 deletions(-)
 create mode 100644 src/cljc/fedit/format.cljc

diff --git a/.gitignore b/.gitignore
index 4ef2717..03f26e6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
 
 *.log
+
+\.lein-repl-history
diff --git a/project.clj b/project.clj
index 2aab8b5..ff52e3a 100644
--- a/project.clj
+++ b/project.clj
@@ -4,8 +4,10 @@
   :license {:name "GNU General Public License,version 2.0 or (at your option) any later version"
             :url "https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html"}
   :dependencies [[org.clojure/clojure "1.8.0"]
-                 [jline "2.11"]
                  [org.clojure/clojurescript "1.9.908"]
+                 [hiccup "1.0.5"]
+                 [jline "2.11"]
+                 [markdown-clj "1.0.2"]
                  [reagent "0.7.0"]
                  [re-frame "0.10.5"]]
 
@@ -13,7 +15,7 @@
 
   :min-lein-version "2.5.3"
 
-  :source-paths ["src/clj"]
+  :source-paths ["src/clj" "src/cljc"]
 
   :clean-targets ^{:protect false} ["resources/public/js/compiled" "target" "classes" "bin"]
 
@@ -28,7 +30,7 @@
   :cljsbuild
   {:builds
    [{:id           "dev"
-     :source-paths ["src/cljs"]
+     :source-paths ["src/cljs" "src/cljc"]
      :figwheel     {:on-jsload "fedit.core/mount-root"}
      :compiler     {:main                 fedit.core
                     :output-to            "resources/public/js/compiled/app.js"
@@ -40,7 +42,7 @@
                     }}
 
     {:id           "min"
-     :source-paths ["src/cljs"]
+     :source-paths ["src/cljs" "src/cljc"]
      :compiler     {:main            fedit.core
                     :output-to       "resources/public/js/compiled/app.js"
                     :optimizations   :advanced
diff --git a/src/cljc/fedit/format.cljc b/src/cljc/fedit/format.cljc
new file mode 100644
index 0000000..c262d8f
--- /dev/null
+++ b/src/cljc/fedit/format.cljc
@@ -0,0 +1,81 @@
+(ns fedit.format
+  "Essentially, a pretty-printer which renders Clojure as HTML"
+  (:require [clojure.string :as s]
+            [hiccup.core :refer [html]]
+            [markdown.core :refer [md-to-html-string]]))
+
+(declare format-object)
+
+(defn format-inline
+  [o]
+  [:span {:class "clojure"} o])
+
+(defn format-string
+  [o]
+  [:span (md-to-html-string o)])
+
+(defn format-block
+  [o]
+  [:div {:class "clojure"} o])
+
+(defn format-quoted
+  [q]
+  (format-inline (str "'" (nth q 1))))
+
+
+(defn format-sequence
+  [s]
+  (let [lpar (if (vector? s) "[" "(")
+        rpar (if (vector? s) "]" ")")]
+    (conj
+     (vec
+      (cons
+       :div
+       (cons
+        {:class "clojure"}
+        (cons
+         lpar
+         (map format-object s)))))
+     rpar)))
+
+(defn format-map
+  [m]
+  (let [c (count (keys m))]
+    (vec
+     (cons
+      :table
+      (for
+        [i (range c) k (keys m)]
+        [:tr
+         [:td (if (zero? i) "{")]
+         [:th (format-object k)]
+         [:td (format-object (m k))]
+         [:td (if (= (inc i) c) "}")]])))))
+
+(defn format-object
+  [o]
+  (cond
+   (and
+    (list? o)
+    (= (first o) 'quote)
+    (not (seq? (nth o 1))))
+   (format-quoted o)
+   (or
+    (nil? o)
+    (true? o)
+    (number? o)
+    (symbol? o))
+   (format-inline o)
+   (keyword? o)
+   (format-inline (str ":" (name o)))
+   (string? o)
+   (format-string o)
+   (or
+    (vector? o)
+    (list? o))
+   (format-sequence o)
+   (map? o)
+   (format-map o)
+   true
+   (format-block o)))
+