-
-
Notifications
You must be signed in to change notification settings - Fork 121
/
core.cljs
91 lines (80 loc) · 3.55 KB
/
core.cljs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
(ns markdown.core
(:require [markdown.common
:refer [*substring* *inhibit-separator*]]
[markdown.links
:refer [parse-reference parse-reference-link parse-footnote-link]]
[markdown.transformers
:refer [transformer-vector footer parse-metadata-headers]]))
(defn- init-transformer [{:keys [replacement-transformers custom-transformers inhibit-separator]}]
(fn [html line next-line state]
(binding [*inhibit-separator* inhibit-separator]
(let [[text new-state]
(reduce
(fn [[text state] transformer]
(transformer text (assoc state :next-line next-line)))
[line state]
(or replacement-transformers
(into transformer-vector custom-transformers)))]
(.append html text)
new-state))))
(defn format "Removed from cljs.core 0.0-1885, Ref. http://goo.gl/su7Xkj"
[fmt & args] (apply goog.string/format fmt args))
(defn parse-references [lines]
(let [references (atom {})]
(doseq [line lines]
(parse-reference-link line references))
@references))
(defn parse-footnotes [lines]
(let [footnotes (atom {:next-fn-id 1 :processed {} :unprocessed {}})]
(doseq [line lines]
(parse-footnote-link line footnotes))
@footnotes))
(defn parse-metadata [lines]
(let [[metadata lines] (split-with #(not-empty (.trim %)) lines)]
[(parse-metadata-headers metadata) lines]))
(defn md-to-html-string*
"processes input text line by line and outputs an HTML string"
[text params]
(binding [markdown.common/*substring* (fn [s n] (apply str (drop n s)))
markdown.transformers/*formatter* format]
(let [params (when params (apply (partial assoc {}) params))
lines (.split (str text "\n") "\n")
html (goog.string.StringBuffer. "")
references (when (:reference-links? params) (parse-references lines))
footnotes (when (:footnotes? params) (parse-footnotes lines))
[metadata lines] (if (:parse-meta? params) (parse-metadata lines) [nil lines])
transformer (init-transformer params)]
(loop [[line & more] lines
state (merge {:clojurescript true
:references references
:footnotes footnotes
:last-line-empty? true}
params)]
(let [line (if (:skip-next-line? state) "" line)
state
(if (:buf state)
(transformer html
(:buf state)
(:next-line state)
(-> state
(dissoc :buf :lists :next-line)
(assoc :last-line-empty? true)))
state)]
(if (not-empty more)
(recur more
(assoc (transformer html line (first more) (dissoc state :skip-next-line?))
:last-line-empty? (empty? (.trim line))))
(transformer (.append html (footer (:footnotes state))) line "" (assoc state :eof true)))))
{:metadata metadata :html (.toString html)})))
(defn md->html [text & params]
(:html (md-to-html-string* text params)))
(defn md->html-with-meta [text & params]
(md-to-html-string* text (into [:parse-meta? true] params)))
(defn ^:export mdToHtml
"Js accessible wrapper"
[& params]
(apply md->html params))
(defn ^:export mdToHtmlWithMeta
"Js accessible wrapper"
[& params]
(apply md->html-with-meta params))