mirror of https://github.com/logseq/logseq
refactor(outliner): blocks->vec-tree
parent
14836c932c
commit
d88542f412
|
@ -2139,7 +2139,7 @@
|
|||
sidebar? (:sidebar? config)
|
||||
ref? (:ref? config)
|
||||
custom-query? (:custom-query? config)
|
||||
blocks->vec-tree #(if (or custom-query? ref?) % (block-handler/blocks->vec-tree %))
|
||||
blocks->vec-tree #(if (or custom-query? ref?) % (block-handler/blocks->vec-tree-by-parent %))
|
||||
blocks (blocks->vec-tree blocks)]
|
||||
(when (seq blocks)
|
||||
[:div.blocks-container.flex-1
|
||||
|
|
|
@ -11,7 +11,9 @@
|
|||
[medley.core :as medley]
|
||||
[frontend.format.block :as block]))
|
||||
|
||||
(defn blocks->vec-tree [col]
|
||||
(defn blocks->vec-tree
|
||||
"Deprecated: use blocks->vec-tree-by-parent instead."
|
||||
[col]
|
||||
(let [col (map (fn [h] (cond->
|
||||
h
|
||||
(not (:block/dummy? h))
|
||||
|
@ -60,6 +62,56 @@
|
|||
other-children)]
|
||||
(recur others children))))))))
|
||||
|
||||
(defn- get-all-refs
|
||||
[block]
|
||||
(let [refs (if-let [refs (seq (:block/refs-with-children block))]
|
||||
refs
|
||||
(concat
|
||||
(:block/refs block)
|
||||
(:block/tags block)))]
|
||||
(distinct refs)))
|
||||
|
||||
(defn prepare-blocks
|
||||
"Preparing blocks: reverse, update some keys"
|
||||
[blocks]
|
||||
(loop [[f & r] blocks
|
||||
new (list)]
|
||||
(if (nil? f)
|
||||
new
|
||||
(let [f (cond-> f
|
||||
(not (:block/dummy? f))
|
||||
(dissoc f :block/meta))]
|
||||
(recur r (cons f new))))))
|
||||
|
||||
(defn blocks->vec-tree-by-parent
|
||||
[col]
|
||||
(let [blocks (prepare-blocks col)]
|
||||
(loop [[f & r] blocks
|
||||
tree (list)
|
||||
parent? false]
|
||||
(if (nil? f)
|
||||
tree
|
||||
(let [{:block/keys [parent left]} f
|
||||
f (assoc f :block/refs-with-children
|
||||
(->> (get-all-refs f) (remove nil?)))]
|
||||
(cond
|
||||
parent?
|
||||
(let [refs-with-children (->> (mapcat get-all-refs (cons f tree))
|
||||
(remove nil?)
|
||||
distinct)
|
||||
new-ks {:block/children tree
|
||||
:block/refs-with-children refs-with-children}
|
||||
f (-> (merge f new-ks) (list))]
|
||||
(if (not= parent left)
|
||||
(recur r f false)
|
||||
(recur r f true)))
|
||||
|
||||
(not= parent left)
|
||||
(recur r (conj tree f) false)
|
||||
|
||||
(= parent left) ; first child of parent
|
||||
(recur r (conj tree f) true)))))))
|
||||
|
||||
;; recursively with children content for tree
|
||||
(defn get-block-content-rec
|
||||
([block]
|
||||
|
|
|
@ -10,296 +10,4 @@
|
|||
|
||||
|
||||
|
||||
'({:file/path "logseq/config.edn", :file/last-modified-at 1616577680877}
|
||||
{:file/path "logseq/metadata.edn",
|
||||
:file/last-modified-at 1616577680819}
|
||||
{:file/path "logseq/custom.css", :file/last-modified-at 1616577680873}
|
||||
{:file/path "journals/2021_03_24.md",
|
||||
:file/last-modified-at 1616577697190}
|
||||
{:file/path "pages/contents.md", :file/last-modified-at 1616577680876}
|
||||
{:block/name "mar 24th, 2021",
|
||||
:block/original-name "Mar 24th, 2021",
|
||||
:block/file [:file/path "journals/2021_03_24.md"],
|
||||
:block/journal? true,
|
||||
:block/journal-day 20210324,
|
||||
:block/properties {:title "Mar 24th, 2021"},
|
||||
:block/uuid #uuid "605bffeb-c7e6-4c89-a173-0d14e23f8c8d",
|
||||
:block/refs ()}
|
||||
{:block/name "contents",
|
||||
:block/original-name "Contents",
|
||||
:block/file [:file/path "pages/contents.md"],
|
||||
:block/journal? false,
|
||||
:block/journal-day 0,
|
||||
:block/uuid #uuid "605bffeb-4906-43cc-8964-2f5f994cae84",
|
||||
:block/refs ()}
|
||||
{:block/uuid #uuid "605bffeb-6dd8-4d14-8caf-0151cdd754a7",
|
||||
:block/refs ()}
|
||||
{:block/uuid #uuid "605bffeb-6e6b-40b1-9330-362a8983dbb8",
|
||||
:block/refs ()}
|
||||
{:block/uuid #uuid "605bffeb-5046-437b-919a-1cbcd25355ec",
|
||||
:block/refs ()}
|
||||
{:block/uuid #uuid "605bffeb-978a-4503-b030-6fa988b3ae85",
|
||||
:block/refs ()}
|
||||
{:block/uuid #uuid "605bffeb-6df0-4bea-9490-c4ce5f0a059d",
|
||||
:block/refs ()}
|
||||
{:block/uuid #uuid "605bffeb-0178-4bdb-a877-f5b5f3e44748",
|
||||
:block/refs ()}
|
||||
{:block/uuid #uuid "605bffeb-7715-4196-9c06-a0845f03da6a",
|
||||
:block/refs ()}
|
||||
{:block/uuid #uuid "605bffeb-e9d9-43e1-9392-9f0497c3c53b",
|
||||
:block/refs ()}
|
||||
{:block/uuid #uuid "605bffeb-3de5-4ca6-8d3b-cd85c292ae88",
|
||||
:block/refs ()}
|
||||
{:block/uuid #uuid "605bffeb-abf0-456b-bc10-80be0ab4f849",
|
||||
:block/refs ()}
|
||||
{:block/pre-block? true,
|
||||
:block/uuid #uuid "605bffeb-6dd8-4d14-8caf-0151cdd754a7",
|
||||
:block/left [:block/name "mar 24th, 2021"],
|
||||
:block/refs (),
|
||||
:block/body
|
||||
({:block/uuid #uuid "605bffeb-6e6b-40b1-9330-362a8983dbb8",
|
||||
:block/refs (),
|
||||
:block/anchor "level_1",
|
||||
:block/children
|
||||
#{[:block/uuid #uuid "605bffeb-5046-437b-919a-1cbcd25355ec"]},
|
||||
:block/body [],
|
||||
:block/meta
|
||||
{:timestamps [], :properties [], :start-pos 31, :end-pos 42},
|
||||
:block/level 2,
|
||||
:block/tags [],
|
||||
:block/title [["Plain" "level 1"]]}
|
||||
{:block/uuid #uuid "605bffeb-5046-437b-919a-1cbcd25355ec",
|
||||
:block/refs (),
|
||||
:block/anchor "level_2",
|
||||
:block/children
|
||||
#{[:block/uuid #uuid "605bffeb-978a-4503-b030-6fa988b3ae85"]
|
||||
[:block/uuid #uuid "605bffeb-6df0-4bea-9490-c4ce5f0a059d"]},
|
||||
:block/body [],
|
||||
:block/meta
|
||||
{:timestamps [], :properties [], :start-pos 42, :end-pos 54},
|
||||
:block/level 3,
|
||||
:block/tags [],
|
||||
:block/title [["Plain" "level 2"]]}
|
||||
{:block/uuid #uuid "605bffeb-978a-4503-b030-6fa988b3ae85",
|
||||
:block/refs (),
|
||||
:block/anchor "level_3",
|
||||
:block/children #{},
|
||||
:block/body [],
|
||||
:block/meta
|
||||
{:timestamps [], :properties [], :start-pos 54, :end-pos 67},
|
||||
:block/level 4,
|
||||
:block/tags [],
|
||||
:block/title [["Plain" "level 3"]]}
|
||||
{:block/uuid #uuid "605bffeb-6df0-4bea-9490-c4ce5f0a059d",
|
||||
:block/refs (),
|
||||
:block/anchor "",
|
||||
:block/children #{},
|
||||
:block/body [],
|
||||
:block/meta
|
||||
{:timestamps [], :properties [], :start-pos 67, :end-pos 72},
|
||||
:block/level 4,
|
||||
:block/tags [],
|
||||
:block/title []}),
|
||||
:block/meta {:start-pos 0, :end-pos 31},
|
||||
:block/format :markdown,
|
||||
:block/level 2,
|
||||
:block/content "---\ntitle: Mar 24th, 2021\n---\n\n",
|
||||
:block/parent [:block/name "mar 24th, 2021"],
|
||||
:block/page [:block/name "mar 24th, 2021"],
|
||||
:block/file [:file/path "journals/2021_03_24.md"]}
|
||||
{:block/uuid #uuid "605bffeb-6e6b-40b1-9330-362a8983dbb8",
|
||||
:block/left
|
||||
[:block/uuid #uuid "605bffeb-6dd8-4d14-8caf-0151cdd754a7"],
|
||||
:block/refs (),
|
||||
:block/anchor "level_1",
|
||||
:block/children
|
||||
#{[:block/uuid #uuid "605bffeb-5046-437b-919a-1cbcd25355ec"]},
|
||||
:block/body [],
|
||||
:block/meta
|
||||
{:timestamps [], :properties [], :start-pos 31, :end-pos 42},
|
||||
:block/format :markdown,
|
||||
:block/level 2,
|
||||
:block/tags [],
|
||||
:block/title [["Plain" "level 1"]],
|
||||
:block/content "## level 1\n",
|
||||
:block/parent [:block/name "mar 24th, 2021"],
|
||||
:block/page [:block/name "mar 24th, 2021"],
|
||||
:block/file [:file/path "journals/2021_03_24.md"]}
|
||||
{:block/uuid #uuid "605bffeb-5046-437b-919a-1cbcd25355ec",
|
||||
:block/left
|
||||
[:block/uuid #uuid "605bffeb-6e6b-40b1-9330-362a8983dbb8"],
|
||||
:block/refs (),
|
||||
:block/anchor "level_2",
|
||||
:block/children
|
||||
#{[:block/uuid #uuid "605bffeb-978a-4503-b030-6fa988b3ae85"]
|
||||
[:block/uuid #uuid "605bffeb-6df0-4bea-9490-c4ce5f0a059d"]},
|
||||
:block/body [],
|
||||
:block/meta
|
||||
{:timestamps [], :properties [], :start-pos 42, :end-pos 54},
|
||||
:block/format :markdown,
|
||||
:block/level 3,
|
||||
:block/tags [],
|
||||
:block/title [["Plain" "level 2"]],
|
||||
:block/content "### level 2\n",
|
||||
:block/parent
|
||||
[:block/uuid #uuid "605bffeb-6e6b-40b1-9330-362a8983dbb8"],
|
||||
:block/page [:block/name "mar 24th, 2021"],
|
||||
:block/file [:file/path "journals/2021_03_24.md"]}
|
||||
{:block/uuid #uuid "605bffeb-978a-4503-b030-6fa988b3ae85",
|
||||
:block/left
|
||||
[:block/uuid #uuid "605bffeb-5046-437b-919a-1cbcd25355ec"],
|
||||
:block/refs (),
|
||||
:block/anchor "level_3",
|
||||
:block/children #{},
|
||||
:block/body [],
|
||||
:block/meta
|
||||
{:timestamps [], :properties [], :start-pos 54, :end-pos 67},
|
||||
:block/format :markdown,
|
||||
:block/level 4,
|
||||
:block/tags [],
|
||||
:block/title [["Plain" "level 3"]],
|
||||
:block/content "#### level 3\n",
|
||||
:block/parent
|
||||
[:block/uuid #uuid "605bffeb-5046-437b-919a-1cbcd25355ec"],
|
||||
:block/page [:block/name "mar 24th, 2021"],
|
||||
:block/file [:file/path "journals/2021_03_24.md"]}
|
||||
{:block/uuid #uuid "605bffeb-6df0-4bea-9490-c4ce5f0a059d",
|
||||
:block/left
|
||||
[:block/uuid #uuid "605bffeb-978a-4503-b030-6fa988b3ae85"],
|
||||
:block/refs (),
|
||||
:block/anchor "",
|
||||
:block/children #{},
|
||||
:block/body [],
|
||||
:block/meta
|
||||
{:timestamps [], :properties [], :start-pos 67, :end-pos 72},
|
||||
:block/format :markdown,
|
||||
:block/level 4,
|
||||
:block/tags [],
|
||||
:block/title [],
|
||||
:block/content "####\n",
|
||||
:block/parent
|
||||
[:block/uuid #uuid "605bffeb-5046-437b-919a-1cbcd25355ec"],
|
||||
:block/page [:block/name "mar 24th, 2021"],
|
||||
:block/file [:file/path "journals/2021_03_24.md"]}
|
||||
{:block/uuid #uuid "605bffeb-0178-4bdb-a877-f5b5f3e44748",
|
||||
:block/left [:block/name "contents"],
|
||||
:block/refs (),
|
||||
:block/anchor "What-27-s_Contents-3f-",
|
||||
:block/children
|
||||
#{[:block/uuid #uuid "605bffeb-7715-4196-9c06-a0845f03da6a"]},
|
||||
:block/body [],
|
||||
:block/meta
|
||||
{:timestamps [], :properties [], :start-pos 0, :end-pos 24},
|
||||
:block/format :markdown,
|
||||
:block/level 2,
|
||||
:block/tags [],
|
||||
:block/title
|
||||
[["Plain" "What's "]
|
||||
["Emphasis" [["Bold"] [["Plain" "Contents"]]]]
|
||||
["Plain" "?"]],
|
||||
:block/content "## What's **Contents**?\n",
|
||||
:block/parent [:block/name "contents"],
|
||||
:block/page [:block/name "contents"],
|
||||
:block/file [:file/path "pages/contents.md"]}
|
||||
{:block/uuid #uuid "605bffeb-7715-4196-9c06-a0845f03da6a",
|
||||
:block/left
|
||||
[:block/uuid #uuid "605bffeb-0178-4bdb-a877-f5b5f3e44748"],
|
||||
:block/refs (),
|
||||
:block/anchor
|
||||
"It-27-s_a_normal_page_called_-2c-_you_can_use_it_for-3a-",
|
||||
:block/children
|
||||
#{[:block/uuid #uuid "605bffeb-abf0-456b-bc10-80be0ab4f849"]
|
||||
[:block/uuid #uuid "605bffeb-e9d9-43e1-9392-9f0497c3c53b"]
|
||||
[:block/uuid #uuid "605bffeb-3de5-4ca6-8d3b-cd85c292ae88"]},
|
||||
:block/body [],
|
||||
:block/meta
|
||||
{:timestamps [], :properties [], :start-pos 24, :end-pos 88},
|
||||
:block/format :markdown,
|
||||
:block/level 3,
|
||||
:block/tags [],
|
||||
:block/title
|
||||
[["Plain" "It's a normal page called "]
|
||||
["Link"
|
||||
{:url ["Search" "Contents"],
|
||||
:label [["Plain" ""]],
|
||||
:full_text "[[Contents]]",
|
||||
:metadata ""}]
|
||||
["Plain" ", you can use it for:"]],
|
||||
:block/content
|
||||
"### It's a normal page called [[Contents]], you can use it for:\n",
|
||||
:block/path-refs ({:block/name "contents"}),
|
||||
:block/parent
|
||||
[:block/uuid #uuid "605bffeb-0178-4bdb-a877-f5b5f3e44748"],
|
||||
:block/page [:block/name "contents"],
|
||||
:block/file [:file/path "pages/contents.md"]}
|
||||
{:block/uuid #uuid "605bffeb-e9d9-43e1-9392-9f0497c3c53b",
|
||||
:block/left
|
||||
[:block/uuid #uuid "605bffeb-7715-4196-9c06-a0845f03da6a"],
|
||||
:block/refs (),
|
||||
:block/anchor "1-2e-_table_of_content-2f-index-2f-MOC",
|
||||
:block/children #{},
|
||||
:block/body [],
|
||||
:block/meta
|
||||
{:timestamps [], :properties [], :start-pos 88, :end-pos 123},
|
||||
:block/format :markdown,
|
||||
:block/level 4,
|
||||
:block/tags [],
|
||||
:block/title [["Plain" "1. table of content/index/MOC"]],
|
||||
:block/content "#### 1. table of content/index/MOC\n",
|
||||
:block/path-refs ({:block/name "contents"}),
|
||||
:block/parent
|
||||
[:block/uuid #uuid "605bffeb-7715-4196-9c06-a0845f03da6a"],
|
||||
:block/page [:block/name "contents"],
|
||||
:block/file [:file/path "pages/contents.md"]}
|
||||
{:block/uuid #uuid "605bffeb-3de5-4ca6-8d3b-cd85c292ae88",
|
||||
:block/left
|
||||
[:block/uuid #uuid "605bffeb-e9d9-43e1-9392-9f0497c3c53b"],
|
||||
:block/refs (),
|
||||
:block/anchor
|
||||
"2-2e-_pinning-2f-bookmarking_favorites_pages-2f-blocks_(e-2e-g-2e-_)",
|
||||
:block/children #{},
|
||||
:block/body [],
|
||||
:block/meta
|
||||
{:timestamps [], :properties [], :start-pos 123, :end-pos 192},
|
||||
:block/format :markdown,
|
||||
:block/level 4,
|
||||
:block/tags [],
|
||||
:block/title
|
||||
[["Plain" "2. pinning/bookmarking favorites pages/blocks (e.g. "]
|
||||
["Link"
|
||||
{:url ["Search" "Logseq"],
|
||||
:label [["Plain" ""]],
|
||||
:full_text "[[Logseq]]",
|
||||
:metadata ""}]
|
||||
["Plain" ")"]],
|
||||
:block/content
|
||||
"#### 2. pinning/bookmarking favorites pages/blocks (e.g. [[Logseq]])\n",
|
||||
:block/path-refs ({:block/name "logseq"} {:block/name "contents"}),
|
||||
:block/parent
|
||||
[:block/uuid #uuid "605bffeb-7715-4196-9c06-a0845f03da6a"],
|
||||
:block/page [:block/name "contents"],
|
||||
:block/file [:file/path "pages/contents.md"]}
|
||||
{:block/uuid #uuid "605bffeb-abf0-456b-bc10-80be0ab4f849",
|
||||
:block/left
|
||||
[:block/uuid #uuid "605bffeb-3de5-4ca6-8d3b-cd85c292ae88"],
|
||||
:block/refs (),
|
||||
:block/anchor
|
||||
"3-2e-_You_can_also_put_many_different_things-2c-_depending_on_your_personal_workflow-2e-",
|
||||
:block/children #{},
|
||||
:block/body [],
|
||||
:block/meta
|
||||
{:timestamps [], :properties [], :start-pos 192, :end-pos 276},
|
||||
:block/format :markdown,
|
||||
:block/level 4,
|
||||
:block/tags [],
|
||||
:block/title
|
||||
[["Plain"
|
||||
"3. You can also put many different things, depending on your personal workflow."]],
|
||||
:block/content
|
||||
"#### 3. You can also put many different things, depending on your personal workflow.",
|
||||
:block/path-refs ({:block/name "contents"}),
|
||||
:block/parent
|
||||
[:block/uuid #uuid "605bffeb-7715-4196-9c06-a0845f03da6a"],
|
||||
:block/page [:block/name "contents"],
|
||||
:block/file [:file/path "pages/contents.md"]})
|
||||
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
(ns frontend.handler.block-test
|
||||
(:require [cljs.test :refer [deftest is are testing use-fixtures run-tests]]
|
||||
[cljs-run-test :refer [run-test]]
|
||||
[frontend.handler.block :as block]))
|
||||
|
||||
(def blocks->vec-tree-args
|
||||
'[{:block/parent {:db/id 20},
|
||||
:block/left {:db/id 20},
|
||||
:block/pre-block? true,
|
||||
:block/level 2}
|
||||
{:block/parent {:db/id 20},
|
||||
:block/left {:db/id 25},
|
||||
:block/title [["Plain" "level 1"]],
|
||||
:block/level 2}
|
||||
{:block/parent {:db/id 26},
|
||||
:block/left {:db/id 26},
|
||||
:block/title [["Plain" "level 2"]],
|
||||
:block/level 3}
|
||||
{:block/parent {:db/id 27},
|
||||
:block/left {:db/id 27},
|
||||
:block/title [["Plain" "level 3"]],
|
||||
:block/level 4}
|
||||
{:block/parent {:db/id 27},
|
||||
:block/left {:db/id 28},
|
||||
:block/title [],
|
||||
:block/level 4}])
|
||||
|
||||
(def blocks->vec-tree-return
|
||||
'({:block/parent {:db/id 20},
|
||||
:block/left {:db/id 20},
|
||||
:block/pre-block? true,
|
||||
:block/level 2,
|
||||
:block/refs-with-children ()}
|
||||
{:block/parent {:db/id 20},
|
||||
:block/left {:db/id 25},
|
||||
:block/title [["Plain" "level 1"]],
|
||||
:block/level 2,
|
||||
:block/refs-with-children (),
|
||||
:block/children
|
||||
({:block/parent {:db/id 26},
|
||||
:block/left {:db/id 26},
|
||||
:block/title [["Plain" "level 2"]],
|
||||
:block/level 3,
|
||||
:block/refs-with-children (),
|
||||
:block/children
|
||||
({:block/parent {:db/id 27},
|
||||
:block/left {:db/id 27},
|
||||
:block/title [["Plain" "level 3"]],
|
||||
:block/level 4,
|
||||
:block/refs-with-children ()}
|
||||
{:block/parent {:db/id 27},
|
||||
:block/left {:db/id 28},
|
||||
:block/title [],
|
||||
:block/level 4,
|
||||
:block/refs-with-children ()})})}))
|
||||
|
||||
(deftest test-blocks->vec-tree
|
||||
(let [should-r (vec blocks->vec-tree-return)]
|
||||
(let [r (block/blocks->vec-tree blocks->vec-tree-args)]
|
||||
(is (= should-r (vec r))))
|
||||
|
||||
(let [r (block/blocks->vec-tree-by-parent blocks->vec-tree-args)]
|
||||
(is (= should-r (vec r))))))
|
||||
|
||||
(run-test test-blocks->vec-tree)
|
Loading…
Reference in New Issue