diff --git a/deps/graph-parser/.carve/ignore b/deps/graph-parser/.carve/ignore index 3c67be574c..348478d016 100644 --- a/deps/graph-parser/.carve/ignore +++ b/deps/graph-parser/.carve/ignore @@ -10,3 +10,5 @@ logseq.graph-parser.block/left-and-right-parens logseq.graph-parser.block/->block-ref ;; API logseq.graph-parser.block/block-ref? +;; API +logseq.graph-parser.block/get-all-block-ref-ids diff --git a/deps/graph-parser/src/logseq/graph_parser/property.cljs b/deps/graph-parser/src/logseq/graph_parser/property.cljs index 77302dd237..a1ff155ee3 100644 --- a/deps/graph-parser/src/logseq/graph_parser/property.cljs +++ b/deps/graph-parser/src/logseq/graph_parser/property.cljs @@ -6,6 +6,8 @@ [goog.string :as gstring] [goog.string.format])) +(def colons "Property delimiter for markdown mode" "::") + (defn properties-ast? [block] (and @@ -77,7 +79,7 @@ compare-k (keyword (string/lower-case k)) k (if (contains? #{:id :custom_id :custom-id} compare-k) "id" k) k (if (contains? #{:last-modified-at} compare-k) "updated-at" k)] - (str k ":: " (string/trim v))) + (str k colons " " (string/trim v))) text))))) after (subvec lines (inc end-idx)) lines (concat before middle after)] diff --git a/src/main/frontend/commands.cljs b/src/main/frontend/commands.cljs index 767c21dc52..e6382de404 100644 --- a/src/main/frontend/commands.cljs +++ b/src/main/frontend/commands.cljs @@ -18,6 +18,7 @@ [logseq.graph-parser.util :as gp-util] [logseq.graph-parser.config :as gp-config] [logseq.graph-parser.block :as gp-block] + [logseq.graph-parser.property :as gp-property] [goog.dom :as gdom] [goog.object :as gobj] [promesa.core :as p])) @@ -345,8 +346,8 @@ (string/starts-with? last-pattern "[["))) (and s (string/starts-with? s "{{embed")) (and last-pattern - (or (string/ends-with? last-pattern "::") - (string/starts-with? last-pattern "::")))))))] + (or (string/ends-with? last-pattern gp-property/colons) + (string/starts-with? last-pattern gp-property/colons)))))))] (if (and space? (string/starts-with? last-pattern "#[[")) false space?)) diff --git a/src/main/frontend/components/editor.cljs b/src/main/frontend/components/editor.cljs index 1363b2faf1..d0b31281e9 100644 --- a/src/main/frontend/components/editor.cljs +++ b/src/main/frontend/components/editor.cljs @@ -23,6 +23,7 @@ [frontend.util.cursor :as cursor] [frontend.util.keycode :as keycode] [logseq.graph-parser.util :as gp-util] + [logseq.graph-parser.property :as gp-property] [goog.dom :as gdom] [promesa.core :as p] [react-draggable] @@ -262,7 +263,8 @@ (not (string/blank? property))) (let [current-pos (cursor/pos input) edit-content (state/sub [:editor/content id]) - start-idx (string/last-index-of (subs edit-content 0 current-pos) "::") + start-idx (string/last-index-of (subs edit-content 0 current-pos) + gp-property/colons) q (or (when (>= current-pos (+ start-idx 2)) (subs edit-content (+ start-idx 2) current-pos)) diff --git a/src/main/frontend/handler/editor.cljs b/src/main/frontend/handler/editor.cljs index 620db8c6da..07be24fd31 100644 --- a/src/main/frontend/handler/editor.cljs +++ b/src/main/frontend/handler/editor.cljs @@ -33,6 +33,7 @@ [frontend.template :as template] [logseq.graph-parser.text :as text] [logseq.graph-parser.utf8 :as utf8] + [logseq.graph-parser.property :as gp-property] [frontend.util :as util :refer [profile]] [frontend.util.clock :as clock] [frontend.util.cursor :as cursor] @@ -1852,9 +1853,10 @@ (and (not= :property-search (state/get-editor-action)) - (let [current-line (text-util/get-current-line-by-pos (.-value input) (dec pos))] - (or (text-util/wrapped-by? current-line (dec pos) "" "::") - (text-util/wrapped-by? current-line (dec pos) "\n" "::")))) + (when-let [current-line (text-util/get-current-line-by-pos (.-value input) (dec pos))] + (or (wrapped-by? current-line "" gp-property/colons) + (wrapped-by? current-line "\n" gp-property/colons)))) + (do (state/set-editor-action-data! {:pos (cursor/get-caret-pos input)}) (state/set-editor-action! :property-search)) @@ -2071,7 +2073,7 @@ (let [value (.-value input) pos (util/get-selection-start input) postfix (subs value pos) - end-index (when-let [idx (string/index-of postfix "::")] + end-index (when-let [idx (string/index-of postfix gp-property/colons)] (+ (max 0 (count (subs value 0 pos))) idx)) start-index (or (when-let [p (string/last-index-of (subs value 0 pos) "\n")] (inc p)) @@ -2086,8 +2088,8 @@ (when-let [input (gdom/getElement element-id)] (let [{:keys [end-index searching-property]} (get-searching-property input)] (cursor/move-cursor-to input (+ end-index 2)) - (commands/insert! element-id (str (or property q) ":: ") - {:last-pattern (str searching-property "::")}) + (commands/insert! element-id (str (or property q) gp-property/colons " ") + {:last-pattern (str searching-property gp-property/colons)}) (state/clear-editor-action!) (js/setTimeout (fn [] (let [pos (let [input (gdom/getElement element-id)] @@ -2100,8 +2102,8 @@ (defn property-value-on-chosen-handler [element-id q] (fn [property-value] - (commands/insert! element-id (str ":: " (or property-value q)) - {:last-pattern (str ":: " q)}) + (commands/insert! element-id (str gp-property/colons " " (or property-value q)) + {:last-pattern (str gp-property/colons " " q)}) (state/clear-editor-action!))) (defn parent-is-page? diff --git a/src/main/frontend/handler/page.cljs b/src/main/frontend/handler/page.cljs index 031f0ffb11..efbb16dc05 100644 --- a/src/main/frontend/handler/page.cljs +++ b/src/main/frontend/handler/page.cljs @@ -36,6 +36,7 @@ [logseq.graph-parser.util :as gp-util] [logseq.graph-parser.config :as gp-config] [logseq.graph-parser.block :as gp-block] + [logseq.graph-parser.property :as gp-property] [frontend.format.block :as block] [goog.functions :refer [debounce]])) @@ -247,8 +248,8 @@ (defn- replace-property-ref! [content old-name new-name] (let [new-name (keyword (string/replace (string/lower-case new-name) #"\s+" "-")) - old-property (str old-name "::") - new-property (str (name new-name) "::")] + old-property (str old-name gp-property/colons) + new-property (str (name new-name) gp-property/colons)] (util/replace-ignore-case content old-property new-property))) (defn- replace-old-page! diff --git a/src/main/frontend/util/property.cljs b/src/main/frontend/util/property.cljs index 4affb42e22..40a703ae16 100644 --- a/src/main/frontend/util/property.cljs +++ b/src/main/frontend/util/property.cljs @@ -44,7 +44,7 @@ [line] (boolean (and (string? line) - (util/safe-re-find #"^\s?[^ ]+:: " line)))) + (re-find (re-pattern (str "^\\s?[^ ]+" gp-property/colons " ")) line)))) (defn front-matter-property? [line] @@ -93,9 +93,10 @@ (defn get-markdown-property-keys [content] (let [content-lines (string/split-lines content) - properties (filter #(re-matches #"^.+::\s*.+" %) content-lines)] + properties (filter #(re-matches (re-pattern (str "^.+" gp-property/colons "\\s*.+")) %) + content-lines)] (when (seq properties) - (map #(->> (string/split % "::") + (map #(->> (string/split % gp-property/colons) (remove string/blank?) first string/upper-case) @@ -165,7 +166,7 @@ [format properties] (when (seq properties) (let [org? (= format :org) - kv-format (if org? ":%s: %s" "%s:: %s") + kv-format (if org? ":%s: %s" (str "%s" gp-property/colons " %s")) full-format (if org? ":PROPERTIES:\n%s\n:END:" "%s\n") properties-content (->> (map (fn [[k v]] (util/format kv-format (name k) v)) properties) (string/join "\n"))] @@ -202,7 +203,7 @@ built-in-properties-area (map (fn [[k v]] (if org? (str ":" (name k) ": " v) - (str (name k) ":: " v))) properties) + (str (name k) gp-property/colons " " v))) properties) body (concat (if no-title? nil [title]) (when org? [properties-start]) built-in-properties-area @@ -276,7 +277,7 @@ (not org?) (let [exists? (atom false) - sym (if front-matter? ": " ":: ") + sym (if front-matter? ": " (str gp-property/colons " ")) new-property-s (str key sym value) property-f (if front-matter? front-matter-property? simplified-property?) groups (partition-by property-f lines) @@ -344,7 +345,7 @@ (remove-f (fn [line] (let [s (string/triml (string/lower-case line))] (or (string/starts-with? s (str ":" key ":")) - (string/starts-with? s (str key ":: ")))))))] + (string/starts-with? s (str key gp-property/colons " ")))))))] (string/join "\n" lines))))))) (defn remove-id-property diff --git a/src/main/frontend/util/thingatpt.cljs b/src/main/frontend/util/thingatpt.cljs index ae58b2e383..e0ca00236a 100644 --- a/src/main/frontend/util/thingatpt.cljs +++ b/src/main/frontend/util/thingatpt.cljs @@ -86,14 +86,14 @@ (case (state/get-preferred-format) ;; TODO fix me to block's format :org (thing-at-point ":" input "\n") (when-let [line (:raw-content (line-at-point input))] - (let [key (first (string/split line "::")) + (let [key (first (string/split line gp-property/colons)) line-beginning-pos (cursor/line-beginning-pos input) pos-in-line (- (cursor/pos input) line-beginning-pos)] - (when (<= 0 pos-in-line (+ (count key) (count "::"))) - {:full-content (str key "::") + (when (<= 0 pos-in-line (+ (count key) (count gp-property/colons))) + {:full-content (str key gp-property/colons) :raw-content key :start line-beginning-pos - :end (+ line-beginning-pos (count (str key "::")))}))))] + :end (+ line-beginning-pos (count (str key gp-property/colons)))}))))] (assoc property :type "property-key")))) (defn get-list-item-indent&bullet [line] diff --git a/src/test/frontend/util/property_test.cljs b/src/test/frontend/util/property_test.cljs index 3bffc2960f..07fea4680e 100644 --- a/src/test/frontend/util/property_test.cljs +++ b/src/test/frontend/util/property_test.cljs @@ -71,12 +71,20 @@ "** hello\n\na:: b"))) (deftest test-get-property-keys - (are [x y] (= x y) - (property/get-property-keys :org "hello\n:PROPERTIES:\n:x1: y1\n:x2: y2\n:END:\n") - ["X1" "X2"] + (testing "org mode" + (are [x y] (= x y) + (property/get-property-keys :org "hello\n:PROPERTIES:\n:x1: y1\n:x2: y2\n:END:\n") + ["X1" "X2"] - (property/get-property-keys :org "hello\n:PROPERTIES:\n:END:\n") - nil)) + (property/get-property-keys :org "hello\n:PROPERTIES:\n:END:\n") + nil)) + (testing "markdown mode" + (are [x y] (= x y) + (property/get-property-keys :markdown "hello\nx1:: y1\nx2:: y2\n") + ["X1" "X2"] + + (property/get-property-keys :markdown "hello\n") + nil))) (deftest test-insert-property (are [x y] (= x y)