refactor(template): insert template

This commit is contained in:
rcmerci
2021-04-16 19:26:34 +08:00
parent a451d992b0
commit 671d301528

View File

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