Bläddra i källkod

feat(opml): block-level export

rcmerci 4 år sedan
förälder
incheckning
e993fe5581
1 ändrade filer med 24 tillägg och 6 borttagningar
  1. 24 6
      src/main/frontend/handler/export.cljs

+ 24 - 6
src/main/frontend/handler/export.cljs

@@ -34,7 +34,6 @@
    (outliner-tree/blocks->vec-tree
    (outliner-tree/blocks->vec-tree
     (db/get-page-blocks-no-cache page) page) {:init-level 1
     (db/get-page-blocks-no-cache page) page) {:init-level 1
                                               :heading-to-list? true}))
                                               :heading-to-list? true}))
-
 (defn- get-file-content
 (defn- get-file-content
   [file-path]
   [file-path]
   (if-let [page-name
   (if-let [page-name
@@ -196,7 +195,10 @@
                 (if v v
                 (if v v
                     (let [[ref-blocks ref-pages]
                     (let [[ref-blocks ref-pages]
                           (->> (if is-block?
                           (->> (if is-block?
-                                 [page-or-block]
+                                 (if (or (seq? page-or-block)
+                                         (vector? page-or-block))
+                                   (vec page-or-block)
+                                   [page-or-block])
                                  (db/get-page-blocks-no-cache
                                  (db/get-page-blocks-no-cache
                                   repo page-or-block {:pull-keys '[:block/refs]}))
                                   repo page-or-block {:pull-keys '[:block/refs]}))
                                (filterv :block/refs)
                                (filterv :block/refs)
@@ -242,9 +244,9 @@
       f)))
       f)))
 
 
 (defn- get-page&block-refs-by-query
 (defn- get-page&block-refs-by-query
-  [repo page get-page&block-refs-by-query-aux]
+  [repo page-or-block get-page&block-refs-by-query-aux {:keys [is-block?] :or {is-block? false}}]
   (let [[block-ids page-ids]
   (let [[block-ids page-ids]
-        (get-page&block-refs-by-query-aux repo page false #{} #{})
+        (get-page&block-refs-by-query-aux repo page-or-block is-block? #{} #{})
         blocks
         blocks
         (db/pull-many repo '[*] block-ids)
         (db/pull-many repo '[*] block-ids)
         pages-name-and-content
         pages-name-and-content
@@ -420,7 +422,7 @@
   [repo files heading-to-list?]
   [repo files heading-to-list?]
   (let [get-page&block-refs-by-query-aux (get-embed-and-refs-blocks-pages-aux)
   (let [get-page&block-refs-by-query-aux (get-embed-and-refs-blocks-pages-aux)
         f (if (< (count files) 30)      ;query db for per page if (< (count files) 30), or pre-compute whole graph's page&block-refs
         f (if (< (count files) 30)      ;query db for per page if (< (count files) 30), or pre-compute whole graph's page&block-refs
-            #(get-page&block-refs-by-query repo % get-page&block-refs-by-query-aux)
+            #(get-page&block-refs-by-query repo % get-page&block-refs-by-query-aux {})
             (let [page&block-refs (page&block-refs repo)]
             (let [page&block-refs (page&block-refs repo)]
               #(get-page&block-refs repo % page&block-refs)))]
               #(get-page&block-refs repo % page&block-refs)))]
     (->> files
     (->> files
@@ -436,7 +438,7 @@
   [repo files]
   [repo files]
   (let [get-page&block-refs-by-query-aux (get-embed-and-refs-blocks-pages-aux)
   (let [get-page&block-refs-by-query-aux (get-embed-and-refs-blocks-pages-aux)
         f (if (< (count files) 30)      ;query db for per page if (< (count files) 30), or pre-compute whole graph's page&block-refs
         f (if (< (count files) 30)      ;query db for per page if (< (count files) 30), or pre-compute whole graph's page&block-refs
-            #(get-page&block-refs-by-query repo % get-page&block-refs-by-query-aux)
+            #(get-page&block-refs-by-query repo % get-page&block-refs-by-query-aux {})
             (let [page&block-refs (page&block-refs repo)]
             (let [page&block-refs (page&block-refs repo)]
               #(get-page&block-refs repo % page&block-refs)))]
               #(get-page&block-refs repo % page&block-refs)))]
     (->> files
     (->> files
@@ -452,6 +454,22 @@
                                            (clj->js (f (first names)))))]))))
                                            (clj->js (f (first names)))))]))))
          (remove nil?))))
          (remove nil?))))
 
 
+(defn- export-blocks-as-opml
+  [repo root-block-uuid]
+  (let [get-page&block-refs-by-query-aux (get-embed-and-refs-blocks-pages-aux)
+        f #(get-page&block-refs-by-query repo % get-page&block-refs-by-query-aux {:is-block? true})
+        root-block (db/entity [:block/uuid root-block-uuid])
+        blocks (db/get-block-and-children repo root-block-uuid)
+        refs (f blocks)
+        content (get-blocks-contents repo root-block-uuid)
+        format (or (:block/format root-block) (state/get-preferred-format))]
+    (fp/exportOPML f/mldoc-record content
+                   (f/get-default-config format)
+                   "untitled"
+                   (js/JSON.stringify (clj->js refs)))))
+
+
+
 (defn- convert-md-files-unordered-list-or-heading
 (defn- convert-md-files-unordered-list-or-heading
   [repo files heading-to-list?]
   [repo files heading-to-list?]
   (->> files
   (->> files