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]
|
[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
|
||||||
|
|
|
||||||
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
|
some text
|
||||||
* List
|
* List
|
||||||
|
|
||||||
## Heading 3
|
#### Heading 3
|
||||||
more text
|
more text
|
||||||
some text
|
some text
|
||||||
Simple content.
|
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