Browse Source

improve(pdf): persist highlights data as edn file

charlie 4 years ago
parent
commit
cb05f431f5

+ 23 - 2
src/main/frontend/extensions/pdf/assets.cljs

@@ -6,7 +6,9 @@
             [frontend.handler.editor :as editor-handler]
             [frontend.state :as state]
             [frontend.config :as config]
+            [frontend.fs :as fs]
             [frontend.components.svg :as svg]
+            [cljs.reader :as reader]
             [promesa.core :as p]
             [clojure.string :as string]
             [cljs-bean.core :as bean]))
@@ -19,13 +21,32 @@
                    (string/ends-with? filename ".pdf")
                    (string/replace-first filename ".pdf" ""))]
     {:key      key
+     :identity (subs key (- (count key) 15))
      :filename filename
      :url      (utils/node-path.join
                  "file://"                                  ;; TODO: bfs
                  (config/get-repo-dir (state/get-current-repo))
                  "assets" filename)
 
-     :hls-file (str "assets/" key ".json")}))
+     :hls-file (str "assets/" key ".edn")}))
+
+(defn load-hls-data$
+  [{:keys [hls-file]}]
+  (when hls-file
+    (let [repo-cur (state/get-current-repo)
+          repo-dir (config/get-repo-dir repo-cur)]
+      (p/let [_ (fs/create-if-not-exists repo-cur repo-dir hls-file "{:highlights []}")
+              res (fs/read-file repo-dir hls-file)
+              data (if res (reader/read-string res) {})]
+        data))))
+
+(defn persist-hls-data$
+  [{:keys [hls-file]} highlights]
+  (when hls-file
+    (let [repo-cur (state/get-current-repo)
+          repo-dir (config/get-repo-dir repo-cur)
+          data (pr-str {:highlights highlights})]
+      (fs/write-file! repo-cur repo-dir hls-file data {:skip-mtime? true}))))
 
 (defn upload-asset!
   [page-block files refresh-file!]
@@ -71,7 +92,7 @@
         [:div.extensions__pdf-assets-uploader
          (for [file files]
            [:a.ui__button
-            {:key file
+            {:key      file
              :intent   "logseq"
              :on-click (fn []
                          (when-let [current (inflate-asset file)]

+ 7 - 11
src/main/frontend/extensions/pdf/highlights.cljs

@@ -5,6 +5,7 @@
             [medley.core :as medley]
             [frontend.handler.notification :as notification]
             [frontend.extensions.pdf.utils :as pdf-utils]
+            [frontend.extensions.pdf.assets :as pdf-assets]
             [frontend.util :as front-utils]
             [frontend.state :as state]
             [frontend.config :as config]
@@ -100,7 +101,7 @@
                           ;; add highlight
                           (do
                             (add-hl! (merge highlight
-                                            {:id         (pdf-utils/gen-id)
+                                            {:id         (pdf-utils/gen-uuid)
                                              :properties properties}))
                             (pdf-utils/clear-all-selection))
 
@@ -489,7 +490,7 @@
         (rum/with-key (pdf-resizer viewer) "pdf-resizer")])]))
 
 (rum/defc pdf-loader
-  [{:keys [url hls-file]}]
+  [{:keys [url hls-file] :as pdf-current}]
   (let [*doc-ref (rum/use-ref nil)
         [state, set-state!] (rum/use-state {:error nil :pdf-document nil :status nil})
         [hls-state, set-hls-state!] (rum/use-state {:initial-hls nil :latest-hls nil})
@@ -502,11 +503,9 @@
     (rum/use-effect!
       (fn []
         (p/catch
-          (p/let [_ (fs/create-if-not-exists repo-cur repo-dir hls-file "[]")
-                  res (fs/read-file repo-dir hls-file)
-                  data (if res (bean/->clj (js/JSON.parse res)) [])]
-
-            (set-hls-state! {:initial-hls data}))
+          (p/let [data (pdf-assets/load-hls-data$ pdf-current)
+                  highlights (:highlights data)]
+            (set-hls-state! {:initial-hls highlights}))
 
           ;; error
           (fn [e]
@@ -522,10 +521,7 @@
       (fn []
         (when-let [hls (:latest-hls hls-state)]
           (p/catch
-            (p/let [hls (if hls
-                          (js/JSON.stringify (bean/->js hls) nil 2)
-                          "[]")
-                    _ (fs/write-file! repo-cur repo-dir hls-file hls {:skip-mtime? true})])
+            (pdf-assets/persist-hls-data$ pdf-current hls)
 
             ;; write hls file error
             (fn [e]

+ 4 - 0
src/main/frontend/extensions/pdf/utils.cljs

@@ -3,6 +3,7 @@
             [cljs-bean.core :as bean]
             [frontend.util :as front-utils]
             ["/frontend/extensions/pdf/utils" :as js-utils]
+            [frontend.db :as front-db]
             [frontend.loader :refer [load]]))
 
 (defonce MAX-SCALE 5.0)
@@ -96,6 +97,9 @@
   (str (.toString (js/Date.now) 36)
        (.. (js/Math.random) (toString 36) (substr 2 4))))
 
+(defn gen-uuid []
+  (front-db/new-block-id))
+
 (defn js-load$
   [url]
   (p/create