mirror of
https://github.com/logseq/logseq.git
synced 2026-05-05 19:36:35 +00:00
refactor(template): insert template
This commit is contained in:
@@ -880,12 +880,9 @@
|
||||
(array-seq (dom/by-class block "ls-block"))))
|
||||
blocks)))
|
||||
|
||||
(defn- compose-copied-blocks-contents-&-block-tree
|
||||
[repo block-ids]
|
||||
(let [blocks (db-utils/pull-many repo '[*] (mapv (fn [id] [:block/uuid id]) block-ids))
|
||||
unordered? (:block/unordered (first blocks))
|
||||
format (:block/format (first blocks))
|
||||
level-blocks (mapv #(assoc % :level 0) blocks)
|
||||
(defn- blocks-with-level
|
||||
[blocks]
|
||||
(let [level-blocks (mapv #(assoc % :level 0) blocks)
|
||||
level-blocks-map (into {} (mapv (fn [b] [(:db/id b) b]) level-blocks))
|
||||
[level-blocks-map _]
|
||||
(reduce (fn [[r state] [id block]]
|
||||
@@ -893,8 +890,12 @@
|
||||
[(conj r [id (assoc block :level (inc parent-level))])
|
||||
(assoc-in state [(:db/id block) :level] (inc parent-level))]
|
||||
[(conj r [id block])
|
||||
state])) [{} level-blocks-map] level-blocks-map)
|
||||
loc (reduce (fn [loc [_ {:keys [level] :as block}]]
|
||||
state])) [{} level-blocks-map] level-blocks-map)]
|
||||
level-blocks-map))
|
||||
|
||||
(defn- blocks-vec->tree
|
||||
[blocks]
|
||||
(let [loc (reduce (fn [loc {:keys [level] :as block}]
|
||||
(let [loc*
|
||||
(loop [loc (zip/vector-zip (zip/root loc))
|
||||
level level]
|
||||
@@ -909,8 +910,16 @@
|
||||
(-> loc*
|
||||
zip/up
|
||||
(zip/append-child [block])))]
|
||||
loc**)) (zip/vector-zip []) level-blocks-map)
|
||||
tree (zip/root loc)
|
||||
loc**)) (zip/vector-zip []) blocks)]
|
||||
(zip/root loc)))
|
||||
|
||||
(defn- compose-copied-blocks-contents-&-block-tree
|
||||
[repo block-ids]
|
||||
(let [blocks (db-utils/pull-many repo '[*] (mapv (fn [id] [:block/uuid id]) block-ids))
|
||||
unordered? (:block/unordered (first blocks))
|
||||
format (:block/format (first blocks))
|
||||
level-blocks-map (blocks-with-level blocks)
|
||||
tree (blocks-vec->tree (vals level-blocks-map))
|
||||
contents
|
||||
(mapv (fn [[id block]]
|
||||
(let [header
|
||||
@@ -1797,11 +1806,94 @@
|
||||
(state/set-editor-show-block-search! false)
|
||||
(util/cursor-move-forward input 2)))
|
||||
|
||||
;; TODO: re-implement
|
||||
(defn- paste-block-tree-at-point
|
||||
([tree exclude-properties] (paste-block-tree-at-point tree exclude-properties nil))
|
||||
([tree exclude-properties content-update-fn]
|
||||
(let [repo (state/get-current-repo)
|
||||
page (or (db/entity [:block/name (state/get-current-page)])
|
||||
(db/entity [:block/original-name (state/get-current-page)])
|
||||
(:block/page (db/entity (:db/id (state/get-edit-block)))))
|
||||
file (:block/file page)]
|
||||
(when-let [editing-block (state/get-edit-block)]
|
||||
(let [parent (:block/parent editing-block)
|
||||
left (:block/left editing-block)
|
||||
sibling? (not= parent left)
|
||||
target-block (outliner-core/block (db/pull (if sibling? (:db/id left) (:db/id parent))))
|
||||
format (or (:block/format target-block) (state/get-preferred-format))
|
||||
new-block-uuids (atom #{})
|
||||
metadata-replaced-blocks
|
||||
(zip/root
|
||||
(loop [loc (zip/vector-zip tree)]
|
||||
(if (zip/end? loc)
|
||||
loc
|
||||
(if (vector? (zip/node loc))
|
||||
(recur (zip/next loc))
|
||||
(let [uuid (random-uuid)]
|
||||
(swap! new-block-uuids (fn [acc uuid] (conj acc uuid)) uuid)
|
||||
|
||||
(recur (zip/next (zip/edit
|
||||
loc
|
||||
#(outliner-core/block
|
||||
(let [[new-content new-title]
|
||||
(if content-update-fn
|
||||
(let [new-content (content-update-fn (:block/content %))
|
||||
new-title (or (:title (second (ffirst
|
||||
(mldoc/->edn (str (case format
|
||||
:markdown "- "
|
||||
:org "* ") new-content)
|
||||
(mldoc/default-config format)))))
|
||||
(:block/title %))]
|
||||
[new-content new-title])
|
||||
[(:block/content %) (:block/title %)])
|
||||
new-content
|
||||
(-> new-content
|
||||
(text/remove-property "id")
|
||||
(text/remove-property "custom_id"))]
|
||||
(conj {:block/uuid uuid
|
||||
:block/page (select-keys page [:db/id])
|
||||
:block/file (select-keys file [:db/id])
|
||||
:block/format format
|
||||
:block/properties (apply dissoc (:block/properties %)
|
||||
(concat ["id" "custom_id"]
|
||||
exclude-properties))
|
||||
:block/meta (dissoc (:block/meta %) :start-pos :end-pos)
|
||||
:block/content new-content
|
||||
:block/title new-title}
|
||||
(dissoc %
|
||||
:block/uuid
|
||||
:block/page
|
||||
:block/file
|
||||
:db/id
|
||||
:block/left
|
||||
:block/parent
|
||||
:block/format
|
||||
:block/properties
|
||||
:block/meta
|
||||
:block/content
|
||||
:block/title))))))))))))
|
||||
_ (outliner-core/insert-nodes metadata-replaced-blocks target-block sibling?)
|
||||
new-blocks (db/pull-many repo '[*] (map (fn [id] [:block/uuid id]) @new-block-uuids))]
|
||||
(db/refresh! repo {:key :block/insert :data new-blocks}))))))
|
||||
|
||||
(defn template-on-chosen-handler
|
||||
[input id q format edit-block edit-content]
|
||||
(fn [[template db-id] _click?]
|
||||
|
||||
(let [repo (state/get-current-repo)
|
||||
block (db/entity db-id)
|
||||
block-uuid (:block/uuid block)
|
||||
including-parent? (not= "false" (get (:block/properties block) "including-parent"))
|
||||
blocks (if including-parent? (db/get-block-and-children repo block-uuid) (db/get-block-children repo block-uuid))
|
||||
level-blocks-map (blocks-with-level blocks)
|
||||
tree (blocks-vec->tree (vals level-blocks-map))]
|
||||
(paste-block-tree-at-point tree ["template" "including-parent"]
|
||||
(fn [content]
|
||||
(-> content
|
||||
(text/remove-property "template")
|
||||
(text/remove-property "including-parent")
|
||||
template/resolve-dynamic-template!)))
|
||||
;; restore state & remove '/' char
|
||||
(state/set-editor-show-template-search! false)
|
||||
(insert-command! id "" format {}))
|
||||
(when-let [input (gdom/getElement id)]
|
||||
(.focus input))))
|
||||
|
||||
@@ -2273,41 +2365,8 @@
|
||||
(not (string/blank? text))
|
||||
(= (string/trim text) (string/trim (:copy/content copied-blocks))))
|
||||
;; copy from logseq internally
|
||||
(let [editing-block (state/get-edit-block)
|
||||
parent (:block/parent editing-block)
|
||||
left (:block/left editing-block)
|
||||
sibling? (not= parent left)
|
||||
target-block (outliner-core/block (db/pull (if sibling? (:db/id left) (:db/id parent))))
|
||||
format (or (:block/format target-block) (state/get-preferred-format))
|
||||
new-block-uuids (atom #{})
|
||||
metadata-replaced-copied-blocks
|
||||
(zip/root
|
||||
(loop [loc (zip/vector-zip copied-block-tree)]
|
||||
(if (zip/end? loc)
|
||||
loc
|
||||
(if (vector? (zip/node loc))
|
||||
(recur (zip/next loc))
|
||||
(let [uuid (random-uuid)]
|
||||
(swap! new-block-uuids (fn [acc uuid] (conj acc uuid)) uuid)
|
||||
(recur (zip/next (zip/edit
|
||||
loc
|
||||
#(outliner-core/block
|
||||
(conj {:block/uuid uuid
|
||||
:block/page (select-keys page [:db/id])
|
||||
:block/file (select-keys file [:db/id])
|
||||
:block/format format}
|
||||
(dissoc %
|
||||
:block/uuid
|
||||
:block/page
|
||||
:block/file
|
||||
:db/id
|
||||
:block/left
|
||||
:block/parent
|
||||
:block/format)))))))))))
|
||||
_ (outliner-core/insert-nodes metadata-replaced-copied-blocks target-block sibling?)
|
||||
new-blocks (db/pull-many repo '[*] (map (fn [id] [:block/uuid id]) @new-block-uuids))]
|
||||
(db/refresh! repo {:key :block/insert :data new-blocks})
|
||||
(util/stop e)))))
|
||||
(paste-block-tree-at-point copied-block-tree [])
|
||||
(util/stop e))))
|
||||
|
||||
(defn editor-on-paste!
|
||||
[id]
|
||||
|
||||
Reference in New Issue
Block a user