mirror of
https://github.com/journeyman-cc/smeagol.git
synced 2026-04-12 18:05:06 +00:00
implement indention
This commit is contained in:
parent
12d4661db9
commit
535465c362
4 changed files with 99 additions and 6 deletions
|
|
@ -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
|
||||
|
|
|
|||
54
src/smeagol/include/indent.clj
Normal file
54
src/smeagol/include/indent.clj
Normal 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))
|
||||
|
|
@ -96,7 +96,7 @@ more text"
|
|||
some text
|
||||
* List
|
||||
|
||||
## Heading 3
|
||||
#### Heading 3
|
||||
more text
|
||||
some text
|
||||
Simple content.
|
||||
|
|
|
|||
35
test/smeagol/test/include/indent.clj
Normal file
35
test/smeagol/test/include/indent.clj
Normal 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")))))
|
||||
Loading…
Add table
Add a link
Reference in a new issue