Просмотр исходного кода

fix(export): remove leading spaces for block-src when no-indent

rcmerci 1 год назад
Родитель
Сommit
14df4e80ac
1 измененных файлов с 29 добавлено и 12 удалено
  1. 29 12
      src/main/frontend/handler/export/text.cljs

+ 29 - 12
src/main/frontend/handler/export/text.cljs

@@ -103,19 +103,36 @@
         (newline* 1)])
      l)))
 
+(defn- remove-max-prefix-spaces
+  [lines]
+  (let [common-prefix-spaces
+        (reduce
+         (fn [r line]
+           (if (string/blank? line)
+             r
+             (let [leading-spaces (re-find #"^\s+" line)]
+               (if (nil? r)
+                 leading-spaces
+                 (if (string/starts-with? r leading-spaces)
+                   leading-spaces
+                   r)))))
+         nil
+         lines)
+        pattern (re-pattern (str "^" common-prefix-spaces))]
+    (mapv (fn [line] (string/replace-first line pattern "")) lines)))
+
 (defn- block-src
-  [{:keys [lines language full_content]}]
-  (if (= "no-indent" (get-in *state* [:export-options :indent-style]))
-    ;; when "no-indent", just use :full_content in 'Src' ast
-    [(raw-text full_content) (newline* 1)]
-
-    (let [level (dec (get *state* :current-level 1))]
-      (concatv
-       [(indent-with-2-spaces level) (raw-text "```")]
-       (when language [(raw-text language)])
-       [(newline* 1)]
-       (mapv raw-text lines)
-       [(indent-with-2-spaces level) (raw-text "```") (newline* 1)]))))
+  [{:keys [lines language]}]
+  (let [level (dec (get *state* :current-level 1))
+        lines* (if (= "no-indent" (get-in *state* [:export-options :indent-style]))
+                 (remove-max-prefix-spaces lines)
+                 lines)]
+    (concatv
+     [(indent-with-2-spaces level) (raw-text "```")]
+     (when language [(raw-text language)])
+     [(newline* 1)]
+     (mapv raw-text lines*)
+     [(indent-with-2-spaces level) (raw-text "```") (newline* 1)])))
 
 (defn- block-quote
   [block-coll]