diff --git a/src/smeagol/include/resolve.clj b/src/smeagol/include/resolve.clj index 95b0ec2..7a2b3b1 100644 --- a/src/smeagol/include/resolve.clj +++ b/src/smeagol/include/resolve.clj @@ -1,5 +1,5 @@ (ns ^{:doc "Functions related to the include of markdown-paged - providing -a plugable load-content componet. This namespaces is implementation detail for +a plugable load-content componet. This namespaces is implementation detail for smeagol.include and not inteded for direct usage." :author "Michael Jerger"} smeagol.include.resolve @@ -8,7 +8,8 @@ smeagol.include and not inteded for direct usage." [com.stuartsierra.component :as component])) (s/defrecord Resolver - [type :- s/Keyword]) + [type :- s/Keyword + local-base-dir :- s/Str]) ;As schema does'nt support s/defprotocol we use the dispatcher for annotation & validation. (s/defn dispatch-by-resolver-type :- s/Keyword @@ -38,5 +39,8 @@ smeagol.include and not inteded for direct usage." (s/defn new-resolver - [type :- s/Keyword] - (map->Resolver {:type type})) + ([type :- s/Keyword] + (map->Resolver {:type type :local-base-dir nil})) + ([type :- s/Keyword + local-base-dir :- s/Str] + (map->Resolver {:type type :local-base-dir local-base-dir}))) diff --git a/src/smeagol/include/resolve_local_file.clj b/src/smeagol/include/resolve_local_file.clj new file mode 100644 index 0000000..4daaac2 --- /dev/null +++ b/src/smeagol/include/resolve_local_file.clj @@ -0,0 +1,27 @@ +(ns ^{:doc "Functions related to the include of markdown-paged - providing +a plugable load-local-include-links componet. This namespaces is implementation detail for +smeagol.include and not inteded for direct usage." + :author "Michael Jerger"} + smeagol.include.resolve-local-file + (:require + [schema.core :as s] + [smeagol.include.resolve :as resolve] + [com.stuartsierra.component :as component] + [clojure.java.io :as cjio] + [taoensso.timbre :as timbre])) + +(s/defmethod resolve/do-resolve-md :local-file + [resolver + uri :- s/Str] + (let [file-name (uri) + file-path (cjio/file (:local-base-dir resolver) file-name) + exists? (.exists (clojure.java.io/as-file file-path))] + (cond exists? + (do + (timbre/info (format "Including page '%s' from file '%s'" uri file-path)) + (slurp file-path))))) + +(s/defn + new-resolver + [local-base-dir :- s/Str] + (resolve/new-resolver :local-file local-base-dir)) diff --git a/src/smeagol/routes/wiki.clj b/src/smeagol/routes/wiki.clj index fe80349..109a2cc 100644 --- a/src/smeagol/routes/wiki.clj +++ b/src/smeagol/routes/wiki.clj @@ -20,7 +20,10 @@ [smeagol.sanity :refer [show-sanity-check-error]] [smeagol.util :as util] [smeagol.uploads :as ul] - [taoensso.timbre :as timbre])) + [taoensso.timbre :as timbre] + [com.stuartsierra.component :as component] + [smeagol.include.resolve-local-file :as resolve] + [smeagol.include :as include])) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; @@ -108,6 +111,14 @@ (edit-page request "stylesheet" ".css" "edit-css.html" "_edit-side-bar.md")) +(def md-include-system + (component/start + (component/system-map + :resolver (resolve/new-resolver util/content-dir) + :includer (component/using + (include/new-includer) + [:resolver])))) + (defn wiki-page "Render the markdown page specified in this `request`, if any. If none found, redirect to edit-page" [request] @@ -125,7 +136,10 @@ (merge (util/standard-params request) {:title page :page page - :content (md->html (slurp file-path)) + :content (md->html + (include/expand-include-md + (:includer md-include-system) + (slurp file-path))) :editable true}))) true (response/redirect (str "/edit?page=" page))))))