summaryrefslogtreecommitdiff
path: root/src/clarktown/correctors
diff options
context:
space:
mode:
Diffstat (limited to 'src/clarktown/correctors')
-rw-r--r--src/clarktown/correctors/atx_heading_block.clj2
-rw-r--r--src/clarktown/correctors/indented_code_block.clj57
2 files changed, 58 insertions, 1 deletions
diff --git a/src/clarktown/correctors/atx_heading_block.clj b/src/clarktown/correctors/atx_heading_block.clj
index 6668700..5a5f713 100644
--- a/src/clarktown/correctors/atx_heading_block.clj
+++ b/src/clarktown/correctors/atx_heading_block.clj
@@ -20,7 +20,7 @@
there's no empty newline above, we need to create one, and
so this function must then return `true`."
[lines line index]
- (and (is-atx-heading? (string/trim line))
+ (and (is-atx-heading? line)
(> index 0)
(not (= (-> (nth lines (- index 1))
string/trim) ""))
diff --git a/src/clarktown/correctors/indented_code_block.clj b/src/clarktown/correctors/indented_code_block.clj
new file mode 100644
index 0000000..47deeb7
--- /dev/null
+++ b/src/clarktown/correctors/indented_code_block.clj
@@ -0,0 +1,57 @@
+(ns clarktown.correctors.indented-code-block
+ (:require
+ [clojure.string :as string]
+ [clarktown.matchers.list-block :as list-block-matcher]))
+
+
+(defn- in-code-block?
+ "Determines whether the current `line` is within a code block."
+ [lines index]
+ (->> (take index lines)
+ (filter #(string/starts-with? (string/trim %) "```"))
+ count
+ odd?))
+
+
+(defn newline-above?
+ "Determines whether there's a need for an empty new line
+ above the `line` at the current `index`. In the case of a
+ code block, which starts with three backticks (```), if there's
+ no empty newline above, we need to create one, and so this
+ function must then return `true`."
+ [lines line index]
+ (let [space-count (count (take-while #{\space} line))
+ not-first? (> index 0)
+ prev-line (when not-first?
+ (nth lines (- index 1)))
+ space-count-prev-line (count (take-while #{\space} prev-line))]
+ (and (>= space-count 4)
+ not-first?
+ (not (in-code-block? lines index))
+ (not (list-block-matcher/match? line))
+ (not (list-block-matcher/match? prev-line))
+ (not (>= space-count-prev-line 4))
+ (not (= (-> prev-line
+ string/trim)
+ "")))))
+
+(defn newline-below?
+ "Determines whether there's a need for an empty new line
+ below the `line` at the current `index`. In the case of a
+ code block, which ends with three backticks (```), if there's
+ no empty newline above, we need to create one, and so this
+ function must then return `true`."
+ [lines line index]
+ (let [space-count (count (take-while #{\space} line))
+ not-last? (< index (- (count lines) 1))
+ next-line (when not-last?
+ (nth lines (+ index 1)))
+ space-count-next-line (count (take-while #{\space} next-line))]
+ (and (>= space-count 4)
+ not-last?
+ (not (in-code-block? lines index))
+ (not (list-block-matcher/match? line))
+ (not (list-block-matcher/match? next-line))
+ (not (>= space-count-next-line 4))
+ (not (= (-> next-line
+ string/trim) "")))))