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