diff --git a/web/src/main/frontend/components/draw.cljs b/web/src/main/frontend/components/draw.cljs index b2b0eb17a0..7a4220e20f 100644 --- a/web/src/main/frontend/components/draw.cljs +++ b/web/src/main/frontend/components/draw.cljs @@ -481,7 +481,6 @@ (let [loaded? (or (loaded?) (rum/react *loaded?)) current-repo (state/sub :git/current-repo)] - (prn "loaded? " loaded?) (if loaded? (let [current-file (rum/react *current-file) current-file (or current-file diff --git a/web/src/main/frontend/components/hiccup.cljs b/web/src/main/frontend/components/hiccup.cljs index ebd1bb3797..636844d7fa 100644 --- a/web/src/main/frontend/components/hiccup.cljs +++ b/web/src/main/frontend/components/hiccup.cljs @@ -991,11 +991,11 @@ (let [current-heading-uuid (:heading/uuid (:heading config)) ;; exclude the current one, otherwise it'll loop forever remove-headings (if current-heading-uuid [current-heading-uuid] nil) - query-result (rum/react (:query-atom state)) - result (db/custom-query-result-transform query-result remove-headings)] + query-result (if-let [a (:query-atom state)] + (rum/react a)) + result (if query-result + (db/custom-query-result-transform query-result remove-headings))] [:div.custom-query.my-2 - [:code (or (:query-title options) - "Query result: ")] (if (seq result) (->hiccup result (assoc config :custom-query? true diff --git a/web/src/main/frontend/db.cljs b/web/src/main/frontend/db.cljs index 09727d3a46..5aed5b8111 100644 --- a/web/src/main/frontend/db.cljs +++ b/web/src/main/frontend/db.cljs @@ -142,7 +142,7 @@ :page/name {:db/unique :db.unique/identity} :page/file {:db/valueType :db.type/ref} :page/directives {} - :page/links {} + :page/list {} :page/alias {:db/valueType :db.type/ref :db/cardinality :db.cardinality/many} :page/tags {:db/valueType :db.type/ref @@ -495,18 +495,19 @@ (defn custom-query [query-string] - (try - (let [query (reader/read-string query-string) - [query inputs] (if (vector? (first query)) - [`~(first query) (rest query)] - [`~query nil]) - inputs (map resolve-input inputs) - repo (state/get-current-repo) - k [:custom query-string]] - (apply q repo k {} query inputs)) - (catch js/Error e - (println "Query parsing failed: ") - (js/console.dir e)))) + (when-not (string/blank? query-string) + (try + (let [query (reader/read-string query-string) + [query inputs] (if (vector? (first query)) + [`~(first query) (rest query)] + [`~query nil]) + inputs (map resolve-input inputs) + repo (state/get-current-repo) + k [:custom query-string]] + (apply q repo k {} query inputs)) + (catch js/Error e + (println "Query parsing failed: ") + (js/console.dir e))))) (defn custom-query-result-transform [query-result remove-headings] @@ -611,6 +612,25 @@ ;; queries +(defn get-all-tags + [] + (let [repo (state/get-current-repo)] + (when (get-conn repo) + (some->> + (q repo [:tags] {} + '[:find ?name ?h ?p + :where + [?t :tag/name ?name] + (or + [?h :heading/tags ?t] + [?p :page/tags ?t])]) + react + (seq) + ;; (map first) + ;; frequencies + ;; (util/sort-by-value :desc) + )))) + (defn- remove-journal-files [files] (remove @@ -1177,12 +1197,16 @@ {:page/name alias}))) other-alias)) - (:tags directives) - (assoc :page/tags - (map - (fn [tag] - {:tag/name (string/lower-case tag)}) - (:tags directives)))))) + (or (:tags directives) (:roam_tags directives)) + (assoc :page/tags (let [tags (:tags directives) + roam-tags (:roam_tags directives) + tags (if (string? tags) + (string/split tags #",") + tags) + tags (->> (concat tags roam-tags) + (remove nil?) + (distinct))] + (util/->tags tags)))))) (->> (map first pages) (remove nil?))) pages (concat diff --git a/web/src/main/frontend/format/block.cljs b/web/src/main/frontend/format/block.cljs index 0bfbae3f97..168af5019f 100644 --- a/web/src/main/frontend/format/block.cljs +++ b/web/src/main/frontend/format/block.cljs @@ -89,21 +89,9 @@ first second)) -(defn ->tags - [tags] - (->> (map (fn [tag] - (let [tag (-> (string/lower-case tag) - (string/replace #"\s+" "-"))] - (if (util/tag-valid? tag) - {:db/id tag - :tag/name tag}))) - (remove nil? tags)) - (remove nil?) - vec)) - (defn with-refs [{:keys [title body tags] :as heading}] - (let [tags (mapv :tag/name (->tags (map :tag/name tags))) + (let [tags (mapv :tag/name (util/->tags (map :tag/name tags))) ref-pages (atom tags)] (walk/postwalk (fn [form] @@ -130,7 +118,7 @@ [{:keys [title body tags] :as heading}] (cond-> heading (seq tags) - (assoc :tags (->tags tags)))) + (assoc :tags (util/->tags tags)))) (defn extract-headings [blocks last-pos encoded-content] diff --git a/web/src/main/frontend/format/mldoc.cljs b/web/src/main/frontend/format/mldoc.cljs index 1f759d31f5..5536f859dd 100644 --- a/web/src/main/frontend/format/mldoc.cljs +++ b/web/src/main/frontend/format/mldoc.cljs @@ -26,19 +26,22 @@ (.parseJson js/window.Mldoc content (or config default-config)))) ;; E.g "Foo Bar \"Bar Baz\"" -(defn- sep-by-quote-or-space +(defn- sep-by-quote-or-space-or-comma [s] - (some->> - (string/split s #"\"") - (remove string/blank?) - (map (fn [s] - (if (or (= " " (first s)) (= " " (last s))) - ;; space separated tags - (string/split (string/trim s) #" ") - s))) - flatten - distinct - (map string/lower-case))) + (when s + (let [comma? (re-find #"," s)] + (some->> + (string/split s #"[\"|\,]{1}") + (remove string/blank?) + (map (fn [s] + (if (and (not comma?) + (or (= " " (first s)) (= " " (last s)))) + ;; space separated tags + (string/split (string/trim s) #" ") + s))) + flatten + distinct + (map string/lower-case))))) (defn collect-page-directives [ast] @@ -64,18 +67,17 @@ directives (->> (remove (fn [x] (= :macro (first x))) directives) (into {})) directives (if (seq directives) - (let [directives (-> - (cond-> directives - (:roam_alias directives) - (assoc :alias (:roam_alias directives)) - (:roam_tags directives) - (assoc :tags (:roam_tags directives)) - (:roam_key directives) - (assoc :key (:roam_key directives))) - (dissoc :roam_alias :roam_tags :roam_key))] - (-> directives - (update :alias sep-by-quote-or-space) - (update :tags sep-by-quote-or-space))) + (cond-> directives + (:roam_alias directives) + (assoc :alias (:roam_alias directives)) + (:roam_key directives) + (assoc :key (:roam_key directives)) + (:alias directives) + (update :alias sep-by-quote-or-space-or-comma) + (:tags directives) + (update :tags sep-by-quote-or-space-or-comma) + (:roam_tags directives) + (update :roam_tags sep-by-quote-or-space-or-comma)) directives) directives (assoc directives :macros macros) other-ast (drop-while directive? ast)] diff --git a/web/src/main/frontend/handler.cljs b/web/src/main/frontend/handler.cljs index d145e8cce2..6580a9b932 100644 --- a/web/src/main/frontend/handler.cljs +++ b/web/src/main/frontend/handler.cljs @@ -1022,6 +1022,8 @@ [old-directives new-directives] (when pre-heading? [(:page/directives (db/entity (:db/id page))) (db/parse-directives value format)]) + page-tags (when-let [tags (:tags new-directives)] + (util/->tags tags)) page-list (when-let [content (:list new-directives)] (db/extract-page-list content)) permalink-changed? (when (and pre-heading? (:permalink old-directives)) @@ -1053,13 +1055,28 @@ (block/parse-heading (assoc heading :heading/content value) format)) headings (db/recompute-heading-children repo heading headings) after-headings (rebuild-after-headings repo file (:end-pos meta) end-pos) + page-id (:db/id page) modified-time (let [modified-at (tc/to-long (t/now))] - [[:db/add (:db/id page) :page/last-modified-at modified-at] + [[:db/add page-id :page/last-modified-at modified-at] [:db/add (:db/id file) :file/last-modified-at modified-at]]) page-directives (when pre-heading? - [(assoc page :page/directives new-directives)]) + (if (seq new-directives) + [[:db/retract page-id :page/directives] + {:db/id page-id + :page/directives new-directives}] + [[:db/retract page-id :page/directives]])) page-list (when pre-heading? - [(assoc page :page/list page-list)])] + (if (seq page-list) + [[:db/retract page-id :page/list] + {:db/id page-id + :page/list page-list}] + [[:db/retract page-id :page/list]])) + page-tags (when (and pre-heading? (seq page-tags)) + (if (seq page-tags) + [[:db/retract page-id :page/tags] + {:db/id page-id + :page/tags page-tags}] + [[:db/retract page-id :page/tags]]))] (profile "Save heading: " (transact-react-and-alter-file! @@ -1069,6 +1086,7 @@ headings page-directives page-list + page-tags after-headings modified-time) {:key :heading/change diff --git a/web/src/main/frontend/util.cljs b/web/src/main/frontend/util.cljs index 9b82afc221..86b887981e 100644 --- a/web/src/main/frontend/util.cljs +++ b/web/src/main/frontend/util.cljs @@ -701,3 +701,21 @@ (defn pp-str [x] (with-out-str (pprint x))) + +(defn ->tags + [tags] + (->> (map (fn [tag] + (let [tag (-> (string/trim tag) + (string/lower-case) + (string/replace #"\s+" "-"))] + (if (tag-valid? tag) + {:db/id tag + :tag/name tag}))) + (remove nil? tags)) + (remove nil?) + vec)) + +(defn ->page-tags + [s] + (let [tags (string/split s #",")] + (->tags tags)))