浏览代码

Change export to not depend on printing - close #4211

Gabriel Horner 3 年之前
父节点
当前提交
b0babf2232

+ 2 - 1
.clj-kondo/config.edn

@@ -12,7 +12,8 @@
   :consistent-alias
   {:aliases {datascript.core d
              datascript.transit dt
-             datascript.db ddb}}}
+             datascript.db ddb
+             lambdaisland.glogi log}}}
 
  :hooks {:analyze-call {rum.core/defc hooks.rum/defc
                          rum.core/defcs hooks.rum/defcs}}

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

@@ -379,7 +379,7 @@
                                                               (= k (:db/id (:block/left block))))
                                                             blocks)
                                                     (map #(select-keys % [:db/id :block/level :block/content :block/file])))}))))]
-         (util/pprint duplicates)))
+         #_(util/pprint duplicates)))
      (assert (= (count blocks) (count (set (map :block/left blocks)))) "Each block should have a different left node"))
 
    (let [left->blocks (reduce (fn [acc b] (assoc acc (:db/id (:block/left b)) b)) {} blocks)]

+ 15 - 10
src/main/frontend/handler/export.cljs

@@ -17,7 +17,8 @@
             [frontend.util :as util]
             [frontend.format.mldoc :as mldoc]
             [goog.dom :as gdom]
-            [promesa.core :as p]))
+            [promesa.core :as p])
+  (:import [goog.string StringBuffer]))
 
 (defn- get-page-content
   [repo page]
@@ -464,17 +465,21 @@
       (str "_" (quot (util/time-ms) 1000))
       (str "." (string/lower-case (name extension)))))
 
+(defn- export-repo-as-edn-str [repo]
+  (when-let [conn (db/get-conn repo)]
+    (let [sb (StringBuffer.)]
+      (pprint/pprint (blocks conn) (StringBufferWriter. sb))
+      (str sb))))
+
 (defn export-repo-as-edn-v2!
   [repo]
-  (when-let [conn (db/get-conn repo)]
-    (let [edn-str (with-out-str
-                    (pprint/pprint
-                     (blocks conn)))
-          data-str (str "data:text/edn;charset=utf-8," (js/encodeURIComponent edn-str))]
-      (when-let [anchor (gdom/getElement "download-as-edn-v2")]
-        (.setAttribute anchor "href" data-str)
-        (.setAttribute anchor "download" (file-name repo :edn))
-        (.click anchor)))))
+  (when-let [data-str (some->> (export-repo-as-edn-str repo)
+                               js/encodeURIComponent
+                               (str "data:text/edn;charset=utf-8,"))]
+    (when-let [anchor (gdom/getElement "download-as-edn-v2")]
+      (.setAttribute anchor "href" data-str)
+      (.setAttribute anchor "download" (file-name repo :edn))
+      (.click anchor))))
 
 (defn- nested-update-id
   [vec-tree]

+ 11 - 4
src/test/frontend/handler/export_test.cljs

@@ -1,7 +1,6 @@
 (ns frontend.handler.export-test
-  ;; namespace local config for private function tests
-  {:clj-kondo/config {:linters {:private-call {:level :off}}}}
-  (:require [cljs.test :refer [async deftest use-fixtures are]]
+  (:require [cljs.test :refer [async deftest use-fixtures are is]]
+            [clojure.edn :as edn]
             [frontend.handler.export :as export]
             [frontend.db.config :as config]
             [frontend.handler.repo :as repo-handler]
@@ -52,9 +51,17 @@
 (deftest export-files-as-markdown
   (are [expect files]
       (= expect
-         (export/export-files-as-markdown (state/get-current-repo) files true))
+         (@#'export/export-files-as-markdown (state/get-current-repo) files true))
     [["pages/page1.md" "- 1\n\t- 2\n\t\t- 3\n\t\t- 3\n- 4"]]
     [{:path "pages/page1.md" :content (:file/content (nth test-files 0)) :names ["page1"] :format :markdown}]
 
     [["pages/page2.md" "- 3\n\t- 1\n\t\t- 2\n\t\t\t- 3\n\t\t\t- 3\n\t- 4"]]
     [{:path "pages/page2.md" :content (:file/content (nth test-files 1)) :names ["page2"] :format :markdown}]))
+
+(deftest export-repo-as-edn-str
+  (let [edn-output (edn/read-string
+                    (@#'export/export-repo-as-edn-str (state/get-current-repo)))]
+    (is (= #{:version :blocks} (set (keys edn-output)))
+        "Correct top-level keys")
+    (is (= ["page1" "page2"] (map :block/page-name (:blocks edn-output)))
+        "Correct pages")))