diff --git a/doc/include.md b/doc/include.md index 8614fc9..f8b115c 100644 --- a/doc/include.md +++ b/doc/include.md @@ -4,7 +4,8 @@ The user can include page title, abstract or the whole content in a given page. ## Thoughts & Questions * Which include syntax should be used? - * page include can be definde alongsite of image includes - sth. like `#[indent-level](relative or absolute url)` + * page include can be definde alongsite of image includes - sth. like + `&[:indent-heading s/Num :indent-list s/Num](relative or absolute url s/Str)` * Which kind of urls should we accept for page includes? * relative local urls (we will need some care to prohibit directory traversal ...) * absolute github / gitlab / gitblit urls without authentication. diff --git a/src/smeagol/include.clj b/src/smeagol/include.clj index 80d9640..6052ff6 100644 --- a/src/smeagol/include.clj +++ b/src/smeagol/include.clj @@ -24,3 +24,19 @@ new-includer [] (map->Includer {})) + +(def IncludeLink + {:uri s/Str + :indent-heading s/Num + :indent-list s/Num}) + +(s/defn + parse-include-md :- [IncludeLink] + [md-src :- s/Str] + (vec + (map + (fn [parse-element] + {:uri (nth parse-element 5) + :indent-heading 0 + :indent-list 0}) + (re-seq #"&\[(:indent-heading (d*))?w*(:indent-list (d*))?\]\((.*)\)" md-src)))) diff --git a/test/smeagol/test/include.clj b/test/smeagol/test/include.clj index 749482b..99ee31d 100644 --- a/test/smeagol/test/include.clj +++ b/test/smeagol/test/include.clj @@ -5,6 +5,49 @@ [smeagol.include.resolver :as resolver] [smeagol.include :as sut])) +(def include-simple + "# Heading1 +&[](./simple.md)") + +(def include-surounding-simple + "# Heading1 +Some surounding &[](./simple.md) text") + +(def include-heading-0 + "# Heading1 +&[:indent-heading 0](./with-heading.md)") + +(def include-heading-list-1 + "# Heading1 +&[:indent-heading 1 :indent-list 1](./with-heading-and-list.md)") + +(def include-heading-list-0 + "# Heading1 +&[:indent-heading 0 :indent-list 0](./with-heading-and-list.md)") + +(def include-invalid-indent + "# Heading1 +&[ invalid input should default to indent 0 ](./simple.md)") + +(def include-spaced-indent + "# Heading1 +&[ :indent-heading 0 :indent-list 0 ](./with-heading-and-list.md)") + + +(deftest test-parse-include-md + (testing "parse include links" + (is + (= [] + (sut/parse-include-md "# Heading"))) + (is + (= [{:uri "./simple.md", :indent-heading 0, :indent-list 0}] + (sut/parse-include-md + include-simple))) + (is + (= [{:uri "./simple.md", :indent-heading 1, :indent-list 1}] + (sut/parse-include-md + include-heading-list-1))))) + (s/defmethod resolver/do-resolve-md :test-mock [resolver uri :- s/Str] @@ -19,14 +62,13 @@ {:resolver :resolver}))) (deftest test-expand-include-md - (testing "Rewriting of local links" + (testing "The whole integration of include" (is (= "# Heading" (sut/expand-include-md (:includer system-under-test) "# Heading"))) (is (= "# Heading 1 - Simple content." +Simple content." (sut/expand-include-md (:includer system-under-test) - "# Heading1 -#[](.simple.md)"))))) + include-simple)))))