diff --git a/src/smeagol/include.clj b/src/smeagol/include.clj index 440f1ab..41aaf99 100644 --- a/src/smeagol/include.clj +++ b/src/smeagol/include.clj @@ -4,7 +4,8 @@ [schema.core :as s] [com.stuartsierra.component :as component] [smeagol.include.parse :as parse] - [smeagol.include.resolve :as resolve])) + [smeagol.include.resolve :as resolve] + [smeagol.include.indent :as indent])) (s/defrecord Includer [resolver]) @@ -19,8 +20,8 @@ [includer :- Includer include :- parse/IncludeLink md-src :- s/Str] - (let [{:keys [uri replace]} include] - (cs/replace + (let [{:keys [uri replace indent-heading indent-list]} include] + (cs/replace-first md-src (re-pattern (cs/escape replace @@ -28,8 +29,11 @@ \] "\\]" \( "\\(" \) "\\)"})) - (resolve/resolve-md (:resolver includer) uri)))) - ;indent + (indent/do-indent-list + indent-list + (indent/do-indent-heading + indent-heading + (resolve/resolve-md (:resolver includer) uri)))))) (s/defn do-expand-includes :- s/Str diff --git a/src/smeagol/include/indent.clj b/src/smeagol/include/indent.clj new file mode 100644 index 0000000..6967d19 --- /dev/null +++ b/src/smeagol/include/indent.clj @@ -0,0 +1,54 @@ +(ns smeagol.include.indent + (:require + [clojure.string :as cs] + [schema.core :as s])) + +(s/defn + parse-list + [md-resolved :- s/Str] + (distinct + (into + (re-seq #"((^|\R? *)([\*\+-] ))" md-resolved) + (re-seq #"((^|\R? *)([0-9]+\. ))" md-resolved)))) + +(s/defn + parse-heading + [md-resolved :- s/Str] + (distinct + (re-seq #"((^|\R?)(#+ ))" md-resolved))) + +(s/defn + do-indent :- s/Str + [indent :- s/Num + indentor :- s/Str + elements + md-resolved :- s/Str] + (loop [result md-resolved + elements elements] + (if (empty? elements) + result + (let [element (first elements) + replace (nth element 1) + start (nth element 2) + end (nth element 3)] + (recur + (cs/replace + result + (re-pattern (cs/escape + replace + {\* "\\*" + \n "\\n"})) + (str start (apply str (repeat indent indentor)) end)) + (rest elements)))))) + +(s/defn + do-indent-heading :- s/Str + [indent :- s/Num + md-resolved :- s/Str] + (do-indent indent "#" (parse-heading md-resolved) md-resolved)) + +(s/defn + do-indent-list :- s/Str + [indent :- s/Num + md-resolved :- s/Str] + (do-indent indent " " (parse-list md-resolved) md-resolved)) diff --git a/test/smeagol/test/include.clj b/test/smeagol/test/include.clj index ff3e8e6..3a037f1 100644 --- a/test/smeagol/test/include.clj +++ b/test/smeagol/test/include.clj @@ -96,7 +96,7 @@ more text" some text * List -## Heading 3 +#### Heading 3 more text some text Simple content. diff --git a/test/smeagol/test/include/indent.clj b/test/smeagol/test/include/indent.clj new file mode 100644 index 0000000..b4ca363 --- /dev/null +++ b/test/smeagol/test/include/indent.clj @@ -0,0 +1,35 @@ +(ns smeagol.test.include.indent + (:require [clojure.test :refer :all] + [smeagol.include.indent :as sut])) + +(deftest test-parse-heading + (testing + (is (= '(["# " "# " "" "# "]) + (sut/parse-heading "# h1"))) + (is (= '(["\n# " "\n# " "\n" "# "]) + (sut/parse-heading "\n# h1"))))) + +(deftest test-indent-heading + (testing + (is (= "# h1" + (sut/do-indent-heading 0 "# h1"))) + (is (= "### h1" + (sut/do-indent-heading 2 "# h1"))) + (is (= "\n### h1" + (sut/do-indent-heading 2 "\n# h1"))))) + +(deftest test-parse-list + (testing + (is (= '([" * " " * " " " "* "]) + (sut/parse-list " * list"))) + (is (= '(["\n * " "\n * " "\n " "* "]) + (sut/parse-list "\n * list"))))) + +(deftest test-indent-list + (testing + (is (= " * list" + (sut/do-indent-list 0 " * list"))) + (is (= " * list" + (sut/do-indent-list 2 " * list"))) + (is (= "\n * list" + (sut/do-indent-list 2 "\n * list")))))