mirror of
https://github.com/logseq/logseq.git
synced 2026-05-22 11:44:10 +00:00
102 lines
4.2 KiB
Clojure
102 lines
4.2 KiB
Clojure
(ns frontend.quick-capture
|
|
"Quick-capture for both mobile and electron"
|
|
(:require [cljs-bean.core :as bean]
|
|
[clojure.string :as string]
|
|
[frontend.config :as config]
|
|
[frontend.context.i18n :refer [t]]
|
|
[frontend.date :as date]
|
|
[frontend.db :as db]
|
|
[frontend.handler.editor :as editor-handler]
|
|
[frontend.handler.notification :as notification]
|
|
[frontend.handler.page :as page-handler]
|
|
[frontend.state :as state]
|
|
[frontend.util :as util]
|
|
[frontend.util.text :as text-util]
|
|
[promesa.core :as p]))
|
|
|
|
(defn- is-tweet-link
|
|
[url]
|
|
(when (not-empty url)
|
|
(or (re-matches #"^https://twitter\.com/.*?/status/.*?$" url)
|
|
(re-matches #"^https://x\.com/.*?/status/.*?$" url))))
|
|
|
|
(defn quick-capture [args]
|
|
(if-let [today-page-title (db/get-today-journal-title)]
|
|
(let [{:keys [url title content page append]} (bean/->clj args)
|
|
title (or title "")
|
|
url (or url "")
|
|
insert-today? (get-in (state/get-config)
|
|
[:quick-capture-options :insert-today?]
|
|
false)
|
|
redirect-page? (get-in (state/get-config)
|
|
[:quick-capture-options :redirect-page?]
|
|
false)
|
|
today-page (string/lower-case today-page-title)
|
|
current-page (state/get-current-page) ;; empty when in journals page
|
|
default-page (get-in (state/get-config)
|
|
[:quick-capture-options :default-page])
|
|
page (cond
|
|
(and (state/enable-journals?)
|
|
(or (= page "TODAY")
|
|
(and (string/blank? page) insert-today?)))
|
|
today-page
|
|
|
|
(not-empty page)
|
|
page
|
|
|
|
(not-empty default-page)
|
|
default-page
|
|
|
|
(not-empty current-page)
|
|
current-page
|
|
|
|
:else
|
|
(if (state/enable-journals?) ;; default to "quick capture" page if journals are not enabled
|
|
today-page
|
|
"quick capture"))
|
|
time (date/get-current-time)
|
|
text (or (and content (not-empty (string/trim content))) "")
|
|
link (cond
|
|
(string/blank? url)
|
|
title
|
|
|
|
(boolean (text-util/get-matched-video url))
|
|
(str title " {{video " url "}}")
|
|
|
|
(is-tweet-link url)
|
|
(util/format "{{twitter %s}}" url)
|
|
|
|
(= title url)
|
|
(config/link-format nil url)
|
|
|
|
:else
|
|
(config/link-format title url))
|
|
template (get-in (state/get-config)
|
|
[:quick-capture-templates :text]
|
|
"**{time}** [[quick capture]]: {text} {url}")
|
|
date-ref-name today-page-title
|
|
content (-> template
|
|
(string/replace "{time}" time)
|
|
(string/replace "{date}" date-ref-name)
|
|
(string/replace "{url}" link)
|
|
(string/replace "{text}" text))
|
|
edit-content (state/get-edit-content)
|
|
edit-content-blank? (string/blank? edit-content)
|
|
edit-content-include-capture? (and (not-empty edit-content)
|
|
(string/includes? edit-content "[[quick capture]]"))]
|
|
(if (and (state/editing?) (not append) (not edit-content-include-capture?))
|
|
(if edit-content-blank?
|
|
(editor-handler/insert content)
|
|
(editor-handler/insert (str "\n" content)))
|
|
|
|
(p/do!
|
|
(editor-handler/escape-editing)
|
|
(when (not= page (state/get-current-page))
|
|
(page-handler/<create! page {:redirect? redirect-page?}))
|
|
;; Or else this will clear the newly inserted content
|
|
(js/setTimeout #(editor-handler/api-insert-new-block! content {:page page
|
|
:edit-block? true
|
|
:replace-empty-target? true})
|
|
100))))
|
|
(notification/show! (t :journal/parse-date-to-name-error) :error)))
|