Decouple graph-parser util from app util usage

For tiny util heavily used fns like safe-re-find and uuid-string?,
decouple graph-parser from so much of the app
pull/5299/head
Gabriel Horner 2022-05-13 16:17:43 -04:00
parent b9bbd0c605
commit 5b0d5fb8b5
27 changed files with 88 additions and 83 deletions

View File

@ -517,7 +517,7 @@
(defn compute-pos-delta-when-change-marker
[edit-content marker pos]
(let [old-marker (some->> (first (gp-util/safe-re-find marker/bare-marker-pattern edit-content))
(let [old-marker (some->> (first (util/safe-re-find marker/bare-marker-pattern edit-content))
(string/trim))
pos-delta (- (count marker)
(count old-marker))
@ -542,7 +542,7 @@
(if-let [matches (seq (util/re-pos new-line-re-pattern prefix))]
(let [[start-pos content] (last matches)]
(+ start-pos (count content)))
(count (gp-util/safe-re-find re-pattern prefix))))
(count (util/safe-re-find re-pattern prefix))))
new-value (str (subs edit-content 0 pos)
(string/replace-first (subs edit-content pos)
(marker/marker-pattern format)
@ -583,7 +583,7 @@
(let [edit-content (gobj/get current-input "value")
heading-pattern #"^#+\s+"
new-value (cond
(gp-util/safe-re-find heading-pattern edit-content)
(util/safe-re-find heading-pattern edit-content)
(string/replace-first edit-content
heading-pattern
(str heading " "))

View File

@ -683,7 +683,7 @@
[config id label]
(when (and
(not (string/blank? id))
(gp-util/uuid-string? id))
(util/uuid-string? id))
(let [block-id (uuid id)
block (db/pull-block block-id)
block-type (keyword (get-in block [:block/properties :ls-type]))
@ -961,7 +961,7 @@
(= "Complex" protocol)
(= (string/lower-case (:protocol path)) "id")
(string? (:link path))
(gp-util/uuid-string? (:link path))) ; org mode id
(util/uuid-string? (:link path))) ; org mode id
(let [id (uuid (:link path))
block (db/entity [:block/uuid id])]
(if (:block/pre-block? block)
@ -1077,7 +1077,7 @@
string/trim)]
(when-let [id (and s
(let [s (string/trim s)]
(and (gp-util/uuid-string? s)
(and (util/uuid-string? s)
(uuid s))))]
(block-embed (assoc config :link-depth (inc link-depth)) id)))
@ -1088,7 +1088,7 @@
[_config arguments]
(when-let [url (first arguments)]
(let [Vimeo-regex #"^((?:https?:)?//)?((?:www).)?((?:player.vimeo.com|vimeo.com)?)((?:/video/)?)([\w-]+)(\S+)?$"]
(when-let [vimeo-id (nth (gp-util/safe-re-find Vimeo-regex url) 5)]
(when-let [vimeo-id (nth (util/safe-re-find Vimeo-regex url) 5)]
(when-not (string/blank? vimeo-id)
(let [width (min (- (util/get-width) 96)
560)
@ -1109,7 +1109,7 @@
(when-let [id (cond
(<= (count url) 15) url
:else
(last (gp-util/safe-re-find id-regex url)))]
(last (util/safe-re-find id-regex url)))]
(when-not (string/blank? id)
(let [width (min (- (util/get-width) 96)
560)
@ -1239,7 +1239,7 @@
(when-let [youtube-id (cond
(== 11 (count url)) url
:else
(nth (gp-util/safe-re-find YouTube-regex url) 5))]
(nth (util/safe-re-find YouTube-regex url) 5))]
(when-not (string/blank? youtube-id)
(youtube/youtube-video youtube-id)))))
@ -1270,7 +1270,7 @@
(when-let [id (cond
(<= (count url) 15) url
:else
(last (gp-util/safe-re-find id-regex url)))]
(last (util/safe-re-find id-regex url)))]
(ui/tweet-embed id))))
(= name "embed")
@ -2858,7 +2858,7 @@
["Paragraph" l]
;; TODO: speedup
(if (gp-util/safe-re-find #"\"Export_Snippet\" \"embed\"" (str l))
(if (util/safe-re-find #"\"Export_Snippet\" \"embed\"" (str l))
(->elem :div (map-inline config l))
(->elem :div.is-paragraph (map-inline config l)))

View File

@ -363,7 +363,7 @@
e
(custom-context-menu-content))
(and block-id (gp-util/uuid-string? block-id))
(and block-id (util/uuid-string? block-id))
(let [block (.closest target ".ls-block")]
(when block
(util/select-highlight! [block]))

View File

@ -122,7 +122,7 @@
(when page-e
(let [page-name (or (:block/name page-e)
(str (:block/uuid page-e)))
block? (gp-util/uuid-string? page-name)
block? (util/uuid-string? page-name)
block-id (and block? (uuid page-name))
page-blocks (get-blocks repo page-name block-id)]
(if (empty? page-blocks)
@ -317,7 +317,7 @@
(let [current-repo (state/sub :git/current-repo)
repo (or repo current-repo)
page-name (util/page-name-sanity-lc path-page-name)
block? (gp-util/uuid-string? page-name)
block? (util/uuid-string? page-name)
block-id (and block? (uuid page-name))
format (let [page (if block-id
(:block/name (:block/page (db/entity [:block/uuid block-id])))
@ -640,7 +640,7 @@
(date/today))
theme (:ui/theme @state/state)
dark? (= theme "dark")
graph (if (gp-util/uuid-string? page)
graph (if (util/uuid-string? page)
(graph-handler/build-block-graph (uuid page) theme)
(graph-handler/build-page-graph page theme))]
(when (seq (:nodes graph))

View File

@ -14,7 +14,6 @@
[frontend.handler.shell :as shell]
[frontend.handler.plugin :as plugin-handler]
[frontend.mobile.util :as mobile-util]
[logseq.graph-parser.util :as gp-util]
[electron.ipc :as ipc]
[frontend.config :as config]
[frontend.handler.user :as user-handler]
@ -64,7 +63,7 @@
repo (state/sub :git/current-repo)
page (db/entity repo [:block/name page-name])
page-original-name (:block/original-name page)
block? (and page (gp-util/uuid-string? page-name))
block? (and page (util/uuid-string? page-name))
contents? (= page-name "contents")
properties (:block/properties page)
public? (true? (:public properties))

View File

@ -12,7 +12,6 @@
[frontend.state :as state]
[frontend.ui :as ui]
[frontend.util :as util]
[logseq.graph-parser.util :as gp-util]
[medley.core :as medley]
[rum.core :as rum]))
@ -83,7 +82,7 @@
default-collapsed? (>= (count refed-blocks-ids) threshold)
filters-atom (get state ::filters)
filter-state (rum/react filters-atom)
block? (gp-util/uuid-string? page-name)
block? (util/uuid-string? page-name)
block-id (and block? (uuid page-name))
page-name (string/lower-case page-name)
journal? (date/valid-journal-title? (string/capitalize page-name))
@ -170,7 +169,7 @@
(ui/catch-error
(ui/component-error "Linked References: Unexpected error")
(ui/lazy-visible
(if (or sidebar? (gp-util/uuid-string? page-name))
(if (or sidebar? (util/uuid-string? page-name))
nil
"loading references...")
(fn []

View File

@ -20,7 +20,6 @@
[clojure.string :as string]
[frontend.context.i18n :refer [t]]
[frontend.date :as date]
[logseq.graph-parser.util :as gp-util]
[reitit.frontend.easy :as rfe]
[frontend.modules.shortcut.core :as shortcut]))
@ -33,7 +32,7 @@
lc-content (util/search-normalize content)
lc-q (util/search-normalize q)]
(if (and (string/includes? lc-content lc-q)
(not (gp-util/safe-re-find #" " q)))
(not (util/safe-re-find #" " q)))
(let [i (string/index-of lc-content lc-q)
[before after] [(subs content 0 i) (subs content (+ i (count q)))]]
[:div

View File

@ -99,7 +99,7 @@
(def mobile?
(when-not util/node-test?
(gp-util/safe-re-find #"Mobi" js/navigator.userAgent)))
(util/safe-re-find #"Mobi" js/navigator.userAgent)))
;; TODO: protocol design for future formats support

View File

@ -912,7 +912,7 @@
(defn get-page
[page-name]
(if (gp-util/uuid-string? page-name)
(if (util/uuid-string? page-name)
(db-utils/entity [:block/uuid (uuid page-name)])
(db-utils/entity [:block/name (util/page-name-sanity-lc page-name)])))
@ -1221,7 +1221,7 @@
(defn get-referenced-blocks-ids
[page-name-or-block-uuid]
(if (gp-util/uuid-string? (str page-name-or-block-uuid))
(if (util/uuid-string? (str page-name-or-block-uuid))
(let [id (uuid page-name-or-block-uuid)]
(get-block-referenced-blocks-ids id))
(get-page-referenced-blocks-ids page-name-or-block-uuid)))

View File

@ -14,8 +14,7 @@
[frontend.db.rules :as rules]
[frontend.template :as template]
[logseq.graph-parser.text :as text]
[frontend.util :as util]
[logseq.graph-parser.util :as gp-util]))
[frontend.util :as util]))
;; Query fields:
@ -449,7 +448,7 @@ Some bindings in this fn:
(remove string/blank?)
(map (fn [x]
(if (or (contains? #{"+" "-"} (first x))
(and (gp-util/safe-re-find #"\d" (first x))
(and (util/safe-re-find #"\d" (first x))
(some #(string/ends-with? x %) ["y" "m" "d" "h" "min"])))
(keyword (name x))
x)))

View File

@ -12,7 +12,6 @@
[frontend.state :as state]
[logseq.graph-parser.text :as text]
[frontend.util :as util]
[logseq.graph-parser.util :as gp-util]
[lambdaisland.glogi :as log]))
(defn resolve-input
@ -32,12 +31,12 @@
;; This sometimes runs when there isn't a current page e.g. :home route
(some-> (state/get-current-page) string/lower-case)
(and (keyword? input)
(gp-util/safe-re-find #"^\d+d(-before)?$" (name input)))
(util/safe-re-find #"^\d+d(-before)?$" (name input)))
(let [input (name input)
days (util/parse-int (subs input 0 (dec (count input))))]
(date->int (t/minus (t/today) (t/days days))))
(and (keyword? input)
(gp-util/safe-re-find #"^\d+d(-after)?$" (name input)))
(util/safe-re-find #"^\d+d(-after)?$" (name input)))
(let [input (name input)
days (util/parse-int (subs input 0 (dec (count input))))]
(date->int (t/plus (t/today) (t/days days))))

View File

@ -10,7 +10,6 @@
[frontend.db.utils :as db-utils]
[frontend.state :as state]
[frontend.util :as util :refer [react]]
[logseq.graph-parser.util :as gp-util]
[cljs.spec.alpha :as s]
[clojure.core.async :as async]))
@ -230,7 +229,7 @@
affected-keys (concat
(mapcat
(fn [block-id]
(let [block-id (if (and (string? block-id) (gp-util/uuid-string? block-id))
(let [block-id (if (and (string? block-id) (util/uuid-string? block-id))
[:block/uuid block-id]
block-id)]
(when-let [block (db-utils/entity block-id)]

View File

@ -4,7 +4,6 @@
[clojure.walk :as walk]
[frontend.config :as config]
[frontend.util :as util]
[logseq.graph-parser.util :as gp-util]
[hickory.core :as hickory]))
(defonce *inside-pre? (atom false))
@ -75,7 +74,7 @@
:h6 (block-transform 6 children)
:a (let [href (:href attrs)
label (map-join children)
has-img-tag? (gp-util/safe-re-find #"\[:img" (str x))]
has-img-tag? (util/safe-re-find #"\[:img" (str x))]
(if has-img-tag?
(export-hiccup x)
(case format

View File

@ -257,7 +257,7 @@
(defn- another-block-with-same-id-exists?
[current-id block-id]
(and (string? block-id)
(gp-util/uuid-string? block-id)
(util/uuid-string? block-id)
(not= current-id (cljs.core/uuid block-id))
(db/entity [:block/uuid (cljs.core/uuid block-id)])))
@ -338,7 +338,7 @@
(if (and (state/enable-timetracking?)
(not= (:block/content block) value))
(let [format (:block/format block)
new-marker (last (gp-util/safe-re-find (marker/marker-pattern format) (or value "")))
new-marker (last (util/safe-re-find (marker/marker-pattern format) (or value "")))
new-value (with-marker-time value block format
new-marker
(:block/marker block))]
@ -483,10 +483,10 @@
(let [current-page (state/get-current-page)
block-id (or
(and (:id config)
(gp-util/uuid-string? (:id config))
(util/uuid-string? (:id config))
(:id config))
(and current-page
(gp-util/uuid-string? current-page)
(util/uuid-string? current-page)
current-page))]
(= uuid (and block-id (medley/uuid block-id)))))
@ -1147,7 +1147,7 @@
[]
(when-let [page (get-nearest-page)]
(let [page-name (string/lower-case page)
block? (gp-util/uuid-string? page-name)]
block? (util/uuid-string? page-name)]
(when-let [page (db/get-page page-name)]
(if block?
(state/sidebar-add-block!
@ -1177,7 +1177,7 @@
(let [page (state/get-current-page)
block-id (and
(string? page)
(gp-util/uuid-string? page)
(util/uuid-string? page)
(medley/uuid page))]
(when block-id
(let [block-parent (db/get-block-parent block-id)]
@ -2040,7 +2040,7 @@
(defn- last-top-level-child?
[{:keys [id]} current-node]
(when id
(when-let [entity (if (gp-util/uuid-string? (str id))
(when-let [entity (if (util/uuid-string? (str id))
(db/entity [:block/uuid (uuid id)])
(db/entity [:block/name (util/page-name-sanity-lc id)]))]
(= (:block/uuid entity) (tree/-get-parent-id current-node)))))
@ -2867,7 +2867,7 @@
(string/join "\n"
(mapv (fn [p] (->> (string/trim p)
((fn [p]
(if (gp-util/safe-re-find (if (= format :org)
(if (util/safe-re-find (if (= format :org)
#"\s*\*+\s+"
#"\s*-\s+") p)
p
@ -2932,9 +2932,9 @@
;; from external
(let [format (or (db/get-page-format (state/get-current-page)) :markdown)]
(match [format
(nil? (gp-util/safe-re-find #"(?m)^\s*(?:[-+*]|#+)\s+" text))
(nil? (gp-util/safe-re-find #"(?m)^\s*\*+\s+" text))
(nil? (gp-util/safe-re-find #"(?:\r?\n){2,}" text))]
(nil? (util/safe-re-find #"(?m)^\s*(?:[-+*]|#+)\s+" text))
(nil? (util/safe-re-find #"(?m)^\s*\*+\s+" text))
(nil? (util/safe-re-find #"(?:\r?\n){2,}" text))]
[:markdown false _ _]
(paste-text-parseable format text)
@ -3219,7 +3219,7 @@
:or {collapse? false expanded? false incremental? true root-block nil}}]
(when-let [page (or (state/get-current-page)
(date/today))]
(let [block? (gp-util/uuid-string? page)
(let [block? (util/uuid-string? page)
block-id (or root-block (and block? (uuid page)))
blocks (if block-id
(db/get-block-and-children (state/get-current-repo) block-id)

View File

@ -4,8 +4,7 @@
[frontend.db :as db]
[frontend.db.default :as default-db]
[frontend.state :as state]
[frontend.util :as util]
[logseq.graph-parser.util :as gp-util]))
[frontend.util :as util]))
(defn- build-links
[links]
@ -46,7 +45,7 @@
;; slow
(defn- uuid-or-asset?
[id]
(or (gp-util/uuid-string? id)
(or (util/uuid-string? id)
(string/starts-with? id "../assets/")
(= id "..")
(string/starts-with? id "assets/")

View File

@ -637,7 +637,7 @@
(->> (db/get-all-pages repo)
(remove (fn [p]
(let [name (:block/name p)]
(or (gp-util/uuid-string? name)
(or (util/uuid-string? name)
(gp-config/draw? name)
(db/built-in-pages-names (string/upper-case name))))))
(common-handler/fix-pages-timestamps)))
@ -691,7 +691,7 @@
chosen (if (string/starts-with? chosen "New page: ") ;; FIXME: What if a page named "New page: XXX"?
(subs chosen 10)
chosen)
chosen (if (and (gp-util/safe-re-find #"\s+" chosen) (not wrapped?))
chosen (if (and (util/safe-re-find #"\s+" chosen) (not wrapped?))
(util/format "[[%s]]" chosen)
chosen)
q (if @editor-handler/*selected-text "" q)

View File

@ -9,7 +9,6 @@
[frontend.state :as state]
[logseq.graph-parser.text :as text]
[frontend.util :as util]
[logseq.graph-parser.util :as gp-util]
[medley.core :as medley]
[reitit.frontend.easy :as rfe]))
@ -79,7 +78,7 @@
"Create a new page"
:page
(let [name (:name path-params)
block? (gp-util/uuid-string? name)]
block? (util/uuid-string? name)]
(if block?
(if-let [block (db/entity [:block/uuid (medley/uuid name)])]
(let [content (text/remove-level-spaces (:block/content block)

View File

@ -14,7 +14,6 @@
[clojure.string :as string]
[rum.core :as rum]
[frontend.mobile.util :as mobile]
[logseq.graph-parser.util :as gp-util]
[electron.ipc :as ipc]))
(defn- get-css-var-value
@ -112,7 +111,7 @@
(let [id (and
(> (count fragment) 36)
(subs fragment (- (count fragment) 36)))]
(if (and id (gp-util/uuid-string? id))
(if (and id (util/uuid-string? id))
(let [elements (array-seq (js/document.getElementsByClassName id))]
(when (first elements)
(util/scroll-to-element (gobj/get (first elements) "id")))

View File

@ -1,6 +1,6 @@
(ns frontend.modules.outliner.tree
(:require [frontend.db :as db]
[logseq.graph-parser.util :as gp-util]
[frontend.util :as util]
[clojure.string :as string]
[frontend.state :as state]))
@ -45,7 +45,7 @@
(defn- get-root-and-page
[repo root-id]
(if (string? root-id)
(if (gp-util/uuid-string? root-id)
(if (util/uuid-string? root-id)
[false (db/entity repo [:block/uuid (uuid root-id)])]
[true (db/entity repo [:block/name (string/lower-case root-id)])])
[false root-id]))

View File

@ -1,6 +1,6 @@
(ns frontend.security
(:require [clojure.walk :as walk]
[logseq.graph-parser.util :as gp-util]))
[frontend.util :as util]))
;; To prevent from cross-site scripting vulnerability, we should add security checks for both hiccup and raw html.
;; Hiccup: [:a {:href "javascript:alert('hei')"} "click me"]
@ -12,7 +12,7 @@
(= :a (first f))
(:href (second f))
(:href (second f))
(gp-util/safe-re-find #"(?i)javascript" (:href (second f)))))
(util/safe-re-find #"(?i)javascript" (:href (second f)))))
(defn remove-javascript-links-in-href
[hiccup]

View File

@ -13,7 +13,6 @@
[goog.object :as gobj]
[promesa.core :as p]
[rum.core :as rum]
[logseq.graph-parser.util :as gp-util]
[frontend.mobile.util :as mobile-util]))
(defonce ^:large-vars/data-var state
@ -452,7 +451,7 @@
(or
(when-let [workflow (:preferred-workflow (get-config))]
(let [workflow (name workflow)]
(if (gp-util/safe-re-find #"now|NOW" workflow)
(if (util/safe-re-find #"now|NOW" workflow)
:now
:todo)))
(get-in @state [:me :preferred_workflow] :now))))

View File

@ -39,6 +39,23 @@
#?(:cljs (defn app-scroll-container-node []
(gdom/getElement "main-content-container")))
#?(:cljs
(defn safe-re-find
[pattern s]
(when-not (string? s)
;; TODO: sentry
(js/console.trace))
(when (string? s)
(re-find pattern s))))
#?(:cljs
(do
(def uuid-pattern "[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}")
(defonce exactly-uuid-pattern (re-pattern (str "(?i)^" uuid-pattern "$")))
(defn uuid-string?
[s]
(safe-re-find exactly-uuid-pattern s))))
#?(:cljs
(defn ios?
[]
@ -55,7 +72,7 @@
(defn mobile?
[]
(when-not node-test?
(gp-util/safe-re-find #"Mobi" js/navigator.userAgent))))
(safe-re-find #"Mobi" js/navigator.userAgent))))
#?(:cljs
(defn electron?
@ -349,7 +366,7 @@
#?(:cljs
(defn scroll-to-element
[elem-id]
(when-not (gp-util/safe-re-find #"^/\d+$" elem-id)
(when-not (safe-re-find #"^/\d+$" elem-id)
(when elem-id
(when-let [elem (gdom/getElement elem-id)]
(.scroll (app-scroll-container-node)
@ -829,8 +846,8 @@
[]
(let [user-agent js/navigator.userAgent
vendor js/navigator.vendor]
(and (gp-util/safe-re-find #"Chrome" user-agent)
(gp-util/safe-re-find #"Google Inc" vendor)))))
(and (safe-re-find #"Chrome" user-agent)
(safe-re-find #"Google Inc" vendor)))))
#?(:cljs
(defn indexeddb-check?
@ -871,7 +888,7 @@
[block-id]
(when block-id
(let [block-id (str block-id)]
(when (gp-util/uuid-string? block-id)
(when (uuid-string? block-id)
(first (array-seq (js/document.getElementsByClassName block-id))))))))
#?(:cljs
@ -890,7 +907,7 @@
(do
(defn include-windows-reserved-chars?
[s]
(gp-util/safe-re-find windows-reserved-chars s))
(safe-re-find windows-reserved-chars s))
(defn create-title-property?
[s]

View File

@ -1,7 +1,6 @@
(ns frontend.util.drawer
(:require [clojure.string :as string]
[frontend.util :as util]
[logseq.graph-parser.util :as gp-util]
[logseq.graph-parser.mldoc :as gp-mldoc]
[logseq.graph-parser.property :as gp-property]
[frontend.format.mldoc :as mldoc]))
@ -88,8 +87,8 @@
(defn contains-logbook?
[content]
(and (gp-util/safe-re-find (re-pattern (str "(?i)" logbook-start)) content)
(gp-util/safe-re-find (re-pattern (str "(?i)" drawer-end)) content)))
(and (util/safe-re-find (re-pattern (str "(?i)" logbook-start)) content)
(util/safe-re-find (re-pattern (str "(?i)" drawer-end)) content)))
;; TODO: DRY
(defn remove-logbook

View File

@ -1,7 +1,6 @@
(ns frontend.util.marker
(:require [clojure.string :as string]
[frontend.util :as util]
[logseq.graph-parser.util :as gp-util]))
[frontend.util :as util]))
(defn marker-pattern [format]
(re-pattern
@ -21,7 +20,7 @@
(if-let [matches (seq (util/re-pos new-line-re-pattern content))]
(let [[start-pos content] (last matches)]
(+ start-pos (count content)))
(count (gp-util/safe-re-find re-pattern content)))
(count (util/safe-re-find re-pattern content)))
new-content
(str (subs content 0 pos)
(string/replace-first (subs content pos)
@ -60,6 +59,6 @@
(let [content (string/triml content)
new-marker (or new-marker
(cycle-marker-state (or marker
(last (gp-util/safe-re-find (marker-pattern format) content))) ; Returns the last matching group (last vec)
(last (util/safe-re-find (marker-pattern format) content))) ; Returns the last matching group (last vec)
preferred-workflow))]
[(add-or-update-marker content format new-marker) new-marker]))

View File

@ -1,13 +1,12 @@
(ns frontend.util.priority
(:require [clojure.string :as string]
[frontend.util :as util]
[logseq.graph-parser.util :as gp-util]
[frontend.util.marker :as marker]))
(defn cycle-priority-state
[content]
(let [priority-reg #"\[#([ABC]{1})\]\s{1}"
priority (last (gp-util/safe-re-find priority-reg content))
priority (last (util/safe-re-find priority-reg content))
next-priority (case priority
"A" "B"
@ -29,7 +28,7 @@
(if-let [matches (seq (util/re-pos new-line-re-pattern content))]
(let [[start-pos content] (last matches)]
(+ start-pos (count content)))
(count (gp-util/safe-re-find re-pattern content)))
(count (util/safe-re-find re-pattern content)))
skip-marker-pos
(if-let [matches (seq (util/re-pos marker/bare-marker-pattern (subs content skip-hash-pos)))]
(let [[start-pos content] (last matches)]

View File

@ -45,28 +45,28 @@
[line]
(boolean
(and (string? line)
(gp-util/safe-re-find #"^\s?[^ ]+:: " line))))
(util/safe-re-find #"^\s?[^ ]+:: " line))))
(defn front-matter-property?
[line]
(boolean
(and (string? line)
(gp-util/safe-re-find #"^\s*[^ ]+: " line))))
(util/safe-re-find #"^\s*[^ ]+: " line))))
(defn get-property-key
[line format]
(and (string? line)
(when-let [key (last
(if (= format :org)
(gp-util/safe-re-find #"^\s*:([^: ]+): " line)
(gp-util/safe-re-find #"^\s*([^ ]+):: " line)))]
(util/safe-re-find #"^\s*:([^: ]+): " line)
(util/safe-re-find #"^\s*([^ ]+):: " line)))]
(keyword key))))
(defn org-property?
[line]
(boolean
(and (string? line)
(gp-util/safe-re-find #"^\s*:[^: ]+: " line)
(util/safe-re-find #"^\s*:[^: ]+: " line)
(when-let [key (get-property-key line :org)]
(not (contains? #{:PROPERTIES :END} key))))))

View File

@ -8,6 +8,7 @@
(defonce exactly-uuid-pattern (re-pattern (str "(?i)^" uuid-pattern "$")))
(defn safe-re-find
"Copy of frontend.util/safe-re-find. Too basic to couple to main app"
[pattern s]
(when-not (string? s)
;; TODO: sentry
@ -16,6 +17,7 @@
(re-find pattern s)))
(defn uuid-string?
"Copy of frontend.util/uuid-string?. Too basic to couple to main app"
[s]
(safe-re-find exactly-uuid-pattern s))