refactor parse out of include ns

This commit is contained in:
jem 2018-05-18 12:33:07 +02:00
parent 4a4269d202
commit 6714dc04bf
4 changed files with 133 additions and 90 deletions

View file

@ -2,7 +2,8 @@
(:require (:require
[schema.core :as s] [schema.core :as s]
[com.stuartsierra.component :as component] [com.stuartsierra.component :as component]
[smeagol.include.resolver :as resolver])) [smeagol.include.parse :as parse]
[smeagol.include.resolve :as resolve]))
(s/defrecord Includer (s/defrecord Includer
[resolver]) [resolver])
@ -15,52 +16,12 @@
(extend-type Includer (extend-type Includer
IncludeMd IncludeMd
(expand-include-md [includer md-src] (expand-include-md [includer md-src]
;parse md-src (let [includes (parse/parse-include-md md-src)]
;resolve found includes ;resolve found includes
;indent & integrate ;indent & integrate
md-src)) md-src)))
(s/defn (s/defn
new-includer new-includer
[] []
(map->Includer {})) (map->Includer {}))
(def IncludeLink
{:uri s/Str
:indent-heading s/Num
:indent-list s/Num})
(s/defn
convert-indent-to-int :- s/Num
[indents :- [s/Str]]
(if (some? indents)
(Integer/valueOf (nth indents 2))
0))
(s/defn
parse-indent-list
[md-src :- s/Str]
(re-matches #".*(:indent-list (\d)).*" md-src))
(s/defn
parse-indent-heading
[md-src :- s/Str]
(re-matches #".*(:indent-heading (\d)).*" md-src))
(s/defn
parse-include-link
[md-src :- s/Str]
(re-seq #".*&\[\w*(.*)\w*\]\((.*)\).*" md-src))
(s/defn
parse-include-md :- [IncludeLink]
[md-src :- s/Str]
(vec
(map
(fn [parse-element]
(let [uri (nth parse-element 2)
indents-text (nth parse-element 1)]
{:uri uri
:indent-heading (convert-indent-to-int (parse-indent-heading indents-text))
:indent-list (convert-indent-to-int (parse-indent-list indents-text))}))
(parse-include-link md-src))))

View file

@ -0,0 +1,43 @@
(ns smeagol.include.parse
(:require
[schema.core :as s]))
(def IncludeLink
{:uri s/Str
:indent-heading s/Num
:indent-list s/Num})
(s/defn
convert-indent-to-int :- s/Num
[indents :- [s/Str]]
(if (some? indents)
(Integer/valueOf (nth indents 2))
0))
(s/defn
parse-indent-list
[md-src :- s/Str]
(re-matches #".*(:indent-list (\d)).*" md-src))
(s/defn
parse-indent-heading
[md-src :- s/Str]
(re-matches #".*(:indent-heading (\d)).*" md-src))
(s/defn
parse-include-link
[md-src :- s/Str]
(re-seq #".*&\[\w*(.*)\w*\]\((.*)\).*" md-src))
(s/defn
parse-include-md :- [IncludeLink]
[md-src :- s/Str]
(vec
(map
(fn [parse-element]
(let [uri (nth parse-element 2)
indents-text (nth parse-element 1)]
{:uri uri
:indent-heading (convert-indent-to-int (parse-indent-heading indents-text))
:indent-list (convert-indent-to-int (parse-indent-list indents-text))}))
(parse-include-link md-src))))

View file

@ -2,7 +2,7 @@
(:require [clojure.test :refer :all] (:require [clojure.test :refer :all]
[schema.core :as s] [schema.core :as s]
[com.stuartsierra.component :as component] [com.stuartsierra.component :as component]
[smeagol.include.resolver :as resolver] [smeagol.include.resolve :as resolve]
[smeagol.include :as sut])) [smeagol.include :as sut]))
(def include-simple (def include-simple
@ -40,49 +40,7 @@ some text
&[](./simple.md) &[](./simple.md)
more text.") more text.")
(s/defmethod resolve/do-resolve-md :test-mock
(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 0, :indent-list 0}]
(sut/parse-include-md
include-surounding-simple)))
(is
(= [{:uri "./with-heading.md", :indent-heading 0, :indent-list 0}]
(sut/parse-include-md
include-heading-0)))
(is
(= [{:uri "./with-heading-and-list.md", :indent-heading 1, :indent-list 1}]
(sut/parse-include-md
include-heading-list-1)))
(is
(= [{:uri "./with-heading-and-list.md", :indent-heading 0, :indent-list 0}]
(sut/parse-include-md
include-heading-list-0)))
(is
(= [{:uri "./simple.md", :indent-heading 0, :indent-list 0}]
(sut/parse-include-md
include-invalid-indent)))
(is
(= [{:uri "./with-heading-and-list.md", :indent-heading 2, :indent-list 3}]
(sut/parse-include-md
include-spaced-indent)))
(is
(= [{:uri "./with-heading-and-list.md",
:indent-heading 2,
:indent-list 3}
{:uri "./simple.md", :indent-heading 0, :indent-list 0}]
(sut/parse-include-md
multi)))))
(s/defmethod resolver/do-resolve-md :test-mock
[resolver [resolver
uri :- s/Str] uri :- s/Str]
(cond (cond
@ -90,7 +48,7 @@ more text.")
(def system-under-test (def system-under-test
(component/system-map (component/system-map
:resolver (resolver/new-resolver :test-mock) :resolver (resolve/new-resolver :test-mock)
:includer (component/using :includer (component/using
(sut/new-includer) (sut/new-includer)
{:resolver :resolver}))) {:resolver :resolver})))

View file

@ -0,0 +1,81 @@
(ns smeagol.test.include.parse
(:require [clojure.test :refer :all]
[schema.core :as s]
[smeagol.include.parse :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-list 0 :indent-heading 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 2 :indent-list 33 ](./with-heading-and-list.md)")
(def multi
"# Heading1
&[ :indent-heading 2 :indent-list 33 ](./with-heading-and-list.md)
some text
&[](./simple.md)
more text.")
(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 0, :indent-list 0}]
(sut/parse-include-md
include-surounding-simple)))
(is
(= [{:uri "./with-heading.md", :indent-heading 0, :indent-list 0}]
(sut/parse-include-md
include-heading-0)))
(is
(= [{:uri "./with-heading-and-list.md", :indent-heading 1, :indent-list 1}]
(sut/parse-include-md
include-heading-list-1)))
(is
(= [{:uri "./with-heading-and-list.md", :indent-heading 0, :indent-list 0}]
(sut/parse-include-md
include-heading-list-0)))
(is
(= [{:uri "./simple.md", :indent-heading 0, :indent-list 0}]
(sut/parse-include-md
include-invalid-indent)))
(is
(= [{:uri "./with-heading-and-list.md", :indent-heading 2, :indent-list 3}]
(sut/parse-include-md
include-spaced-indent)))
(is
(= [{:uri "./with-heading-and-list.md",
:indent-heading 2,
:indent-list 3}
{:uri "./simple.md", :indent-heading 0, :indent-list 0}]
(sut/parse-include-md
multi)))))