export.cljs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. (ns frontend.components.export
  2. (:require [rum.core :as rum]
  3. [frontend.ui :as ui]
  4. [frontend.util :as util]
  5. [frontend.handler.export :as export]
  6. [frontend.state :as state]
  7. [frontend.context.i18n :as i18n]))
  8. (rum/defc export
  9. []
  10. (when-let [current-repo (state/get-current-repo)]
  11. (rum/with-context [[t] i18n/*tongue-context*]
  12. [:div.export.w-96
  13. [:h1.title "Export"]
  14. [:ul.mr-1
  15. (when (util/electron?)
  16. [:li.mb-4
  17. [:a.font-medium {:on-click #(export/export-repo-as-html! current-repo)}
  18. (t :export-public-pages)]])
  19. [:li.mb-4
  20. [:a.font-medium {:on-click #(export/export-repo-as-markdown! current-repo)}
  21. (t :export-markdown)]]
  22. [:li.mb-4
  23. [:a.font-medium {:on-click #(export/export-repo-as-opml! current-repo)}
  24. (t :export-opml)]]
  25. [:li.mb-4
  26. [:a.font-medium {:on-click #(export/export-repo-as-edn-v2! current-repo)}
  27. (t :export-edn)]]
  28. [:li.mb-4
  29. [:a.font-medium {:on-click #(export/export-repo-as-json-v2! current-repo)}
  30. (t :export-json)]]
  31. [:li.mb-4
  32. [:a.font-medium {:on-click #(export/export-repo-as-roam-json! current-repo)}
  33. (t :export-roam-json)]]
  34. [:li.mb-4
  35. [:a.font-medium {:on-click #(export/convert-repo-markdown-v2! current-repo)}
  36. (t :convert-markdown)]]]
  37. [:a#download-as-edn-v2.hidden]
  38. [:a#download-as-json-v2.hidden]
  39. [:a#download-as-roam-json.hidden]
  40. [:a#download-as-html.hidden]
  41. [:a#download-as-zip.hidden]
  42. [:a#export-as-markdown.hidden]
  43. [:a#export-as-opml.hidden]
  44. [:a#convert-markdown-to-unordered-list-or-heading.hidden]])))
  45. (rum/defc export-page
  46. []
  47. (when-let [current-repo (state/get-current-repo)]
  48. (when-let [page (state/get-current-page)]
  49. (rum/with-context [[t] i18n/*tongue-context*]
  50. [:div.export.w-96
  51. [:h1.title "Export"]
  52. [:ul.mr-1
  53. [:li.mb-4
  54. [:a.font-medium {:on-click #(export/export-page-as-markdown! page)}
  55. (t :export-markdown)]]
  56. [:li.mb-4
  57. [:a.font-medium {:on-click #(export/export-page-as-opml! page)}
  58. (t :export-opml)]]]
  59. [:a#export-page-as-markdown.hidden]
  60. [:a#export-page-as-opml.hidden]
  61. [:a#convert-markdown-to-unordered-list-or-heading.hidden]]))))
  62. (def *export-block-type (atom :text))
  63. (def text-indent-style-options [{:label "dashes"
  64. :selected false}
  65. {:label "spaces"
  66. :selected false}
  67. {:label "no-indent"
  68. :selected false}])
  69. (def *export-block-text-indent-style (atom "dashes"))
  70. (rum/defcs export-blocks
  71. < rum/reactive
  72. (rum/local false ::copied?)
  73. [state root-block-id]
  74. (let [current-repo (state/get-current-repo)
  75. type (rum/react *export-block-type)
  76. text-indent-style (rum/react *export-block-text-indent-style)
  77. copied? (::copied? state)
  78. content
  79. (case type
  80. :text (export/export-blocks-as-markdown current-repo root-block-id text-indent-style)
  81. :opml (export/export-blocks-as-opml current-repo root-block-id)
  82. (export/export-blocks-as-markdown current-repo root-block-id text-indent-style))]
  83. [:div.export.w-96.resize
  84. [:div
  85. {:class "mb-2"}
  86. (ui/button "Text"
  87. :class "mr-2 w-20"
  88. :on-click #(reset! *export-block-type :text))
  89. (ui/button "OPML"
  90. :class "w-20"
  91. :on-click #(reset! *export-block-type :opml))]
  92. [:textarea.overflow-y-auto.h-96 {:value content}]
  93. (let [options (->> text-indent-style-options
  94. (mapv (fn [opt]
  95. (if (= text-indent-style (:label opt))
  96. (assoc opt :selected true)
  97. opt))))]
  98. [:div.flex.items-center
  99. [:label.mr-8 "Indentation style:"]
  100. [:select.block.my-2.text-lg.rounded.border
  101. {:style {:padding "0 0 0 12px"
  102. :visibility (if (= :text type) "visible" "hidden")}
  103. :on-change (fn [e]
  104. (let [value (util/evalue e)]
  105. (#(reset! *export-block-text-indent-style %) value)))}
  106. (for [{:keys [label value selected]} options]
  107. [:option (cond->
  108. {:key label
  109. :value (or value label)}
  110. selected
  111. (assoc :selected selected))
  112. label])]])
  113. (ui/button (if @copied? "Copied to clipboard!" "Copy to clipboard")
  114. :on-click (fn []
  115. (util/copy-to-clipboard! content)
  116. (reset! copied? true)))]))