Browse Source

feat: export page as opml

rcmerci 4 years ago
parent
commit
41678d2767

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

@@ -45,8 +45,12 @@
           [:li.mb-4
            [:a.font-medium {:on-click #(export/export-page-as-markdown! page)}
             (t :export-markdown)]]
+          [:li.mb-4
+           [:a.font-medium {:on-click #(export/export-page-as-opml! page)}
+            (t :export-opml)]]
           [:li.mb-4
            [:a.font-medium {:on-click #(export/convert-page-markdown-unordered-list-or-heading! page)}
             (t :convert-markdown)]]]
          [:a#export-page-as-markdown.hidden]
+         [:a#export-page-as-opml.hidden]
          [:a#convert-markdown-to-unordered-list-or-heading.hidden]]))))

+ 3 - 0
src/main/frontend/dicts.cljs

@@ -246,6 +246,7 @@
         :export "Export"
         :export-json "Export as JSON"
         :export-markdown "Export as standard Markdown (no block properties)"
+        :export-opml "Export as OPML"
         :export-public-pages "Export public pages"
         :export-edn "Export as EDN"
         :convert-markdown "Convert Markdown headings to unordered lists (# -> -)"
@@ -889,6 +890,7 @@
            :re-index "重新建立索引"
            :export-json "以 JSON 格式导出"
            :export-markdown "以 Markdown 格式导出"
+           :export-opml "以 OPML 格式导出"
            :convert-markdown "转换 Markdown 格式(Unordered list 或 Heading)"
            :unlink "解除绑定"
            :search (if config/publishing?
@@ -1131,6 +1133,7 @@
              :re-index "重新建立索引"
              :export-json "以 JSON 格式導出"
              :export-markdown "以 Markdown 格式導出"
+             :export-opml "以 OPML 格式導出"
              :convert-markdown "轉換 Markdown 格式(Unordered list 或 Heading)"
              :unlink "解除綁定"
              :search (if config/publishing?

+ 2 - 0
src/main/frontend/format/adoc.cljs

@@ -28,4 +28,6 @@
      "https://cdnjs.cloudflare.com/ajax/libs/asciidoctor.js/1.5.9/asciidoctor.min.js"
      ok-handler))
   (exportMarkdown [this content config references]
+    (throw "not support"))
+  (exportOPML [this content config]
     (throw "not support")))

+ 12 - 5
src/main/frontend/format/mldoc.cljs

@@ -16,6 +16,7 @@
 (defonce parseHtml (gobj/get Mldoc "parseHtml"))
 (defonce anchorLink (gobj/get Mldoc "anchorLink"))
 (defonce parseAndExportMarkdown (gobj/get Mldoc "parseAndExportMarkdown"))
+(defonce parseAndExportOPML (gobj/get Mldoc "parseAndExportOPML"))
 (defonce astExportMarkdown (gobj/get Mldoc "astExportMarkdown"))
 
 (defn default-config
@@ -48,22 +49,26 @@
 
 (defn parse-json
   [content config]
-  (parseJson content (or config default-config)))
+  (parseJson content config))
 
 (defn inline-parse-json
   [text config]
-  (parseInlineJson text (or config default-config)))
+  (parseInlineJson text config))
 
 (defn parse-export-markdown
   [content config references]
   (parseAndExportMarkdown content
-                          (or config default-config)
+                          config
                           (or references default-references)))
 
+(defn parse-export-opml
+  [content config]
+  (parseAndExportOPML content config))
+
 (defn ast-export-markdown
   [ast config references]
   (astExportMarkdown ast
-                     (or config default-config)
+                     config
                      (or references default-references)))
 
 ;; Org-roam
@@ -238,7 +243,9 @@
   (lazyLoad [this ok-handler]
     true)
   (exportMarkdown [this content config references]
-    (parse-export-markdown content config references)))
+    (parse-export-markdown content config references))
+  (exportOPML [this content config]
+    (parse-export-opml content config)))
 
 (defn plain->text
   [plains]

+ 2 - 1
src/main/frontend/format/protocol.cljs

@@ -5,4 +5,5 @@
   (toHtml [this content config])
   (loaded? [this])
   (lazyLoad [this ok-handler])
-  (exportMarkdown [this content config references]))
+  (exportMarkdown [this content config references])
+  (exportOPML [this content config]))

+ 28 - 0
src/main/frontend/handler/export.cljs

@@ -424,6 +424,15 @@
                                              (clj->js (f (first names)))))])))
          (remove nil?))))
 
+(defn- export-files-as-opml
+  [repo files]
+  (->> files
+       (mapv (fn [{:keys [path content names format]}]
+               (when (first names)
+                 [path (fp/exportOPML f/mldoc-record content
+                                      (f/get-default-config format))])))
+       (remove nil?)))
+
 (defn- convert-md-files-unordered-list-or-heading
   [repo files heading-to-list?]
   (->> files
@@ -482,6 +491,25 @@
                   (.setAttribute anchor "download" path)
                   (.click anchor))))))))))
 
+(defn export-page-as-opml!
+  [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 (get-page-content page-name)]
+          (let [names [page-name]
+                format (f/get-format path)
+                files [{:path path :content content :names names :format format}]]
+            (let [files (export-files-as-opml repo files)]
+              (let [data (js/Blob. [(second (first files))]
+                                   (clj->js {:type "text/plain;charset=utf-8,"}))]
+                (let [anchor (gdom/getElement "export-page-as-opml")
+                      url (js/window.URL.createObjectURL data)]
+                  (.setAttribute anchor "href" url)
+                  (.setAttribute anchor "download" path)
+                  (.click anchor))))))))))
+
+
 (defn convert-page-markdown-unordered-list-or-heading!
   [page-name]
   (when-let [repo (state/get-current-repo)]