Added a very simple-minded as-html pretty-printer

This commit is contained in:
Simon Brooke 2018-03-19 00:38:03 +00:00
parent 26d4889cff
commit 2d8d9ea514
3 changed files with 89 additions and 4 deletions

2
.gitignore vendored
View file

@ -1,2 +1,4 @@
*.log *.log
\.lein-repl-history

View file

@ -4,8 +4,10 @@
:license {:name "GNU General Public License,version 2.0 or (at your option) any later version" :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"} :url "https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html"}
:dependencies [[org.clojure/clojure "1.8.0"] :dependencies [[org.clojure/clojure "1.8.0"]
[jline "2.11"]
[org.clojure/clojurescript "1.9.908"] [org.clojure/clojurescript "1.9.908"]
[hiccup "1.0.5"]
[jline "2.11"]
[markdown-clj "1.0.2"]
[reagent "0.7.0"] [reagent "0.7.0"]
[re-frame "0.10.5"]] [re-frame "0.10.5"]]
@ -13,7 +15,7 @@
:min-lein-version "2.5.3" :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"] :clean-targets ^{:protect false} ["resources/public/js/compiled" "target" "classes" "bin"]
@ -28,7 +30,7 @@
:cljsbuild :cljsbuild
{:builds {:builds
[{:id "dev" [{:id "dev"
:source-paths ["src/cljs"] :source-paths ["src/cljs" "src/cljc"]
:figwheel {:on-jsload "fedit.core/mount-root"} :figwheel {:on-jsload "fedit.core/mount-root"}
:compiler {:main fedit.core :compiler {:main fedit.core
:output-to "resources/public/js/compiled/app.js" :output-to "resources/public/js/compiled/app.js"
@ -40,7 +42,7 @@
}} }}
{:id "min" {:id "min"
:source-paths ["src/cljs"] :source-paths ["src/cljs" "src/cljc"]
:compiler {:main fedit.core :compiler {:main fedit.core
:output-to "resources/public/js/compiled/app.js" :output-to "resources/public/js/compiled/app.js"
:optimizations :advanced :optimizations :advanced

View file

@ -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)))