summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAsko Nomm <asko@Askos-MacBook-Pro.local>2021-12-12 19:52:08 -0300
committerAsko Nomm <asko@Askos-MacBook-Pro.local>2021-12-12 19:52:08 -0300
commita17bb85a5a7170efc92f110d11cff1cef43e92b2 (patch)
tree95775fc100e09d530bbf5505829e78fa67c851a4
parent6380a5281f55a69ca5029f0feeddc7ed6a12bc98 (diff)
Add code block
-rw-r--r--src/clarktown/parsers.clj4
-rw-r--r--src/clarktown/parsers/code_block.clj29
2 files changed, 32 insertions, 1 deletions
diff --git a/src/clarktown/parsers.clj b/src/clarktown/parsers.clj
index 48b19f2..bb3be45 100644
--- a/src/clarktown/parsers.clj
+++ b/src/clarktown/parsers.clj
@@ -9,6 +9,7 @@
[clarktown.parsers.horizontal-line-block :as horizontal-line-block]
[clarktown.parsers.quote-block :as quote-block]
[clarktown.parsers.heading-block :as heading-block]
+ [clarktown.parsers.code-block :as code-block]
[clarktown.parsers.paragraph-block :as paragraph-block]))
@@ -26,10 +27,11 @@
heading-block/render]}
{:matcher quote-block/is?
:renderers [quote-block/render]}
+ {:matcher code-block/is?
+ :renderers [code-block/render]}
{:renderers [bold/render
italic/render
inline-code/render
strikethrough/render
link-and-image/render
paragraph-block/render]}])
-
diff --git a/src/clarktown/parsers/code_block.clj b/src/clarktown/parsers/code_block.clj
new file mode 100644
index 0000000..9d41ae7
--- /dev/null
+++ b/src/clarktown/parsers/code_block.clj
@@ -0,0 +1,29 @@
+(ns clarktown.parsers.code-block
+ (:require
+ [clojure.string :as string]))
+
+
+(defn is?
+ "Determines whether or not we're dealing with a code block."
+ [block]
+ (and (string/starts-with? block "```")
+ (string/ends-with? block "```")))
+
+
+(defn render
+ "Renders the code block."
+ [block _]
+ (let [language (->> block
+ (re-find #"\`\`\`(\w+)")
+ second)
+ code (as-> block n
+ (string/replace-first n #"\`\`\`(\w+)?\n" "")
+ (subs n 0 (- (count n) 5))
+ (string/replace n #"&" "&amp;")
+ (string/replace n #"<" "&lt;")
+ (string/replace n #">" "&gt;")
+ (string/replace n #"\n" "<br>")
+ (string/trim n))]
+ (if language
+ (str "<pre class=\"language-" language "\"><code>" code "</code></pre>")
+ (str "<pre><code>" code "</code></pre>"))))