diff options
| -rw-r--r-- | src/clarktown/parsers.clj | 4 | ||||
| -rw-r--r-- | src/clarktown/parsers/code_block.clj | 29 |
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 #"&" "&") + (string/replace n #"<" "<") + (string/replace n #">" ">") + (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>")))) |
