handler.cljs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. (ns frontend.extensions.zotero.handler
  2. (:require [cljs.core.async :refer [<! go]]
  3. [clojure.string :as str]
  4. [frontend.extensions.zotero.api :as zotero-api]
  5. [frontend.extensions.zotero.extractor :as extractor]
  6. [frontend.extensions.zotero.setting :as setting]
  7. [frontend.handler.notification :as notification]
  8. [frontend.state :as state]
  9. [frontend.handler.editor :as editor-handler]
  10. [frontend.handler.page :as page-handler]))
  11. (defn add [page-name type item]
  12. (go
  13. (let [key (:key item)
  14. num-children (-> item :meta :num-children)
  15. api-fn (case type
  16. :notes zotero-api/notes
  17. :attachments zotero-api/attachments)
  18. first-block (case type
  19. :notes (setting/setting :notes-block-text)
  20. :attachments (setting/setting :attachments-block-text))
  21. should-add? (case type
  22. :notes (setting/setting :include-notes?)
  23. :attachments (setting/setting :include-attachments?))]
  24. (when (and should-add? (> num-children 0))
  25. (let [items (<! (api-fn key))
  26. md-items (->> items
  27. (map extractor/extract)
  28. (remove str/blank?))]
  29. (when (not-empty md-items)
  30. (when-let [id (:block/uuid
  31. (editor-handler/api-insert-new-block!
  32. first-block {:page page-name}))]
  33. (doseq [md-item md-items]
  34. (editor-handler/api-insert-new-block!
  35. md-item
  36. {:block-uuid id
  37. :sibling? false
  38. :before? false})))))))))
  39. (defn handle-command-zotero
  40. [id page-name]
  41. (state/set-editor-show-zotero! false)
  42. (editor-handler/insert-command! id (str "[[" page-name "]]") nil {}))
  43. (defn- create-abstract-note!
  44. [page-name abstract-note]
  45. (when-not (str/blank? abstract-note)
  46. (let [block (editor-handler/api-insert-new-block!
  47. "[[Abstract]]" {:page page-name})]
  48. (editor-handler/api-insert-new-block!
  49. abstract-note {:block-uuid (:block/uuid block)
  50. :sibling? false}))))
  51. (defn- create-page [page-name properties]
  52. (page-handler/create!
  53. page-name
  54. {:redirect? false
  55. :format :markdown
  56. :create-first-block? false
  57. :properties properties}))
  58. (defn create-zotero-page
  59. ([item]
  60. (create-zotero-page item {}))
  61. ([item {:keys [block-dom-id insert-command? notification?]
  62. :or {insert-command? true notification? true}}]
  63. (go
  64. (let [{:keys [page-name properties abstract-note]} (extractor/extract item)]
  65. (if (page-handler/page-exists? (str/lower-case page-name))
  66. (if (setting/setting :overwrite-mode?)
  67. (page-handler/delete!
  68. page-name
  69. (fn [] (create-page page-name properties)))
  70. (editor-handler/api-insert-new-block!
  71. ""
  72. {:page page-name
  73. :properties properties}))
  74. (create-page page-name properties))
  75. (create-abstract-note! page-name abstract-note)
  76. (<! (add page-name :attachments item))
  77. (<! (add page-name :notes item))
  78. (when insert-command?
  79. (handle-command-zotero block-dom-id page-name)
  80. (editor-handler/save-current-block!))
  81. (when notification?
  82. (notification/show! (str "Successfully added zotero item to page " page-name) :success))))))
  83. (defn add-all [progress]
  84. (go
  85. (let [all-items (<! (zotero-api/all-top-items))]
  86. (reset! progress 30)
  87. (doseq [item all-items]
  88. (<! (create-zotero-page item {:insert-command? false :notification? false}))
  89. (swap! progress inc)))))