config.cljs 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. (ns frontend.config
  2. (:require [clojure.set :as set]
  3. [clojure.string :as string]
  4. [frontend.state :as state]
  5. [frontend.util :as util]
  6. [shadow.resource :as rc]
  7. [logseq.graph-parser.util :as gp-util]
  8. [logseq.graph-parser.config :as gp-config]
  9. [frontend.mobile.util :as mobile-util]))
  10. (goog-define DEV-RELEASE false)
  11. (defonce dev-release? DEV-RELEASE)
  12. (defonce dev? ^boolean (or dev-release? goog.DEBUG))
  13. (goog-define PUBLISHING false)
  14. (defonce publishing? PUBLISHING)
  15. (reset! state/publishing? publishing?)
  16. (def test? false)
  17. ;; prod env
  18. ;; (goog-define FILE-SYNC-PROD? true)
  19. ;; (goog-define LOGIN-URL
  20. ;; "https://logseq.auth.us-east-1.amazoncognito.com/login?client_id=7ns5v1pu8nrbs04rvdg67u4a7c&response_type=code&scope=email+openid+phone&redirect_uri=logseq%3A%2F%2Fauth-callback")
  21. ;; (goog-define API-DOMAIN "api-prod.logseq.com")
  22. ;; (goog-define WS-URL "wss://b2rp13onu2.execute-api.us-east-1.amazonaws.com/production?graphuuid=%s")
  23. ;; dev env
  24. (goog-define FILE-SYNC-PROD? false)
  25. (goog-define LOGIN-URL
  26. "https://logseq-test2.auth.us-east-2.amazoncognito.com/login?client_id=3ji1a0059hspovjq5fhed3uil8&response_type=code&scope=email+openid+phone&redirect_uri=logseq%3A%2F%2Fauth-callback")
  27. (goog-define API-DOMAIN "api.logseq.com")
  28. (goog-define WS-URL "wss://og96xf1si7.execute-api.us-east-2.amazonaws.com/production?graphuuid=%s")
  29. ;; feature flags
  30. (goog-define ENABLE-FILE-SYNC false)
  31. (defonce enable-file-sync? (or ENABLE-FILE-SYNC dev?)) ;; always enable file-sync when dev
  32. (goog-define ENABLE-PLUGINS true)
  33. (defonce enable-plugins? ENABLE-PLUGINS)
  34. (swap! state/state assoc :plugin/enabled enable-plugins?)
  35. ;; :TODO: How to do this?
  36. ;; (defonce desktop? ^boolean goog.DESKTOP)
  37. (def app-name "logseq")
  38. (def website
  39. (if dev?
  40. "http://localhost:3000"
  41. (util/format "https://%s.com" app-name)))
  42. (def api
  43. (if dev?
  44. "http://localhost:3000/api/v1/"
  45. (str website "/api/v1/")))
  46. (def asset-domain (util/format "https://asset.%s.com"
  47. app-name))
  48. ;; TODO: Remove this, switch to lazy loader
  49. (defn asset-uri
  50. [path]
  51. (cond
  52. publishing?
  53. path
  54. (util/file-protocol?)
  55. (string/replace path "/static/" "./")
  56. :else
  57. (if dev? path
  58. (str asset-domain path))))
  59. (def markup-formats
  60. #{:org :md :markdown :asciidoc :adoc :rst})
  61. (defn doc-formats
  62. []
  63. #{:doc :docx :xls :xlsx :ppt :pptx :one :pdf :epub})
  64. (def audio-formats #{:mp3 :ogg :mpeg :wav :m4a :flac :wma :aac})
  65. (def media-formats (set/union (gp-config/img-formats) audio-formats))
  66. (def html-render-formats
  67. #{:adoc :asciidoc})
  68. (def mobile?
  69. (when-not util/node-test?
  70. (util/safe-re-find #"Mobi" js/navigator.userAgent)))
  71. ;; TODO: protocol design for future formats support
  72. (defn get-block-pattern
  73. [format]
  74. (gp-config/get-block-pattern (or format (state/get-preferred-format))))
  75. (defn get-hr
  76. [format]
  77. (let [format (or format (keyword (state/get-preferred-format)))]
  78. (case format
  79. :org
  80. "-----"
  81. :markdown
  82. "---"
  83. "")))
  84. (defn get-bold
  85. [format]
  86. (let [format (or format (keyword (state/get-preferred-format)))]
  87. (case format
  88. :org
  89. "*"
  90. :markdown
  91. "**"
  92. "")))
  93. (defn get-italic
  94. [format]
  95. (let [format (or format (keyword (state/get-preferred-format)))]
  96. (case format
  97. :org
  98. "/"
  99. :markdown
  100. "*"
  101. "")))
  102. (defn get-underline
  103. [format]
  104. (let [format (or format (keyword (state/get-preferred-format)))]
  105. (case format
  106. :org
  107. "_"
  108. :markdown ;; no underline for markdown
  109. ""
  110. "")))
  111. (defn get-strike-through
  112. [format]
  113. (let [format (or format (keyword (state/get-preferred-format)))]
  114. (case format
  115. :org
  116. "+"
  117. :markdown
  118. "~~"
  119. "")))
  120. (defn get-highlight
  121. [format]
  122. (case format
  123. :org
  124. "^^"
  125. :markdown
  126. "=="
  127. ""))
  128. (defn get-code
  129. [format]
  130. (let [format (or format (keyword (state/get-preferred-format)))]
  131. (case format
  132. :org
  133. "~"
  134. :markdown
  135. "`"
  136. "")))
  137. (defn get-empty-link-and-forward-pos
  138. [format]
  139. (case format
  140. :org
  141. ["[[][]]" 2]
  142. :markdown
  143. ["[]()" 1]
  144. ["" 0]))
  145. (defn link-format
  146. [format label link]
  147. (if label
  148. (case format
  149. :org
  150. (util/format "[[%s][%s]]" link label)
  151. :markdown
  152. (util/format "[%s](%s)" label link))
  153. link))
  154. (defn with-default-link
  155. [format link]
  156. (case format
  157. :org
  158. [(util/format "[[%s][]]" link)
  159. (+ 4 (count link))]
  160. :markdown
  161. [(util/format "[](%s)" link)
  162. 1]
  163. ["" 0]))
  164. (defn with-label-link
  165. [format label link]
  166. (case format
  167. :org
  168. [(util/format "[[%s][%s]]" link label)
  169. (+ 4 (count link) (count label))]
  170. :markdown
  171. [(util/format "[%s](%s)" label link)
  172. (+ 4 (count link) (count label))]
  173. ["" 0]))
  174. (defn with-default-label
  175. [format label]
  176. (case format
  177. :org
  178. [(util/format "[[][%s]]" label)
  179. 2]
  180. :markdown
  181. [(util/format "[%s]()" label)
  182. (+ 3 (count label))]
  183. ["" 0]))
  184. (defn properties-wrapper-pattern
  185. [format]
  186. (case format
  187. :markdown
  188. "---\n%s\n---"
  189. "%s"))
  190. (defn get-file-extension
  191. [format]
  192. (case (keyword format)
  193. :markdown
  194. "md"
  195. (name format)))
  196. (defonce default-journals-directory "journals")
  197. (defonce default-pages-directory "pages")
  198. (defn get-pages-directory
  199. []
  200. (or (state/get-pages-directory) default-pages-directory))
  201. (defn get-journals-directory
  202. []
  203. (or (state/get-journals-directory) default-journals-directory))
  204. (defonce local-repo "local")
  205. (defn demo-graph?
  206. ([]
  207. (demo-graph? (state/get-current-repo)))
  208. ([graph]
  209. (= graph local-repo)))
  210. (defonce recycle-dir ".recycle")
  211. (def config-file "config.edn")
  212. (def custom-css-file "custom.css")
  213. (def export-css-file "export.css")
  214. (def custom-js-file "custom.js")
  215. (def metadata-file "metadata.edn")
  216. (def pages-metadata-file "pages-metadata.edn")
  217. (def config-default-content (rc/inline "config.edn"))
  218. (def markers
  219. #{"now" "later" "todo" "doing" "done" "wait" "waiting"
  220. "canceled" "cancelled" "started" "in-progress"})
  221. (defonce idb-db-prefix "logseq-db/")
  222. (defonce local-db-prefix "logseq_local_")
  223. (defonce local-handle "handle")
  224. (defonce local-handle-prefix (str local-handle "/" local-db-prefix))
  225. (defn local-db?
  226. [s]
  227. (and (string? s)
  228. (string/starts-with? s local-db-prefix)))
  229. (defn get-local-asset-absolute-path
  230. [s]
  231. (str "/" (string/replace s #"^[./]*" "")))
  232. (defn get-local-dir
  233. [s]
  234. (string/replace s local-db-prefix ""))
  235. (defn get-local-repo
  236. [dir]
  237. (str local-db-prefix dir))
  238. (defn get-repo-dir
  239. [repo-url]
  240. (cond
  241. (and (util/electron?) (local-db? repo-url))
  242. (get-local-dir repo-url)
  243. (and (mobile-util/native-platform?) (local-db? repo-url))
  244. (let [dir (get-local-dir repo-url)]
  245. (if (string/starts-with? dir "file:")
  246. dir
  247. (str "file:///" (string/replace dir #"^/+" ""))))
  248. :else
  249. (str "/"
  250. (->> (take-last 2 (string/split repo-url #"/"))
  251. (string/join "_")))))
  252. (defn get-repo-path
  253. [repo-url path]
  254. (if (and (or (util/electron?) (mobile-util/native-platform?))
  255. (local-db? repo-url))
  256. path
  257. (util/node-path.join (get-repo-dir repo-url) path)))
  258. (defn get-file-path
  259. "Normalization happens here"
  260. [repo-url relative-path]
  261. (when (and repo-url relative-path)
  262. (let [path (cond
  263. (and (util/electron?) (local-db? repo-url))
  264. (let [dir (get-repo-dir repo-url)]
  265. (if (string/starts-with? relative-path dir)
  266. relative-path
  267. (str dir "/"
  268. (string/replace relative-path #"^/" ""))))
  269. (and (mobile-util/native-ios?) (local-db? repo-url))
  270. (let [dir (get-repo-dir repo-url)]
  271. (js/decodeURI (str dir relative-path)))
  272. (and (mobile-util/native-android?) (local-db? repo-url))
  273. (let [dir (get-repo-dir repo-url)
  274. dir (if (or (string/starts-with? dir "file:")
  275. (string/starts-with? dir "content:"))
  276. dir
  277. (str "file:///" (string/replace dir #"^/+" "")))]
  278. (str (string/replace dir #"/+$" "") "/" relative-path))
  279. (= "/" (first relative-path))
  280. (subs relative-path 1)
  281. :else
  282. relative-path)]
  283. (gp-util/path-normalize path))))
  284. (defn get-config-path
  285. ([]
  286. (get-config-path (state/get-current-repo)))
  287. ([repo]
  288. (when repo
  289. (get-file-path repo (str app-name "/" config-file)))))
  290. (defn get-metadata-path
  291. ([]
  292. (get-metadata-path (state/get-current-repo)))
  293. ([repo]
  294. (when repo
  295. (get-file-path repo (str app-name "/" metadata-file)))))
  296. (defn get-pages-metadata-path
  297. ([]
  298. (get-pages-metadata-path (state/get-current-repo)))
  299. ([repo]
  300. (when repo
  301. (get-file-path repo (str app-name "/" pages-metadata-file)))))
  302. (defn get-custom-css-path
  303. ([]
  304. (get-custom-css-path (state/get-current-repo)))
  305. ([repo]
  306. (when repo
  307. (get-file-path repo
  308. (str app-name "/" custom-css-file)))))
  309. (defn get-export-css-path
  310. ([]
  311. (get-export-css-path (state/get-current-repo)))
  312. ([repo]
  313. (when repo
  314. (get-file-path repo
  315. (str app-name "/" export-css-file)))))
  316. (defn get-custom-js-path
  317. ([]
  318. (get-custom-js-path (state/get-current-repo)))
  319. ([repo]
  320. (when repo
  321. (get-file-path repo
  322. (str app-name "/" custom-js-file)))))
  323. (defn get-block-hidden-properties
  324. []
  325. (get-in @state/state [:config (state/get-current-repo) :block-hidden-properties]))