refactor(outliner): blocks->vec-tree

pull/1656/head
defclass 2021-03-25 16:25:07 +08:00
parent 14836c932c
commit d88542f412
4 changed files with 119 additions and 294 deletions

View File

@ -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

View File

@ -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]

View File

@ -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"]})

View File

@ -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)