Finish migrating extract to nbb

This commit is contained in:
Gabriel Horner
2022-05-13 15:47:54 -04:00
parent a832564782
commit b9bbd0c605
10 changed files with 110 additions and 102 deletions

View File

@@ -26,76 +26,6 @@
([original-page-name with-id? with-timestamp?]
(gp-block/page-name->map original-page-name with-id? (db/get-db (state/get-current-repo)) with-timestamp? (state/get-date-formatter))))
(defn with-parent-and-left
[page-id blocks]
(loop [blocks (map (fn [block] (assoc block :block/level-spaces (:block/level block))) blocks)
parents [{:page/id page-id ; db id or a map {:block/name "xxx"}
:block/level 0
:block/level-spaces 0}]
result []]
(if (empty? blocks)
(map #(dissoc % :block/level-spaces) result)
(let [[block & others] blocks
level-spaces (:block/level-spaces block)
{:block/keys [uuid level parent] :as last-parent} (last parents)
parent-spaces (:block/level-spaces last-parent)
[blocks parents result]
(cond
(= level-spaces parent-spaces) ; sibling
(let [block (assoc block
:block/parent parent
:block/left [:block/uuid uuid]
:block/level level)
parents' (conj (vec (butlast parents)) block)
result' (conj result block)]
[others parents' result'])
(> level-spaces parent-spaces) ; child
(let [parent (if uuid [:block/uuid uuid] (:page/id last-parent))
block (cond->
(assoc block
:block/parent parent
:block/left parent)
;; fix block levels with wrong order
;; For example:
;; - a
;; - b
;; What if the input indentation is two spaces instead of 4 spaces
(>= (- level-spaces parent-spaces) 1)
(assoc :block/level (inc level)))
parents' (conj parents block)
result' (conj result block)]
[others parents' result'])
(< level-spaces parent-spaces)
(cond
(some #(= (:block/level-spaces %) (:block/level-spaces block)) parents) ; outdent
(let [parents' (vec (filter (fn [p] (<= (:block/level-spaces p) level-spaces)) parents))
left (last parents')
blocks (cons (assoc (first blocks)
:block/level (dec level)
:block/left [:block/uuid (:block/uuid left)])
(rest blocks))]
[blocks parents' result])
:else
(let [[f r] (split-with (fn [p] (<= (:block/level-spaces p) level-spaces)) parents)
left (first r)
parent-id (if-let [block-id (:block/uuid (last f))]
[:block/uuid block-id]
page-id)
block (cond->
(assoc block
:block/parent parent-id
:block/left [:block/uuid (:block/uuid left)]
:block/level (:block/level left)
:block/level-spaces (:block/level-spaces left)))
parents' (->> (concat f [block]) vec)
result' (conj result block)]
[others parents' result'])))]
(recur blocks parents result)))))
(defn parse-block
([block]
(parse-block block nil))