implement indention

This commit is contained in:
jem 2018-05-18 20:47:15 +02:00
parent 12d4661db9
commit 535465c362
4 changed files with 99 additions and 6 deletions

View file

@ -4,7 +4,8 @@
[schema.core :as s] [schema.core :as s]
[com.stuartsierra.component :as component] [com.stuartsierra.component :as component]
[smeagol.include.parse :as parse] [smeagol.include.parse :as parse]
[smeagol.include.resolve :as resolve])) [smeagol.include.resolve :as resolve]
[smeagol.include.indent :as indent]))
(s/defrecord Includer (s/defrecord Includer
[resolver]) [resolver])
@ -19,8 +20,8 @@
[includer :- Includer [includer :- Includer
include :- parse/IncludeLink include :- parse/IncludeLink
md-src :- s/Str] md-src :- s/Str]
(let [{:keys [uri replace]} include] (let [{:keys [uri replace indent-heading indent-list]} include]
(cs/replace (cs/replace-first
md-src md-src
(re-pattern (cs/escape (re-pattern (cs/escape
replace replace
@ -28,8 +29,11 @@
\] "\\]" \] "\\]"
\( "\\(" \( "\\("
\) "\\)"})) \) "\\)"}))
(resolve/resolve-md (:resolver includer) uri)))) (indent/do-indent-list
;indent indent-list
(indent/do-indent-heading
indent-heading
(resolve/resolve-md (:resolver includer) uri))))))
(s/defn (s/defn
do-expand-includes :- s/Str do-expand-includes :- s/Str

View file

@ -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))

View file

@ -96,7 +96,7 @@ more text"
some text some text
* List * List
## Heading 3 #### Heading 3
more text more text
some text some text
Simple content. Simple content.

View file

@ -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")))))