From b8c5b71dbb15f5d58776e9aea6ae751ee6e0f71d Mon Sep 17 00:00:00 2001 From: Dmitri Sotnikov Date: Mon, 29 Dec 2014 18:06:52 -0500 Subject: [PATCH 01/10] updated markdown-clj dependency --- project.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project.clj b/project.clj index 015e2fb..605f8cc 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject cryogen-core "0.1.8" +(defproject cryogen-core "0.1.9" :description "Cryogen's compiler" :url "https://github.com/lacarmen/cryogen-core" :license {:name "Eclipse Public License" @@ -12,5 +12,5 @@ [io.aviso/pretty "0.1.13"] [hiccup "1.0.5"] [selmer "0.7.8"] - [markdown-clj "0.9.60" + [markdown-clj "0.9.61" :exclusions [com.keminglabs/cljx]]]) From 73338935fa79deb87842d520b864320b43d3acfd Mon Sep 17 00:00:00 2001 From: lacarmen Date: Wed, 31 Dec 2014 16:55:29 -0500 Subject: [PATCH 02/10] Cleanup --- src/cryogen_core/compiler.clj | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/src/cryogen_core/compiler.clj b/src/cryogen_core/compiler.clj index b089e29..773c6f3 100644 --- a/src/cryogen_core/compiler.clj +++ b/src/cryogen_core/compiler.clj @@ -184,12 +184,11 @@ (render-file "templates/html/layouts/page.html" (merge default-params {:servlet-context "../" - :page page - :asset-url asset-url})))))) + :page page})))))) (defn compile-posts "Compiles all the posts into html and spits them out into the public folder" - [default-params posts {:keys [blog-prefix post-root disqus-shortname asset-url]}] + [default-params posts {:keys [blog-prefix post-root disqus-shortname]}] (when-not (empty? posts) (println (blue "compiling posts")) (create-folder (str blog-prefix post-root)) @@ -200,8 +199,7 @@ (merge default-params {:servlet-context "../" :post post - :disqus-shortname disqus-shortname - :asset-url asset-url})))))) + :disqus-shortname disqus-shortname})))))) (defn compile-tags "Compiles all the tag pages into html and spits them out into the public folder" @@ -220,15 +218,14 @@ (defn compile-index "Compiles the index page into html and spits it out into the public folder" - [default-params {:keys [blog-prefix disqus? asset-url]}] + [default-params {:keys [blog-prefix disqus?]}] (println (blue "compiling index")) (spit (str public blog-prefix "/index.html") (render-file "templates/html/layouts/home.html" (merge default-params - {:home true - :disqus? disqus? - :post (get-in default-params [:latest-posts 0]) - :asset-url asset-url})))) + {:home true + :disqus? disqus? + :post (get-in default-params [:latest-posts 0])})))) (defn compile-archives "Compiles the archives page into html and spits it out into the public folder" @@ -258,16 +255,12 @@ (update-in [:sass-dest] (fnil str "css")) (update-in [:post-date-format] (fnil str "yyyy-MM-dd")) (update-in [:keep-files] (fnil seq [])) - (update-in [:ignored-files] (fnil seq [#"^\.#.*" #".*\.swp$"]))) - site-url (:site-url config) - blog-prefix (:blog-prefix config)] + (update-in [:ignored-files] (fnil seq [#"^\.#.*" #".*\.swp$"])))] (merge config {:page-root (root-path :page-root config) :post-root (root-path :post-root config) - :tag-root (root-path :tag-root config) - :asset-root (str (if (.endsWith site-url "/") (apply str (butlast site-url)) site-url) - blog-prefix)}))) + :tag-root (root-path :tag-root config)}))) (defn compile-assets "Generates all the html and copies over resources specified in the config" @@ -303,8 +296,8 @@ (spit (str public blog-prefix "/" rss-name) (rss/make-channel config posts)) (println (blue "compiling sass")) (sass/compile-sass->css! - (str "resources/templates/" sass-src) - (str "resources/public" blog-prefix "/" sass-dest)))) + (str "resources/templates/" sass-src) + (str "resources/public" blog-prefix "/" sass-dest)))) (defn compile-assets-timed [] (time From bca0e89aa2acbc7422baee84a7d9fc5d909f5ae5 Mon Sep 17 00:00:00 2001 From: lacarmen Date: Wed, 31 Dec 2014 23:21:38 -0500 Subject: [PATCH 03/10] Added uri and site-url selmer tags for canonical url meta tags --- project.clj | 2 +- src/cryogen_core/compiler.clj | 25 ++++++++++++++++--------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/project.clj b/project.clj index 605f8cc..aad7fb2 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject cryogen-core "0.1.9" +(defproject cryogen-core "0.1.10" :description "Cryogen's compiler" :url "https://github.com/lacarmen/cryogen-core" :license {:name "Eclipse Public License" diff --git a/src/cryogen_core/compiler.clj b/src/cryogen_core/compiler.clj index 773c6f3..474e5de 100644 --- a/src/cryogen_core/compiler.clj +++ b/src/cryogen_core/compiler.clj @@ -174,7 +174,7 @@ (defn compile-pages "Compiles all the pages into html and spits them out into the public folder" - [default-params pages {:keys [blog-prefix page-root asset-url]}] + [default-params pages {:keys [blog-prefix page-root]}] (when-not (empty? pages) (println (blue "compiling pages")) (create-folder (str blog-prefix page-root)) @@ -184,7 +184,8 @@ (render-file "templates/html/layouts/page.html" (merge default-params {:servlet-context "../" - :page page})))))) + :page page + :uri uri})))))) (defn compile-posts "Compiles all the posts into html and spits them out into the public folder" @@ -199,7 +200,8 @@ (merge default-params {:servlet-context "../" :post post - :disqus-shortname disqus-shortname})))))) + :disqus-shortname disqus-shortname + :uri (:uri post)})))))) (defn compile-tags "Compiles all the tag pages into html and spits them out into the public folder" @@ -212,9 +214,11 @@ (println "\t-->" (cyan uri)) (spit (str public uri) (render-file "templates/html/layouts/tag.html" - (merge default-params {:servlet-context "../" - :name name - :posts posts}))))))) + (merge default-params + {:servlet-context "../" + :name name + :posts posts + :uri uri}))))))) (defn compile-index "Compiles the index page into html and spits it out into the public folder" @@ -225,7 +229,8 @@ (merge default-params {:home true :disqus? disqus? - :post (get-in default-params [:latest-posts 0])})))) + :post (get-in default-params [:latest-posts 0]) + :uri (str blog-prefix "/index.html")})))) (defn compile-archives "Compiles the archives page into html and spits it out into the public folder" @@ -235,7 +240,8 @@ (render-file "templates/html/layouts/archives.html" (merge default-params {:archives true - :groups (group-for-archive posts)})))) + :groups (group-for-archive posts) + :uri (str blog-prefix "/archives.html")})))) (defn tag-posts "Converts the tags in each post into links" @@ -279,7 +285,8 @@ :sidebar-pages sidebar-pages :archives-uri (str blog-prefix "/archives.html") :index-uri (str blog-prefix "/index.html") - :rss-uri (str blog-prefix "/" rss-name)}] + :rss-uri (str blog-prefix "/" rss-name) + :site-url (if (.endsWith site-url "/") (.substring site-url 0 (dec (count site-url))) site-url)}] (wipe-public-folder keep-files) (println (blue "copying resources")) From 6f7cb79a654f73a1fc0d7297497b562a30bd8073 Mon Sep 17 00:00:00 2001 From: J Irving Date: Thu, 1 Jan 2015 03:49:03 -0500 Subject: [PATCH 04/10] Sass compilation respects :ignored-files config This is an oversight from lacarmen/cryogen-core#4. Also some slight refactoring. --- src/cryogen_core/compiler.clj | 10 +++++----- src/cryogen_core/io.clj | 10 +++------- src/cryogen_core/sass.clj | 26 ++++++++++++++++++-------- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/cryogen_core/compiler.clj b/src/cryogen_core/compiler.clj index 474e5de..6893fb2 100644 --- a/src/cryogen_core/compiler.clj +++ b/src/cryogen_core/compiler.clj @@ -303,16 +303,16 @@ (spit (str public blog-prefix "/" rss-name) (rss/make-channel config posts)) (println (blue "compiling sass")) (sass/compile-sass->css! - (str "resources/templates/" sass-src) - (str "resources/public" blog-prefix "/" sass-dest)))) + (str "resources/templates/" sass-src) + (str "resources/public" blog-prefix "/" sass-dest) + ignored-files))) (defn compile-assets-timed [] (time (try (compile-assets) (catch Exception e - (if - (or (instance? IllegalArgumentException e) - (instance? clojure.lang.ExceptionInfo e)) + (if (or (instance? IllegalArgumentException e) + (instance? clojure.lang.ExceptionInfo e)) (println (red "Error:") (yellow (.getMessage e))) (write-exception e)))))) diff --git a/src/cryogen_core/io.clj b/src/cryogen_core/io.clj index 691003e..e8e90df 100644 --- a/src/cryogen_core/io.clj +++ b/src/cryogen_core/io.clj @@ -5,11 +5,7 @@ (def public "resources/public") (defn get-resource [resource] - (-> (Thread/currentThread) - (.getContextClassLoader) - (.getResource resource) - (.toURI) - (io/file))) + (-> resource io/resource io/file)) (defn ignore [ignored-files] (fn [file] @@ -37,10 +33,10 @@ (doseq [asset (fs/find-files "resources/templates/md" #".+(jpg|jpeg|png|gif)")] (io/copy asset (io/file (str public blog-prefix "/img/" (.getName asset)))))) -(defn copy-resources [{:keys [blog-prefix resources]}] +(defn copy-resources [{:keys [blog-prefix resources]}] (doseq [resource resources] (let [src (str "resources/templates/" resource) - target (str public blog-prefix "/" resource)] + target (str public blog-prefix "/" resource)] (cond (not (.exists (io/file src))) (throw (IllegalArgumentException. (str "resource " src " not found"))) diff --git a/src/cryogen_core/sass.clj b/src/cryogen_core/sass.clj index 85df024..6b3770a 100644 --- a/src/cryogen_core/sass.clj +++ b/src/cryogen_core/sass.clj @@ -1,18 +1,27 @@ (ns cryogen-core.sass (:require [clojure.java.shell :refer [sh]] - [clojure.java.io :as io])) + [clojure.java.io :as io] + [cryogen-core.io :refer [ignore]])) (defn sass-installed? "Checks for the installation of Sass." [] (= 0 (:exit (sh "sass" "--version")))) +(defn re-filter [re] + (reify java.io.FilenameFilter + (accept [this _ name] + (not (nil? (re-find re name)))))) + (defn find-sass-files - "Given a Diretory, gets files, filtered to those having scss or sass extention" - [dir] - (->> (.list (io/file dir)) - (seq) - (filter (comp not nil? (partial re-find #"(?i:s[ca]ss$)"))))) + "Given a Diretory, gets files, Filtered to those having scss or sass + extention. Ignores files matching any ignored regexps." + [dir ignored-files] + (let [filename-filter (re-filter #"(?i:s[ca]ss$)")] + (->> (.listFiles (io/file dir) filename-filter) + (filter #(not (.isDirectory %))) + (filter (ignore ignored-files)) + (map #(.getName %))))) (defn compile-sass-file! "Given a sass file which might be in src-sass directory, @@ -31,8 +40,9 @@ dest-sass. Prompts you to install sass if he finds sass files and can't find the command. Shows you any problems it comes across when compiling. " [src-sass - dest-sass] - (let [sass-files (find-sass-files src-sass)] + dest-sass + ignored-files] + (let [sass-files (find-sass-files src-sass ignored-files)] (if (seq sass-files) ;; I found sass files, ;; If sass is installed From 4eb0036ef5a4c980a363d5b2e100a60d34a808df Mon Sep 17 00:00:00 2001 From: J Irving Date: Fri, 2 Jan 2015 00:05:59 -0500 Subject: [PATCH 05/10] Use checksums instead of last modified times. Also add pandect dependency. --- project.clj | 33 +++++++++++++++++---------------- src/cryogen_core/watcher.clj | 27 ++++++++++++++++++--------- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/project.clj b/project.clj index aad7fb2..17a465f 100644 --- a/project.clj +++ b/project.clj @@ -1,16 +1,17 @@ -(defproject cryogen-core "0.1.10" - :description "Cryogen's compiler" - :url "https://github.com/lacarmen/cryogen-core" - :license {:name "Eclipse Public License" - :url "http://www.eclipse.org/legal/epl-v10.html"} - :dependencies [[org.clojure/clojure "1.6.0"] - [clj-rss "0.1.9"] - [me.raynes/fs "1.4.6"] - [crouton "0.1.2"] - [cheshire "5.4.0"] - [clj-text-decoration "0.0.3"] - [io.aviso/pretty "0.1.13"] - [hiccup "1.0.5"] - [selmer "0.7.8"] - [markdown-clj "0.9.61" - :exclusions [com.keminglabs/cljx]]]) +(defproject cryogen-core "0.1.11-SNAPSHOT" + :description "Cryogen's compiler" + :url "https://github.com/lacarmen/cryogen-core" + :license {:name "Eclipse Public License" + :url "http://www.eclipse.org/legal/epl-v10.html"} + :dependencies [[org.clojure/clojure "1.6.0"] + [clj-rss "0.1.9"] + [me.raynes/fs "1.4.6"] + [crouton "0.1.2"] + [cheshire "5.4.0"] + [clj-text-decoration "0.0.3"] + [io.aviso/pretty "0.1.13"] + [hiccup "1.0.5"] + [selmer "0.7.8"] + [markdown-clj "0.9.61" + :exclusions [com.keminglabs/cljx]] + [pandect "0.4.1"]]) diff --git a/src/cryogen_core/watcher.clj b/src/cryogen_core/watcher.clj index 43d478f..0694fcf 100644 --- a/src/cryogen_core/watcher.clj +++ b/src/cryogen_core/watcher.clj @@ -1,24 +1,33 @@ (ns cryogen-core.watcher (:require [clojure.java.io :refer [file]] - [cryogen-core.io :refer [ignore]])) + [cryogen-core.io :refer [ignore]] + [pandect.core :refer [md5]] + [clojure.set :as set])) -(defn get-assets [root ignored-files] - (->> root +(defn get-assets [path ignored-files] + (->> path file file-seq (filter #(not (.isDirectory %))) (filter (ignore ignored-files)))) -(defn sum-times [path ignored-files] - (->> (get-assets path ignored-files) (map #(.lastModified %)) (reduce +))) +(defn checksums [path ignored-files] + (let [files (get-assets path ignored-files)] + (zipmap (map md5 files) files))) + +(defn find-changes [old-sums new-sums] + (let [old-sum-set (-> old-sums keys set) + new-sum-set (-> new-sums keys set)] + (when-some [changes (set/difference new-sum-set old-sum-set)] + (vals (select-keys new-sums changes))))) (defn watch-assets [root ignored-files action] - (loop [times (sum-times root ignored-files)] + (loop [sums (checksums root ignored-files)] (Thread/sleep 300) - (let [new-times (sum-times root ignored-files)] - (when-not (= times new-times) + (let [new-sums (checksums root ignored-files)] + (when (find-changes sums new-sums) (action)) - (recur new-times)))) + (recur new-sums)))) (defn start-watcher! [root ignored-files action] (doto (Thread. #(watch-assets root ignored-files action)) From 6c9be90fa4aca087d0a898a7f4b790a6c97862dc Mon Sep 17 00:00:00 2001 From: Carmen La Date: Fri, 2 Jan 2015 10:45:06 -0500 Subject: [PATCH 06/10] Updated version --- project.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.clj b/project.clj index 17a465f..203f126 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject cryogen-core "0.1.11-SNAPSHOT" +(defproject cryogen-core "0.1.11" :description "Cryogen's compiler" :url "https://github.com/lacarmen/cryogen-core" :license {:name "Eclipse Public License" From 656cc2d0c9fb1042fc4bd19cf51b7b441e5f4a10 Mon Sep 17 00:00:00 2001 From: lacarmen Date: Sat, 3 Jan 2015 20:36:30 -0500 Subject: [PATCH 07/10] Added curated RSS generation based on :rss-filters in the config --- project.clj | 2 +- src/cryogen_core/compiler.clj | 5 ++++- src/cryogen_core/rss.clj | 11 +++++++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/project.clj b/project.clj index 203f126..7dfa9bf 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject cryogen-core "0.1.11" +(defproject cryogen-core "0.1.12" :description "Cryogen's compiler" :url "https://github.com/lacarmen/cryogen-core" :license {:name "Eclipse Public License" diff --git a/src/cryogen_core/compiler.clj b/src/cryogen_core/compiler.clj index 6893fb2..b1bf47e 100644 --- a/src/cryogen_core/compiler.clj +++ b/src/cryogen_core/compiler.clj @@ -257,6 +257,7 @@ read-string (update-in [:blog-prefix] (fnil str "")) (update-in [:rss-name] (fnil str "rss.xml")) + (update-in [:rss-filters] (fnil seq [])) (update-in [:sass-src] (fnil str "css")) (update-in [:sass-dest] (fnil str "css")) (update-in [:post-date-format] (fnil str "yyyy-MM-dd")) @@ -299,8 +300,10 @@ (compile-archives default-params posts config) (println (blue "generating site map")) (spit (str public blog-prefix "/sitemap.xml") (sitemap/generate site-url ignored-files)) - (println (blue "generating rss")) + (println (blue "generating main rss")) (spit (str public blog-prefix "/" rss-name) (rss/make-channel config posts)) + (println (blue "generating filtered rss")) + (rss/make-filtered-channels public config posts-by-tag) (println (blue "compiling sass")) (sass/compile-sass->css! (str "resources/templates/" sass-src) diff --git a/src/cryogen_core/rss.clj b/src/cryogen_core/rss.clj index 26856fa..eca46fe 100644 --- a/src/cryogen_core/rss.clj +++ b/src/cryogen_core/rss.clj @@ -1,6 +1,7 @@ (ns cryogen-core.rss (:require [clj-rss.core :as rss] - [clojure.xml :refer [emit]]) + [clojure.xml :refer [emit]] + [text-decoration.core :refer :all]) (:import java.util.Date)) @@ -25,4 +26,10 @@ :description (:description config) :lastBuildDate (Date.) :author (:author config)}) - (posts-to-items (:site-url config) (:author config) posts))) \ No newline at end of file + (posts-to-items (:site-url config) (:author config) posts))) + +(defn make-filtered-channels [public {:keys [rss-filters blog-prefix] :as config} posts-by-tag] + (doseq [filter rss-filters] + (let [uri (str public blog-prefix "/" (name filter) ".xml")] + (println "\t-->" (cyan uri)) + (spit uri (make-channel config (get posts-by-tag filter)))))) \ No newline at end of file From 072c093342917efab7d5591247ed1ed05bcc8927 Mon Sep 17 00:00:00 2001 From: J Irving Date: Wed, 7 Jan 2015 23:54:58 -0500 Subject: [PATCH 08/10] Copy each file rather than the whole directory --- project.clj | 2 +- src/cryogen_core/io.clj | 23 +++++++++++++++++++++-- src/cryogen_core/sass.clj | 9 ++------- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/project.clj b/project.clj index 7dfa9bf..880bc08 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject cryogen-core "0.1.12" +(defproject cryogen-core "0.1.13-SNAPSHOT" :description "Cryogen's compiler" :url "https://github.com/lacarmen/cryogen-core" :license {:name "Eclipse Public License" diff --git a/src/cryogen_core/io.clj b/src/cryogen_core/io.clj index e8e90df..e554111 100644 --- a/src/cryogen_core/io.clj +++ b/src/cryogen_core/io.clj @@ -4,6 +4,15 @@ (def public "resources/public") +(defn re-filter [bool-fn re & other-res] + (let [res (conj other-res re)] + (reify java.io.FilenameFilter + (accept [this _ name] + (bool-fn (some #(re-find % name) res)))))) + +(def match-re-filter (partial re-filter some?)) +(def reject-re-filter (partial re-filter nil?)) + (defn get-resource [resource] (-> resource io/resource io/file)) @@ -33,7 +42,17 @@ (doseq [asset (fs/find-files "resources/templates/md" #".+(jpg|jpeg|png|gif)")] (io/copy asset (io/file (str public blog-prefix "/img/" (.getName asset)))))) -(defn copy-resources [{:keys [blog-prefix resources]}] +(defn copy-dir [src target ignored-files] + (fs/mkdirs target) + (let [filename-filter (apply reject-re-filter ignored-files) + files (.listFiles (io/file src) filename-filter)] + (doseq [f files] + (let [out (io/file target (.getName f))] + (if (.isDirectory f) + (copy-dir f out ignored-files) + (io/copy f out)))))) + +(defn copy-resources [{:keys [blog-prefix resources ignored-files]}] (doseq [resource resources] (let [src (str "resources/templates/" resource) target (str public blog-prefix "/" resource)] @@ -41,6 +60,6 @@ (not (.exists (io/file src))) (throw (IllegalArgumentException. (str "resource " src " not found"))) (.isDirectory (io/file src)) - (fs/copy-dir src target) + (copy-dir src target ignored-files) :else (fs/copy src target))))) diff --git a/src/cryogen_core/sass.clj b/src/cryogen_core/sass.clj index 6b3770a..93d2c2c 100644 --- a/src/cryogen_core/sass.clj +++ b/src/cryogen_core/sass.clj @@ -1,23 +1,18 @@ (ns cryogen-core.sass (:require [clojure.java.shell :refer [sh]] [clojure.java.io :as io] - [cryogen-core.io :refer [ignore]])) + [cryogen-core.io :refer [ignore match-re-filter]])) (defn sass-installed? "Checks for the installation of Sass." [] (= 0 (:exit (sh "sass" "--version")))) -(defn re-filter [re] - (reify java.io.FilenameFilter - (accept [this _ name] - (not (nil? (re-find re name)))))) - (defn find-sass-files "Given a Diretory, gets files, Filtered to those having scss or sass extention. Ignores files matching any ignored regexps." [dir ignored-files] - (let [filename-filter (re-filter #"(?i:s[ca]ss$)")] + (let [filename-filter (match-re-filter #"(?i:s[ca]ss$)")] (->> (.listFiles (io/file dir) filename-filter) (filter #(not (.isDirectory %))) (filter (ignore ignored-files)) From c26357ac119da7669d5ee2002009c497eb3a5ccf Mon Sep 17 00:00:00 2001 From: lacarmen Date: Thu, 8 Jan 2015 11:12:17 -0500 Subject: [PATCH 09/10] Update version --- project.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.clj b/project.clj index 880bc08..38afa14 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject cryogen-core "0.1.13-SNAPSHOT" +(defproject cryogen-core "0.1.13" :description "Cryogen's compiler" :url "https://github.com/lacarmen/cryogen-core" :license {:name "Eclipse Public License" From 0afc39cf354e4dc8e30e6d3039c5bf4d7ea0b7c0 Mon Sep 17 00:00:00 2001 From: Yogthos Date: Thu, 8 Jan 2015 19:55:33 -0500 Subject: [PATCH 10/10] updated to latest markdown-clj --- project.clj | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/project.clj b/project.clj index 38afa14..81aeb36 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject cryogen-core "0.1.13" +(defproject cryogen-core "0.1.14" :description "Cryogen's compiler" :url "https://github.com/lacarmen/cryogen-core" :license {:name "Eclipse Public License" @@ -12,6 +12,5 @@ [io.aviso/pretty "0.1.13"] [hiccup "1.0.5"] [selmer "0.7.8"] - [markdown-clj "0.9.61" - :exclusions [com.keminglabs/cljx]] + [markdown-clj "0.9.62"] [pandect "0.4.1"]])