Browse Source

Merge pull request #5250 from logseq/fix/missing-title-property

fix: missing title properties when page name contains `/` or reserved chars
Tienson Qin 3 years ago
parent
commit
839fa0dcba

+ 8 - 2
src/main/frontend/components/block.cljs

@@ -391,13 +391,19 @@
       :on-mouse-down
       (fn [e]
         (util/stop e)
-        (if (gobj/get e "shiftKey")
+        (cond
+          (gobj/get e "shiftKey")
           (when-let [page-entity (db/entity [:block/name redirect-page-name])]
             (state/sidebar-add-block!
              (state/get-current-repo)
              (:db/id page-entity)
              :page))
-          (state/pub-event! [:page/create redirect-page-name]))
+
+          (not= redirect-page-name page-name)
+          (route-handler/redirect-to-page! redirect-page-name)
+
+          :else
+          (state/pub-event! [:page/create page-name-in-block]))
         (when (and contents-page?
                    (util/mobile?)
                    (state/get-left-sidebar-open?))

+ 3 - 2
src/main/frontend/format/block.cljs

@@ -258,13 +258,14 @@
            [original-page-name page-name journal-day] (convert-page-if-journal original-page-name)
            namespace? (and (not (boolean (text/get-nested-page-name original-page-name)))
                            (text/namespace-page? original-page-name))
-           page-entity (db/entity [:block/name page-name])]
+           page-entity (db/entity [:block/name page-name])
+           original-page-name (or (:block/original-name page-entity) original-page-name)]
        (merge
         {:block/name page-name
          :block/original-name original-page-name}
         (when with-id?
           (if page-entity
-            {}
+            {:block/uuid (:block/uuid page-entity)}
             {:block/uuid (db/new-block-id)}))
         (when namespace?
           (let [namespace (first (gp-util/split-last "/" original-page-name))]

+ 6 - 6
src/main/frontend/handler/editor.cljs

@@ -657,12 +657,12 @@
             new-block))))))
 
 (defn insert-first-page-block-if-not-exists!
-  ([page-name]
-   (insert-first-page-block-if-not-exists! page-name {}))
-  ([page-name opts]
-   (when (and (string? page-name)
-              (not (string/blank? page-name)))
-     (state/pub-event! [:page/create page-name opts]))))
+  ([page-title]
+   (insert-first-page-block-if-not-exists! page-title {}))
+  ([page-title opts]
+   (when (and (string? page-title)
+              (not (string/blank? page-title)))
+     (state/pub-event! [:page/create page-title opts]))))
 
 (defn properties-block
   [properties format page]

+ 1 - 1
src/main/frontend/handler/extract.cljs

@@ -32,7 +32,7 @@
             file-name (when-let [file-name (last (string/split file #"/"))]
                         (let [result (first (gp-util/split-last "." file-name))]
                           (if (config/mldoc-support? (string/lower-case (util/get-file-ext file)))
-                            (string/replace result "." "/")
+                            (util/url-decode (string/replace result "." "/"))
                             result)))]
         (or property-name
             (if (= (state/page-name-order) "heading")

+ 19 - 12
src/main/frontend/handler/page.cljs

@@ -91,12 +91,16 @@
 (defn- build-page-tx [format properties page journal?]
   (when (:block/uuid page)
     (let [page-entity [:block/uuid (:block/uuid page)]
-          create-title? (create-title-property? journal? (:block/name page))
+          create-title? (create-title-property? journal?
+                                                (or
+                                                 (:block/original-name page)
+                                                 (:block/name page)))
           page (if (seq properties) (assoc page :block/properties properties) page)]
       (cond
         create-title?
-        [page
-         (default-properties-block (build-title page) format page-entity properties)]
+        (let [properties-block (default-properties-block (build-title page) format page-entity properties)]
+          [page
+           properties-block])
 
         (seq properties)
         [page (editor-handler/properties-block properties format page-entity)]
@@ -117,7 +121,7 @@
          title (util/remove-boundary-slashes title)
          page-name (util/page-name-sanity-lc title)
          repo (state/get-current-repo)]
-     (when-not (db/page-exists? page-name)
+     (when (db/page-empty? repo page-name)
        (let [pages    (if split-namespace?
                         (util/split-namespace-pages title)
                         [title])
@@ -130,16 +134,19 @@
                            ;; for namespace pages, only last page need properties
                            drop-last
                            (mapcat #(build-page-tx format nil % journal?))
-                           (remove nil?))
+                           (remove nil?)
+                           (remove (fn [m]
+                                     (some? (db/entity [:block/name (:block/name m)])))))
              last-txs (build-page-tx format properties (last pages) journal?)
              txs      (concat txs last-txs)]
-         (db/transact! txs)))
+         (when (seq txs)
+           (db/transact! txs)))
 
-     (when create-first-block?
-       (when (or
-              (db/page-empty? repo (:db/id (db/entity [:block/name page-name])))
-              (create-title-property? journal? page-name))
-         (editor-handler/api-insert-new-block! "" {:page page-name})))
+       (when create-first-block?
+         (when (or
+                (db/page-empty? repo (:db/id (db/entity [:block/name page-name])))
+                (create-title-property? journal? page-name))
+           (editor-handler/api-insert-new-block! "" {:page page-name}))))
 
      (when redirect?
        (route-handler/redirect-to-page! page-name))
@@ -361,7 +368,7 @@
   "Only accepts unsanitized page names"
   [old-name new-name redirect?]
   (let [old-page-name       (util/page-name-sanity-lc old-name)
-        new-file-name       (util/page-name-sanity new-name true)
+        new-file-name       (util/file-name-sanity new-name)
         new-page-name       (util/page-name-sanity-lc new-name)
         repo                (state/get-current-repo)
         page                (db/pull [:block/name old-page-name])]

+ 5 - 3
src/main/frontend/modules/file/core.cljs

@@ -30,8 +30,10 @@
 (defn transform-content
   [{:block/keys [collapsed? format pre-block? unordered content heading-level left page parent properties]} level {:keys [heading-to-list?]}]
   (let [content (or content "")
-        first-block? (= left page)
-        pre-block? (and first-block? pre-block?)
+        pre-block? (or pre-block?
+                       (and (= page parent left) ; first block
+                            (= :markdown format)
+                            (string/includes? (first (string/split-lines content)) ":: ")))
         markdown? (= format :markdown)
         content (cond
                   pre-block?
@@ -125,7 +127,7 @@
                   (if journal-page?
                     (date/journal-title->default title)
                     (-> (or (:block/original-name page) (:block/name page))
-                        (util/page-name-sanity true))) "."
+                        (util/file-name-sanity))) "."
                   (if (= format "markdown") "md" format))
             file-path (config/get-file-path repo path)
             file {:file/path file-path}

+ 25 - 16
src/main/frontend/util.cljc

@@ -387,16 +387,6 @@
      ([animate?]
       (scroll-to (app-scroll-container-node) 0 animate?))))
 
-#?(:cljs
-   (defn url-encode
-     [string]
-     (some-> string str (js/encodeURIComponent) (.replace "+" "%20"))))
-
-#?(:cljs
-   (defn url-decode
-     [string]
-     (some-> string str (js/decodeURIComponent))))
-
 #?(:cljs
    (defn link?
      [node]
@@ -889,6 +879,16 @@
          (when (gp-util/uuid-string? block-id)
            (first (array-seq (js/document.getElementsByClassName block-id))))))))
 
+#?(:cljs
+   (defn url-encode
+     [string]
+     (some-> string str (js/encodeURIComponent) (.replace "+" "%20"))))
+
+#?(:cljs
+   (defn url-decode
+     [string]
+     (some-> string str (js/decodeURIComponent))))
+
 (def windows-reserved-chars #"[:\\*\\?\"<>|]+")
 
 #?(:cljs
@@ -928,21 +928,30 @@
      (removeAccents (.normalize (string/lower-case s) "NFKC"))))
 
 (defn page-name-sanity
-  "Sanitize the page-name for file name (strict), for file writting"
+  "Sanitize the page-name."
   ([page-name]
    (page-name-sanity page-name false))
   ([page-name replace-slash?]
    (let [page (some-> page-name
                       (remove-boundary-slashes)
-                      ;; Windows reserved path characters
-                      (string/replace windows-reserved-chars "_")
-                      ;; for android filesystem compatiblity
-                      (string/replace #"[\\#|%]+" "_")
                       (normalize))]
      (if replace-slash?
-       (string/replace page #"/" ".")
+       (string/replace page #"/" "%2A")
        page))))
 
+#?(:cljs
+   (defn file-name-sanity
+     "Sanitize page-name for file name (strict), for file writing."
+     [page-name]
+     (some-> page-name
+             page-name-sanity
+             ;; for android filesystem compatiblity
+             (string/replace #"[\\#|%]+" url-encode)
+             ;; Windows reserved path characters
+             (string/replace windows-reserved-chars url-encode)
+             (string/replace #"/" url-encode)
+             (string/replace "*" "%2A"))))
+
 (defn page-name-sanity-lc
   "Sanitize the query string for a page name (mandate for :block/name)"
   [s]

+ 1 - 1
src/test/frontend/handler/repo_test.cljs

@@ -159,7 +159,7 @@
                   (into {})))
           "Counts for blocks with common block attributes")
 
-      (is (= #{"term" "setting" "book" "templates" "Query" "Query/table" "page"}
+      (is (= #{"term" "setting" "book" "Templates" "Query" "Query/table" "page"}
              (->> (d/q '[:find (pull ?n [*]) :where [?b :block/namespace ?n]] db)
                   (map (comp :block/original-name first))
                   set))