Files
logseq/src/main/frontend/util/list.cljs
2022-11-08 23:30:52 +08:00

30 lines
1.1 KiB
Clojure

(ns frontend.util.list
"High level list operations for use in editor"
(:require [clojure.string :as string]))
(defn- newline?
[line]
(or (= line "\n") (= line "\r\n")))
(defn re-order-items
[lines start-idx]
(loop [lines lines
idx start-idx
result []
double-newlines? false]
(let [[line & others] lines]
(if (empty? lines)
(->> result
(map (fn [line] (if (newline? line) "" line)))
(string/join "\n"))
(let [[_ num-str] (re-find #"^(\d+){1}\." line)
num (if num-str (parse-long num-str) nil)
double-newlines?' (or double-newlines?
(and (newline? line) (seq others) (newline? (first others))))
[idx' result'] (if (and (not double-newlines?') num)
(let [idx' (inc idx)
line' (string/replace-first line (str num ".") (str idx' "."))]
[idx' (conj result line')])
[idx (conj result line)])]
(recur others idx' result' double-newlines?'))))))