|
@@ -9,7 +9,9 @@
|
|
|
[datascript.core :as d]
|
|
[datascript.core :as d]
|
|
|
[frontend.date :as date]
|
|
[frontend.date :as date]
|
|
|
[frontend.text :as text]
|
|
[frontend.text :as text]
|
|
|
- [medley.core :as medley]))
|
|
|
|
|
|
|
+ [medley.core :as medley]
|
|
|
|
|
+ [frontend.state :as state]
|
|
|
|
|
+ [frontend.db :as db]))
|
|
|
|
|
|
|
|
(defn heading-block?
|
|
(defn heading-block?
|
|
|
[block]
|
|
[block]
|
|
@@ -251,9 +253,9 @@
|
|
|
(concat title body))
|
|
(concat title body))
|
|
|
(let [ref-blocks (remove string/blank? @ref-blocks)]
|
|
(let [ref-blocks (remove string/blank? @ref-blocks)]
|
|
|
(assoc block :ref-blocks (map
|
|
(assoc block :ref-blocks (map
|
|
|
- (fn [id]
|
|
|
|
|
- [:block/uuid (medley/uuid id)])
|
|
|
|
|
- ref-blocks)))))
|
|
|
|
|
|
|
+ (fn [id]
|
|
|
|
|
+ [:block/uuid (medley/uuid id)])
|
|
|
|
|
+ ref-blocks)))))
|
|
|
|
|
|
|
|
(defn update-src-pos-meta!
|
|
(defn update-src-pos-meta!
|
|
|
[{:keys [body] :as block}]
|
|
[{:keys [body] :as block}]
|
|
@@ -286,6 +288,43 @@
|
|
|
(block-keywordize (util/remove-nils block)))
|
|
(block-keywordize (util/remove-nils block)))
|
|
|
blocks))
|
|
blocks))
|
|
|
|
|
|
|
|
|
|
+(defn with-path-refs
|
|
|
|
|
+ [blocks]
|
|
|
|
|
+ (loop [blocks blocks
|
|
|
|
|
+ acc []
|
|
|
|
|
+ parents []]
|
|
|
|
|
+ (if (empty? blocks)
|
|
|
|
|
+ acc
|
|
|
|
|
+ (let [block (first blocks)
|
|
|
|
|
+ cur-level (:block/level block)
|
|
|
|
|
+ level-diff (- cur-level
|
|
|
|
|
+ (get (last parents) :block/level 0))
|
|
|
|
|
+ [path-refs parents]
|
|
|
|
|
+ (cond
|
|
|
|
|
+ (zero? level-diff) ; sibling
|
|
|
|
|
+ (let [path-refs (mapcat :block/ref-pages (drop-last parents))
|
|
|
|
|
+ parents (conj (vec (butlast parents)) block)]
|
|
|
|
|
+ [path-refs parents])
|
|
|
|
|
+
|
|
|
|
|
+ (> level-diff 0) ; child
|
|
|
|
|
+ (let [path-refs (mapcat :block/ref-pages parents)]
|
|
|
|
|
+ [path-refs (conj parents block)])
|
|
|
|
|
+
|
|
|
|
|
+ (< level-diff 0) ; new parent
|
|
|
|
|
+ (let [parents (take-while (fn [p] (< (:block/level p) cur-level)) parents)
|
|
|
|
|
+ path-refs (mapcat :block/ref-pages parents)]
|
|
|
|
|
+ [path-refs (conj parents block)]))]
|
|
|
|
|
+ (recur (rest blocks)
|
|
|
|
|
+ (conj acc (assoc block :block/path-ref-pages
|
|
|
|
|
+ (->> path-refs
|
|
|
|
|
+ (concat (:block/ref-pages block))
|
|
|
|
|
+ (remove string/blank?)
|
|
|
|
|
+ (map string/lower-case)
|
|
|
|
|
+ (distinct)
|
|
|
|
|
+ (map (fn [p]
|
|
|
|
|
+ {:page/name p})))))
|
|
|
|
|
+ parents)))))
|
|
|
|
|
+
|
|
|
(defn extract-blocks
|
|
(defn extract-blocks
|
|
|
[blocks last-pos encoded-content]
|
|
[blocks last-pos encoded-content]
|
|
|
(let [blocks
|
|
(let [blocks
|
|
@@ -361,29 +400,30 @@
|
|
|
(-> (reverse headings)
|
|
(-> (reverse headings)
|
|
|
safe-blocks)))]
|
|
safe-blocks)))]
|
|
|
(let [first-block (first blocks)
|
|
(let [first-block (first blocks)
|
|
|
- first-block-start-pos (get-in first-block [:block/meta :start-pos])]
|
|
|
|
|
- (if (and
|
|
|
|
|
- (not (string/blank? encoded-content))
|
|
|
|
|
- (or (empty? blocks)
|
|
|
|
|
- (> first-block-start-pos 1)))
|
|
|
|
|
- (cons
|
|
|
|
|
- (merge
|
|
|
|
|
- (let [content (utf8/substring encoded-content 0 first-block-start-pos)
|
|
|
|
|
- uuid (d/squuid)]
|
|
|
|
|
- (->
|
|
|
|
|
- {:uuid uuid
|
|
|
|
|
- :content content
|
|
|
|
|
- :anchor (str uuid)
|
|
|
|
|
- :level 2
|
|
|
|
|
- :meta {:start-pos 0
|
|
|
|
|
- :end-pos (or first-block-start-pos
|
|
|
|
|
- (utf8/length encoded-content))}
|
|
|
|
|
- :body (take-while (fn [block] (not (heading-block? block))) blocks)
|
|
|
|
|
- :pre-block? true}
|
|
|
|
|
- (block-keywordize)))
|
|
|
|
|
- (select-keys first-block [:block/file :block/format :block/page]))
|
|
|
|
|
- blocks)
|
|
|
|
|
- blocks))))
|
|
|
|
|
|
|
+ first-block-start-pos (get-in first-block [:block/meta :start-pos])
|
|
|
|
|
+ blocks (if (and
|
|
|
|
|
+ (not (string/blank? encoded-content))
|
|
|
|
|
+ (or (empty? blocks)
|
|
|
|
|
+ (> first-block-start-pos 1)))
|
|
|
|
|
+ (cons
|
|
|
|
|
+ (merge
|
|
|
|
|
+ (let [content (utf8/substring encoded-content 0 first-block-start-pos)
|
|
|
|
|
+ uuid (d/squuid)]
|
|
|
|
|
+ (->
|
|
|
|
|
+ {:uuid uuid
|
|
|
|
|
+ :content content
|
|
|
|
|
+ :anchor (str uuid)
|
|
|
|
|
+ :level 2
|
|
|
|
|
+ :meta {:start-pos 0
|
|
|
|
|
+ :end-pos (or first-block-start-pos
|
|
|
|
|
+ (utf8/length encoded-content))}
|
|
|
|
|
+ :body (take-while (fn [block] (not (heading-block? block))) blocks)
|
|
|
|
|
+ :pre-block? true}
|
|
|
|
|
+ (block-keywordize)))
|
|
|
|
|
+ (select-keys first-block [:block/file :block/format :block/page]))
|
|
|
|
|
+ blocks)
|
|
|
|
|
+ blocks)]
|
|
|
|
|
+ (with-path-refs blocks))))
|
|
|
|
|
|
|
|
(defn- page-with-journal
|
|
(defn- page-with-journal
|
|
|
[original-page-name]
|
|
[original-page-name]
|
|
@@ -408,10 +448,18 @@
|
|
|
content-length (utf8/length encoded-content)
|
|
content-length (utf8/length encoded-content)
|
|
|
blocks (extract-blocks ast content-length encoded-content)
|
|
blocks (extract-blocks ast content-length encoded-content)
|
|
|
ref-pages-atom (atom [])
|
|
ref-pages-atom (atom [])
|
|
|
|
|
+ parent-ref-pages (->> (db/get-block-parent (state/get-current-repo) uuid)
|
|
|
|
|
+ :block/path-ref-pages
|
|
|
|
|
+ (map :db/id))
|
|
|
blocks (doall
|
|
blocks (doall
|
|
|
(map-indexed
|
|
(map-indexed
|
|
|
(fn [idx {:block/keys [ref-pages ref-blocks meta] :as block}]
|
|
(fn [idx {:block/keys [ref-pages ref-blocks meta] :as block}]
|
|
|
- (let [block (merge
|
|
|
|
|
|
|
+ (let [path-ref-pages (->> ref-pages
|
|
|
|
|
+ (remove string/blank?)
|
|
|
|
|
+ (map string/lower-case)
|
|
|
|
|
+ (map (fn [p] [:page/name p]))
|
|
|
|
|
+ (concat parent-ref-pages))
|
|
|
|
|
+ block (merge
|
|
|
block
|
|
block
|
|
|
{:block/meta meta
|
|
{:block/meta meta
|
|
|
:block/marker (get block :block/marker "nil")
|
|
:block/marker (get block :block/marker "nil")
|
|
@@ -421,7 +469,8 @@
|
|
|
:block/page page
|
|
:block/page page
|
|
|
:block/content (utf8/substring encoded-content
|
|
:block/content (utf8/substring encoded-content
|
|
|
(:start-pos meta)
|
|
(:start-pos meta)
|
|
|
- (:end-pos meta))}
|
|
|
|
|
|
|
+ (:end-pos meta))
|
|
|
|
|
+ :block/path-ref-pages path-ref-pages}
|
|
|
;; Preserve the original block id
|
|
;; Preserve the original block id
|
|
|
(when (zero? idx)
|
|
(when (zero? idx)
|
|
|
{:block/uuid uuid})
|
|
{:block/uuid uuid})
|