Browse Source

feat: support exporting single page to markdown

rcmerci 4 years ago
parent
commit
9eab95786b

+ 14 - 0
src/main/frontend/components/export.cljs

@@ -28,3 +28,17 @@
        [:a#download-as-html.hidden]
        [:a#download-as-zip.hidden]
        [:a#export-as-markdown.hidden]])))
+
+
+(rum/defc export-page
+  []
+  (when-let [current-repo (state/get-current-repo)]
+    (when-let [page (state/get-current-page)]
+      (rum/with-context [[t] i18n/*tongue-context*]
+        [:div.export.w-96
+         [:h1.title "Export"]
+         [:ul.mr-1
+          [:li.mb-4
+           [:a.font-medium {:on-click #(export/export-page-as-markdown! page)}
+            (t :export-markdown)]]]
+         [:a#export-page-as-markdown.hidden]]))))

+ 5 - 0
src/main/frontend/components/page.cljs

@@ -16,6 +16,7 @@
             [frontend.components.editor :as editor]
             [frontend.components.reference :as reference]
             [frontend.components.svg :as svg]
+            [frontend.components.export :as export]
             [frontend.extensions.graph-2d :as graph-2d]
             [frontend.ui :as ui]
             [frontend.components.content :as content]
@@ -313,6 +314,10 @@
                               {:title (t :page/delete)
                                :options {:on-click #(state/set-modal! (delete-page-dialog page-name))}})
 
+                            (when (state/get-current-page)
+                              {:title (t :export)
+                               :options {:on-click #(state/set-modal! export/export-page)}})
+
                             (when (util/electron?)
                               {:title  (t (if public? :page/make-private :page/make-public))
                                :options {:on-click

+ 4 - 1
src/main/frontend/db/model.cljs

@@ -271,6 +271,7 @@
       @conn)
      (into {}))))
 
+
 (defn get-files-full
   [repo]
   (when-let [conn (conn/get-files-conn repo)]
@@ -705,9 +706,11 @@
 
 (defn get-page-file
   [page-name]
-  (some-> (db-utils/entity [:page/name page-name])
+  (some-> (or (db-utils/entity [:page/name page-name])
+              (db-utils/entity [:page/original-name page-name]))
           :page/file))
 
+
 (defn get-block-file
   [block-id]
   (let [page-id (some-> (db-utils/entity [:block/uuid block-id])

+ 31 - 8
src/main/frontend/handler/export.cljs

@@ -205,23 +205,46 @@
     {:embed_blocks embed-blocks
      :embed_pages pages-name-and-content}))
 
+(defn- export-files-as-markdown
+  [repo files heading-to-list?]
+  (->> files
+       (mapv (fn [{:keys [path content names format]}]
+               (when (first names)
+                 [path (fp/exportMarkdown f/mldoc-record content
+                                          (f/get-default-config format heading-to-list?)
+                                          (js/JSON.stringify
+                                           (clj->js (get-embed-and-refs-blocks-pages repo (first names)))))])))
+       (remove nil?)))
+
 (defn export-repo-as-markdown!
   [repo]
   (when-let [repo (state/get-current-repo)]
     (when-let [files (get-file-contents-with-suffix repo)]
       (let [heading-to-list? (state/export-heading-to-list?)
             files
-            (->> files
-                 (mapv (fn [{:keys [path content names format]}]
-                         (when (first names)
-                           [path (fp/exportMarkdown f/mldoc-record content
-                                                    (f/get-default-config format heading-to-list?)
-                                                    (js/JSON.stringify
-                                                     (clj->js (get-embed-and-refs-blocks-pages repo (first names)))))])))
-                 (remove nil?))
+            (export-files-as-markdown repo files heading-to-list?)
             zip-file-name (str repo "_markdown_" (quot (util/time-ms) 1000))]
         (p/let [zipfile (zip/make-zip zip-file-name files)]
           (when-let [anchor (gdom/getElement "export-as-markdown")]
             (.setAttribute anchor "href" (js/window.URL.createObjectURL zipfile))
             (.setAttribute anchor "download" (.-name zipfile))
             (.click anchor)))))))
+
+(defn export-page-as-markdown!
+  [page-name]
+  (when-let [repo (state/get-current-repo)]
+    (when-let [file (db/get-page-file page-name)]
+      (when-let [path (:file/path file)]
+        (when-let [content (db/get-file path)]
+          (let [names [page-name]
+                format (f/get-format path)
+                files [{:path path :content content :names names :format format}]]
+            (let [files
+                  (export-files-as-markdown repo files (state/export-heading-to-list?))]
+              (let [data (js/Blob. [(second (first files))]
+                                   (clj->js {:type "text/plain;charset=utf-8,"}))]
+                (let [anchor (gdom/getElement "export-page-as-markdown")
+                      url (js/window.URL.createObjectURL data)]
+                  (.setAttribute anchor "href" url)
+                  (.setAttribute anchor "download" path)
+                  (.click anchor))))))))))