diff --git a/src/smeagol/routes/wiki.clj b/src/smeagol/routes/wiki.clj index 51151bd..da1ff41 100644 --- a/src/smeagol/routes/wiki.clj +++ b/src/smeagol/routes/wiki.clj @@ -124,6 +124,7 @@ (merge (util/standard-params request) {:title page :page page + :side-bar (util/local-links (util/md->html "/content/_side-bar.md")) :content (util/local-links (util/md->html file-name)) :editable true}))) true (response/redirect (str "/edit?page=" page))))) diff --git a/src/smeagol/util.clj b/src/smeagol/util.clj index 8a45339..67f7203 100644 --- a/src/smeagol/util.clj +++ b/src/smeagol/util.clj @@ -37,17 +37,23 @@ (md/md-to-html-string (io/slurp-resource filename))) +;; Error to show if text to be rendered is nil. +(def no-text-error "No text: does the file exist?") + + (defn local-links "Rewrite text in `html-src` surrounded by double square brackets as a local link into this wiki." [^String html-src] - (cs/replace html-src #"\[\[[^\[\]]*\]\]" - #(let [text (clojure.string/replace %1 #"[\[\]]" "") - encoded (url-encode text) - ;; I use '\_' to represent '_' in wiki markup, because - ;; '_' is meaningful in Markdown. However, this needs to - ;; be stripped out when interpreting local links. - munged (cs/replace encoded #"%26%2395%3B" "_")] - (format "%s" munged text)))) + (if html-src + (cs/replace html-src #"\[\[[^\[\]]*\]\]" + #(let [text (clojure.string/replace %1 #"[\[\]]" "") + encoded (url-encode text) + ;; I use '\_' to represent '_' in wiki markup, because + ;; '_' is meaningful in Markdown. However, this needs to + ;; be stripped out when interpreting local links. + munged (cs/replace encoded #"%26%2395%3B" "_")] + (format "%s" munged text))) + no-text-error)) (defn standard-params diff --git a/test/smeagol/test/util.clj b/test/smeagol/test/util.clj new file mode 100644 index 0000000..d5e94f9 --- /dev/null +++ b/test/smeagol/test/util.clj @@ -0,0 +1,13 @@ +(ns smeagol.test.util + (:use clojure.test + ring.mock.request + smeagol.util)) + +(deftest test-local-links + (testing "Rewriting of local links" + (is (= (local-links nil) no-text-error) "Should NOT fail with a no pointer exception!") + (is (= (local-links "") "") "Empty string should pass through unchanged.") + (is (= (local-links "[[froboz]]") "froboz") "Local link should be rewritten.") + (let [text (str "# This is a heading" + "[This is a foreign link](http://to.somewhere)")] + (is (= (local-links text) text) "Foreign links should be unchanged"))))