فهرست منبع

improve(pdf): display pdf meta info

charlie 4 سال پیش
والد
کامیت
80ad5949d2

+ 20 - 0
src/main/frontend/extensions/pdf/highlights.cljs

@@ -468,6 +468,18 @@
                         outline-data)]
                         outline-data)]
           [:section.is-empty "No outlines"])]])))
           [:section.is-empty "No outlines"])]])))
 
 
+(rum/defc docinfo-display
+  [info]
+  [:div.extensions__pdf-doc-info
+   (for [[k v] info
+         :let [k (pr-str k)]]
+     [:p {:key k} [:strong k] "  " [:i (pr-str v)]])])
+
+(defn make-docinfo-in-modal
+  [info]
+  (fn [close-fn]
+    (docinfo-display info)))
+
 (rum/defc pdf-toolbar
 (rum/defc pdf-toolbar
   [^js viewer]
   [^js viewer]
   (let [[outline-visible?, set-outline-visible!] (rum/use-state false)
   (let [[outline-visible?, set-outline-visible!] (rum/use-state false)
@@ -508,12 +520,20 @@
           {:on-click #(set-outline-visible! (not outline-visible?))}
           {:on-click #(set-outline-visible! (not outline-visible?))}
           (svg/view-list 16)]
           (svg/view-list 16)]
 
 
+         ;; metadata
+         [:a.button.is-info
+          {:on-click #(do
+                        (p/let [ret (pdf-utils/get-meta-data$ viewer)]
+                          (state/set-modal! (make-docinfo-in-modal ret))))}
+          (svg/info)]
+
          [:a.button
          [:a.button
           {:on-click #(state/set-state! :pdf/current nil)}
           {:on-click #(state/set-state! :pdf/current nil)}
           (t :close)]]]
           (t :close)]]]
 
 
        ;; contents outline
        ;; contents outline
        (pdf-outline viewer outline-visible? #(set-outline-visible! false))
        (pdf-outline viewer outline-visible? #(set-outline-visible! false))
+
        ;; settings
        ;; settings
        (and settings-visible? (pdf-settings
        (and settings-visible? (pdf-settings
                                 viewer
                                 viewer

+ 5 - 1
src/main/frontend/extensions/pdf/pdf.css

@@ -60,7 +60,7 @@
     height: 42px;
     height: 42px;
     z-index: 5;
     z-index: 5;
     background: linear-gradient(0deg, rgba(255, 255, 255, 0) 3%, rgba(255, 255, 255, 1) 100%);
     background: linear-gradient(0deg, rgba(255, 255, 255, 0) 3%, rgba(255, 255, 255, 1) 100%);
-    padding: 5px 20px;
+    padding: 8px 20px;
 
 
     > .inner {
     > .inner {
       display: flex;
       display: flex;
@@ -75,6 +75,10 @@
           margin-left: 8px;
           margin-left: 8px;
           padding: 4px 6px;
           padding: 4px 6px;
           color: var(--ls-icon-color);
           color: var(--ls-icon-color);
+
+          &.is-info {
+            opacity: .3;
+          }
         }
         }
       }
       }
     }
     }

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

@@ -80,6 +80,21 @@
 
 
         (set! (.-currentScale viewer) new-scale)))))
         (set! (.-currentScale viewer) new-scale)))))
 
 
+(defn get-meta-data$
+  [^js viewer]
+  (when-let [^js doc (and viewer (.-pdfDocument viewer))]
+    (p/create
+      (fn [resolve]
+        (p/catch
+          (p/then (.getMetadata doc)
+                  (fn [^js r]
+                    (js/console.debug "[metadata] " r)
+                    (when-let [^js info (and r (.-info r))]
+                      (resolve (bean/->clj info)))))
+          (fn [e]
+            (resolve nil)
+            (js/console.error e)))))))
+
 (defn clear-all-selection
 (defn clear-all-selection
   []
   []
   (.removeAllRanges (js/window.getSelection)))
   (.removeAllRanges (js/window.getSelection)))