1
0
Эх сурвалжийг харах

chore: mv worker.file.page-rename to appropriate ns

This ns is file graph specific so it should be in a file-graph
specific ns. Its current location was confusing as it was next to
other namespaces in frontend.worker.file.* that are not
file graph specific. Also moved related tests to correct location
Gabriel Horner 1 жил өмнө
parent
commit
13f5971d3c

+ 4 - 5
scripts/src/logseq/tasks/dev/db_and_file_graphs.clj

@@ -23,7 +23,9 @@
   (mapv escape-shell-regex
         ["frontend.handler.file-based" "frontend.handler.file-sync"
          "frontend.db.file-based"
-         "frontend.worker.handler.page.file-based" "frontend.worker.file"
+         "frontend.worker.handler.page.file-based"
+         ;; Want to only specify this ns and not the ones under it but don't have a way yet
+         "frontend.worker.file"
          "frontend.fs"
          "frontend.components.file-sync"
          "frontend.components.file-based"
@@ -42,10 +44,7 @@
 (def file-graph-paths
   "Paths _only_ for file graphs"
   ["src/main/frontend/handler/file_based" "src/main/frontend/handler/file_sync.cljs" "src/main/frontend/db/file_based"
-   "src/main/frontend/worker/handler/page/file_based"
-   ;; TODO: Enable when fixed
-   #_"src/main/frontend/worker/file"
-   "src/main/frontend/worker/file.cljs"
+   "src/main/frontend/worker/handler/page/file_based" "src/main/frontend/worker/file.cljs"
    "src/main/frontend/fs"
    "src/main/frontend/components/file_sync.cljs"
    "src/main/frontend/components/file_based"

+ 2 - 1
src/main/frontend/worker/file/core.cljs

@@ -1,5 +1,5 @@
 (ns frontend.worker.file.core
-  "Save file to disk"
+  "Save file to disk. Used by both file and DB graphs"
   (:require [clojure.string :as string]
             [frontend.worker.file.util :as wfu]
             [logseq.graph-parser.property :as gp-property]
@@ -122,6 +122,7 @@
           (recur r level))))))
 
 (defn tree->file-content
+  "Used by both file and DB graphs for export and for file-graph specific features"
   [repo db tree opts context]
   (->> (tree->file-content-aux repo db tree opts context) (string/join "\n")))
 

+ 0 - 132
src/main/frontend/worker/file/page_rename.cljs

@@ -1,132 +0,0 @@
-(ns frontend.worker.file.page-rename
-  "File based page rename fns"
-  (:require [logseq.common.util :as common-util]
-            [logseq.graph-parser.property :as gp-property]
-            [logseq.common.util.page-ref :as page-ref]
-            [clojure.walk :as walk]
-            [clojure.string :as string]
-            [datascript.core :as d]
-            [logseq.common.config :as common-config]
-            [logseq.db :as ldb]))
-
-(defn- replace-page-ref-aux
-  "Unsanitized names"
-  [config content old-name new-name]
-  (let [preferred-format (common-config/get-preferred-format config)
-        [original-old-name original-new-name] (map string/trim [old-name new-name])
-        [old-ref new-ref] (map page-ref/->page-ref [old-name new-name])
-        [old-name new-name] (map #(if (string/includes? % "/")
-                                    (string/replace % "/" ".")
-                                    %)
-                                 [original-old-name original-new-name])
-        old-org-ref (and (= :org preferred-format)
-                         (:org-mode/insert-file-link? config)
-                         (re-find
-                          (re-pattern
-                           (common-util/format
-                            "\\[\\[file:\\.*/.*%s\\.org\\]\\[(.*?)\\]\\]" old-name))
-                          content))]
-    (-> (if old-org-ref
-          (let [[old-full-ref old-label] old-org-ref
-                new-label (if (= old-label original-old-name)
-                            original-new-name
-                            old-label)
-                new-full-ref (-> (string/replace old-full-ref old-name new-name)
-                                 (string/replace (str "[" old-label "]")
-                                                 (str "[" new-label "]")))]
-            (string/replace content old-full-ref new-full-ref))
-          content)
-        (string/replace old-ref new-ref))))
-
-(defn replace-tag-ref!
-  [content old-name new-name]
-  (let [old-tag (common-util/format "#%s" old-name)
-        new-tag (if (re-find #"[\s\t]+" new-name)
-                  (common-util/format "#[[%s]]" new-name)
-                  (str "#" new-name))]
-    ;; hash tag parsing rules https://github.com/logseq/mldoc/blob/701243eaf9b4157348f235670718f6ad19ebe7f8/test/test_markdown.ml#L631
-    ;; Safari doesn't support look behind, don't use
-    ;; TODO: parse via mldoc
-    (string/replace content
-                    (re-pattern (str "(?i)(^|\\s)(" (common-util/escape-regex-chars old-tag) ")(?=[,\\.]*($|\\s))"))
-                    ;;    case_insense^    ^lhs   ^_grp2                       look_ahead^         ^_grp3
-                    (fn [[_match lhs _grp2 _grp3]]
-                      (str lhs new-tag)))))
-
-(defn- replace-property-ref!
-  [content old-name new-name format]
-  (let [new-name (keyword (string/replace (string/lower-case new-name) #"\s+" "-"))
-        org-format? (= :org format)
-        old-property (if org-format? (gp-property/colons-org old-name) (str old-name gp-property/colons))
-        new-property (if org-format? (gp-property/colons-org (name new-name)) (str (name new-name) gp-property/colons))]
-    (common-util/replace-ignore-case content old-property new-property)))
-
-(defn- replace-old-page!
-  "Unsanitized names"
-  [config content old-name new-name format]
-  (when (and (string? content) (string? old-name) (string? new-name))
-    (-> (replace-page-ref-aux config content old-name new-name)
-        (replace-tag-ref! old-name new-name)
-        (replace-property-ref! old-name new-name format))))
-
-(defn- walk-replace-old-page!
-  "Unsanitized names"
-  [config form old-name new-name format]
-  (walk/postwalk (fn [f]
-                   (cond
-                     (and (vector? f)
-                          (contains? #{"Search" "Label"} (first f))
-                          (string/starts-with? (second f) (str old-name "/")))
-                     [(first f) (string/replace-first (second f)
-                                                      (str old-name "/")
-                                                      (str new-name "/"))]
-
-                     (string? f)
-                     (if (= f old-name)
-                       new-name
-                       (replace-old-page! config f old-name new-name format))
-
-                     (and (keyword f) (= (name f) old-name))
-                     (keyword (string/replace (string/lower-case new-name) #"\s+" "-"))
-
-                     :else
-                     f))
-                 form))
-
-(defn- rename-update-block-refs!
-  [refs from-id to-id]
-  (if to-id
-    (->> refs
-        (remove #{{:db/id from-id}})
-        (cons {:db/id to-id})
-        (distinct)
-        (vec))
-    ;; New page not exists so that we keep using the old page's block as a ref
-    refs))
-
-(defn replace-page-ref
-  "Unsanitized only"
-  [db config page new-name]
-  ;; update all pages which have references to this page
-  (let [to-page (ldb/get-page db new-name)
-        old-original-name (:block/original-name page)
-        blocks (:block/_refs (d/entity db (:db/id page)))
-        tx     (->> (map (fn [{:block/keys [uuid content properties format] :as block}]
-                           (let [content    (let [content' (replace-old-page! config content old-original-name new-name format)]
-                                              (when-not (= content' content)
-                                                content'))
-                                 properties (let [properties' (walk-replace-old-page! config properties old-original-name new-name format)]
-                                              (when-not (= properties' properties)
-                                                properties'))]
-                             (when (or content properties)
-                               (common-util/remove-nils-non-nested
-                                {:block/uuid       uuid
-                                 :block/content    content
-                                 :block/properties properties
-                                 :block/properties-order (when (seq properties)
-                                                           (map first properties))
-                                 :block/refs (->> (rename-update-block-refs! (:block/refs block) (:db/id page) (:db/id to-page))
-                                                  (map :db/id)
-                                                  (set))})))) blocks)
-                    (remove nil?))]
-    tx))

+ 128 - 11
src/main/frontend/worker/handler/page/file_based/rename.cljs

@@ -3,14 +3,139 @@
   (:require [frontend.worker.handler.page :as worker-page]
             [datascript.core :as d]
             [clojure.string :as string]
+            [clojure.walk :as walk]
             [logseq.common.util.page-ref :as page-ref]
             [frontend.worker.file.util :as wfu]
-            [frontend.worker.file.page-rename :as page-rename]
             [logseq.db :as ldb]
             [logseq.common.util :as common-util]
+            [logseq.common.config :as common-config]
             [logseq.graph-parser.text :as text]
+            [logseq.graph-parser.property :as gp-property]
             [logseq.db.frontend.order :as db-order]))
 
+
+(defn- replace-page-ref-aux
+  "Unsanitized names"
+  [config content old-name new-name]
+  (let [preferred-format (common-config/get-preferred-format config)
+        [original-old-name original-new-name] (map string/trim [old-name new-name])
+        [old-ref new-ref] (map page-ref/->page-ref [old-name new-name])
+        [old-name new-name] (map #(if (string/includes? % "/")
+                                    (string/replace % "/" ".")
+                                    %)
+                                 [original-old-name original-new-name])
+        old-org-ref (and (= :org preferred-format)
+                         (:org-mode/insert-file-link? config)
+                         (re-find
+                          (re-pattern
+                           (common-util/format
+                            "\\[\\[file:\\.*/.*%s\\.org\\]\\[(.*?)\\]\\]" old-name))
+                          content))]
+    (-> (if old-org-ref
+          (let [[old-full-ref old-label] old-org-ref
+                new-label (if (= old-label original-old-name)
+                            original-new-name
+                            old-label)
+                new-full-ref (-> (string/replace old-full-ref old-name new-name)
+                                 (string/replace (str "[" old-label "]")
+                                                 (str "[" new-label "]")))]
+            (string/replace content old-full-ref new-full-ref))
+          content)
+        (string/replace old-ref new-ref))))
+
+(defn replace-tag-ref!
+  [content old-name new-name]
+  (let [old-tag (common-util/format "#%s" old-name)
+        new-tag (if (re-find #"[\s\t]+" new-name)
+                  (common-util/format "#[[%s]]" new-name)
+                  (str "#" new-name))]
+    ;; hash tag parsing rules https://github.com/logseq/mldoc/blob/701243eaf9b4157348f235670718f6ad19ebe7f8/test/test_markdown.ml#L631
+    ;; Safari doesn't support look behind, don't use
+    ;; TODO: parse via mldoc
+    (string/replace content
+                    (re-pattern (str "(?i)(^|\\s)(" (common-util/escape-regex-chars old-tag) ")(?=[,\\.]*($|\\s))"))
+                    ;;    case_insense^    ^lhs   ^_grp2                       look_ahead^         ^_grp3
+                    (fn [[_match lhs _grp2 _grp3]]
+                      (str lhs new-tag)))))
+
+(defn- replace-property-ref!
+  [content old-name new-name format]
+  (let [new-name (keyword (string/replace (string/lower-case new-name) #"\s+" "-"))
+        org-format? (= :org format)
+        old-property (if org-format? (gp-property/colons-org old-name) (str old-name gp-property/colons))
+        new-property (if org-format? (gp-property/colons-org (name new-name)) (str (name new-name) gp-property/colons))]
+    (common-util/replace-ignore-case content old-property new-property)))
+
+(defn- replace-old-page!
+  "Unsanitized names"
+  [config content old-name new-name format]
+  (when (and (string? content) (string? old-name) (string? new-name))
+    (-> (replace-page-ref-aux config content old-name new-name)
+        (replace-tag-ref! old-name new-name)
+        (replace-property-ref! old-name new-name format))))
+
+(defn- walk-replace-old-page!
+  "Unsanitized names"
+  [config form old-name new-name format]
+  (walk/postwalk (fn [f]
+                   (cond
+                     (and (vector? f)
+                          (contains? #{"Search" "Label"} (first f))
+                          (string/starts-with? (second f) (str old-name "/")))
+                     [(first f) (string/replace-first (second f)
+                                                      (str old-name "/")
+                                                      (str new-name "/"))]
+
+                     (string? f)
+                     (if (= f old-name)
+                       new-name
+                       (replace-old-page! config f old-name new-name format))
+
+                     (and (keyword f) (= (name f) old-name))
+                     (keyword (string/replace (string/lower-case new-name) #"\s+" "-"))
+
+                     :else
+                     f))
+                 form))
+
+(defn- rename-update-block-refs!
+  [refs from-id to-id]
+  (if to-id
+    (->> refs
+        (remove #{{:db/id from-id}})
+        (cons {:db/id to-id})
+        (distinct)
+        (vec))
+    ;; New page not exists so that we keep using the old page's block as a ref
+    refs))
+
+(defn replace-page-ref
+  "Unsanitized only"
+  [db config page new-name]
+  ;; update all pages which have references to this page
+  (let [to-page (ldb/get-page db new-name)
+        old-original-name (:block/original-name page)
+        blocks (:block/_refs (d/entity db (:db/id page)))
+        tx     (->> (map (fn [{:block/keys [uuid content properties format] :as block}]
+                           (let [content    (let [content' (replace-old-page! config content old-original-name new-name format)]
+                                              (when-not (= content' content)
+                                                content'))
+                                 properties (let [properties' (walk-replace-old-page! config properties old-original-name new-name format)]
+                                              (when-not (= properties' properties)
+                                                properties'))]
+                             (when (or content properties)
+                               (common-util/remove-nils-non-nested
+                                {:block/uuid       uuid
+                                 :block/content    content
+                                 :block/properties properties
+                                 :block/properties-order (when (seq properties)
+                                                           (map first properties))
+                                 :block/refs (->> (rename-update-block-refs! (:block/refs block) (:db/id page) (:db/id to-page))
+                                                  (map :db/id)
+                                                  (set))})))) blocks)
+                    (remove nil?))]
+    tx))
+
 (defn rename-update-namespace!
   "update :block/namespace of the renamed block"
   [repo conn config page old-original-name new-name]
@@ -34,14 +159,6 @@
       :else
       nil)))
 
-(defn- rename-update-block-refs!
-  [refs from-id to-id]
-  (->> refs
-       (remove #{{:db/id from-id}})
-       (cons {:db/id to-id})
-       (distinct)
-       (vec)))
-
 (declare rename-page-aux)
 
 (defn- based-merge-pages!
@@ -67,7 +184,7 @@
 
                                     (= (:block/parent block) {:db/id from-id})
                                     (assoc :block/parent {:db/id to-id})))) blocks)
-          replace-ref-tx-data (page-rename/replace-page-ref db config from-page to-page-name)
+          replace-ref-tx-data (replace-page-ref db config from-page to-page-name)
           tx-data (concat blocks-tx-data replace-ref-tx-data)]
 
       (rename-page-aux repo conn config old-name new-name
@@ -119,7 +236,7 @@
                         (->>
                          (concat
                             ;;  update page refes in block content when ref name changes
-                          (page-rename/replace-page-ref db config page new-name)
+                          (replace-page-ref db config page new-name)
                             ;; update file path
                           tx-data)
 

+ 78 - 10
src/test/frontend/handler/file_based/page_test.cljs → src/test/frontend/worker/handler/page/file_based/rename_test.cljs

@@ -1,10 +1,80 @@
-(ns frontend.handler.file-based.page-test
-  ;; namespace local config for private function tests
-  {:clj-kondo/config {:linters {:private-call {:level :off}}}}
-  (:require [cljs.test :refer [deftest are]]
+(ns frontend.worker.handler.page.file-based.rename-test
+  (:require [clojure.test :refer [deftest is testing use-fixtures are]]
+            [frontend.test.helper :as test-helper]
+            [datascript.core :as d]
+            [frontend.handler.page :as page-handler]
+            [frontend.db :as db]
             [clojure.string :as string]
             [frontend.util :as util]
-            [frontend.worker.file.page-rename :as page-rename]))
+            [frontend.worker.handler.page.file-based.rename :as file-page-rename]
+            [frontend.handler.editor :as editor-handler]))
+
+;; FIXME: merge properties from both pages
+
+(def repo test-helper/test-db-name)
+
+(def init-data (test-helper/initial-test-page-and-blocks))
+
+(def fbid (:block/uuid (second init-data)))
+
+(defn start-and-destroy-db
+  [f]
+  (test-helper/start-and-destroy-db
+   f
+   {:init-data (fn [conn] (d/transact! conn init-data))}))
+
+(use-fixtures :each start-and-destroy-db)
+
+(defn- page-rename [page-uuid new-name]
+  (file-page-rename/rename! repo (db/get-db repo false) {} page-uuid new-name))
+
+(deftest rename-test
+  (testing "Case change"
+    (let [page (db/get-page "test")]
+      (page-rename (:block/uuid page) "Test")
+      (is (= "Test" (:block/original-name (db/entity (:db/id page)))))))
+
+  (testing "Name changed"
+    (let [page (db/get-page "Test")]
+      (page-rename (:block/uuid page) "New name")
+      (is (= "New name" (:block/original-name (db/entity (:db/id page)))))))
+
+  (testing "Merge existing page"
+    (page-handler/create! "Existing page" {:redirect? false :create-first-block? true})
+    (let [page (db/get-page "new name")]
+      (page-rename (:block/uuid page) "Existing page"))
+    (let [e1 (db/get-page "new name")
+          e2 (db/get-page "existing page")]
+      ;; Old page deleted
+      (is (nil? e1))
+      ;; Blocks from both pages have been merged
+      (is (= (count (:block/_page e2)) (+ 1 (dec (count init-data))))))))
+
+(deftest merge-with-empty-page
+  (page-handler/create! "Existing page" {:redirect? false :create-first-block? false})
+  (let [page (db/get-page "test")]
+    (page-rename (:block/uuid page) "Existing page"))
+  (let [e1 (db/get-page "test")
+        e2 (db/get-page "existing page")]
+      ;; Old page deleted
+    (is (nil? e1))
+      ;; Blocks from both pages have been merged
+    (is (= (count (:block/_page e2)) (dec (count init-data))))))
+
+(deftest merge-existing-pages-should-update-ref-ids
+  (testing "Merge existing page"
+    (editor-handler/save-block! repo fbid "Block 1 [[Test]]")
+    (page-handler/create! "Existing page" {:redirect? false :create-first-block? true})
+    (let [page (db/get-page "test")]
+      (page-rename (:block/uuid page) "Existing page"))
+    (let [e1 (db/get-page "test")
+          e2 (db/get-page "existing page")]
+      ;; Old page deleted
+      (is (nil? e1))
+      ;; Blocks from both pages have been merged
+      (is (= (count (:block/_page e2)) (+ 1 (dec (count init-data)))))
+      ;; Content updated
+      (is (= "Block 1 [[Existing page]]" (:block/content (db/entity [:block/uuid fbid])))))))
 
 (defn- replace-page-ref!
   [content old-name new-name]
@@ -36,7 +106,7 @@
   (when (and (string? content) (string? old-name) (string? new-name))
     (-> content
         (replace-page-ref! old-name new-name)
-        (page-rename/replace-tag-ref! old-name new-name))))
+        (file-page-rename/replace-tag-ref! old-name new-name))))
 
 (deftest test-replace-page-ref!
   (are [x y] (= (let [[content old-name new-name] x]
@@ -66,7 +136,7 @@
 
 (deftest test-replace-tag-ref!
   (are [x y] (= (let [[content old-name new-name] x]
-                  (page-rename/replace-tag-ref! content old-name new-name))
+                  (file-page-rename/replace-tag-ref! content old-name new-name))
                 y)
     ["#foo" "foo" "bar"] "#bar"
     ["#foo" "foo" "new bar"] "#[[new bar]]"
@@ -117,6 +187,4 @@
        "#bar bla [[bar]] bla #bar"
 
        ["#logseq/foo bla [[logseq/foo]] bla [[file:./pages/logseq.foo.org][logseq/foo]] bla #logseq/foo" "logseq/foo" "logseq/bar"]
-       "#logseq/bar bla [[logseq/bar]] bla [[file:./pages/logseq.bar.org][logseq/bar]] bla #logseq/bar"))
-
-#_(cljs.test/test-ns 'frontend.handler.page-test)
+       "#logseq/bar bla [[logseq/bar]] bla [[file:./pages/logseq.bar.org][logseq/bar]] bla #logseq/bar"))

+ 0 - 75
src/test/frontend/worker/handler/page/rename_test.cljs

@@ -1,75 +0,0 @@
-(ns frontend.worker.handler.page.rename-test
-  (:require [clojure.test :refer [deftest is testing use-fixtures]]
-            [frontend.test.helper :as test-helper]
-            [datascript.core :as d]
-            [frontend.handler.page :as page-handler]
-            [frontend.db :as db]
-            [frontend.worker.handler.page.file-based.rename :as worker-page-rename]
-            [frontend.handler.editor :as editor-handler]))
-
-;; FIXME: merge properties from both pages
-
-(def repo test-helper/test-db-name)
-
-(def init-data (test-helper/initial-test-page-and-blocks))
-
-(def fbid (:block/uuid (second init-data)))
-
-(defn start-and-destroy-db
-  [f]
-  (test-helper/start-and-destroy-db
-   f
-   {:init-data (fn [conn] (d/transact! conn init-data))}))
-
-(use-fixtures :each start-and-destroy-db)
-
-(defn- page-rename [page-uuid new-name]
-  (worker-page-rename/rename! repo (db/get-db repo false) {} page-uuid new-name))
-
-(deftest rename-test
-  (testing "Case change"
-    (let [page (db/get-page "test")]
-      (page-rename (:block/uuid page) "Test")
-      (is (= "Test" (:block/original-name (db/entity (:db/id page)))))))
-
-  (testing "Name changed"
-    (let [page (db/get-page "Test")]
-      (page-rename (:block/uuid page) "New name")
-      (is (= "New name" (:block/original-name (db/entity (:db/id page)))))))
-
-  (testing "Merge existing page"
-    (page-handler/create! "Existing page" {:redirect? false :create-first-block? true})
-    (let [page (db/get-page "new name")]
-      (page-rename (:block/uuid page) "Existing page"))
-    (let [e1 (db/get-page "new name")
-          e2 (db/get-page "existing page")]
-      ;; Old page deleted
-      (is (nil? e1))
-      ;; Blocks from both pages have been merged
-      (is (= (count (:block/_page e2)) (+ 1 (dec (count init-data))))))))
-
-(deftest merge-with-empty-page
-  (page-handler/create! "Existing page" {:redirect? false :create-first-block? false})
-  (let [page (db/get-page "test")]
-    (page-rename (:block/uuid page) "Existing page"))
-  (let [e1 (db/get-page "test")
-        e2 (db/get-page "existing page")]
-      ;; Old page deleted
-    (is (nil? e1))
-      ;; Blocks from both pages have been merged
-    (is (= (count (:block/_page e2)) (dec (count init-data))))))
-
-(deftest merge-existing-pages-should-update-ref-ids
-  (testing "Merge existing page"
-    (editor-handler/save-block! repo fbid "Block 1 [[Test]]")
-    (page-handler/create! "Existing page" {:redirect? false :create-first-block? true})
-    (let [page (db/get-page "test")]
-      (page-rename (:block/uuid page) "Existing page"))
-    (let [e1 (db/get-page "test")
-          e2 (db/get-page "existing page")]
-      ;; Old page deleted
-      (is (nil? e1))
-      ;; Blocks from both pages have been merged
-      (is (= (count (:block/_page e2)) (+ 1 (dec (count init-data)))))
-      ;; Content updated
-      (is (= "Block 1 [[Existing page]]" (:block/content (db/entity [:block/uuid fbid])))))))