computersandblues.lodestone/src/computersandblues/lodestone/match.cljs
2025-11-22 00:29:43 +01:00

30 lines
1 KiB
Clojure

(ns computersandblues.lodestone.match
(:require [applied-science.js-interop :as j]))
(defn- ->regex
"Does its best to compila a stirng into a regular expression; will fall back
to return a RegExp that matches verbatim."
[s]
(try
(js/RegExp. s "i")
(catch js/Error _
(js/RegExp. (js/RegExp.escape s) "i"))))
(defn query->tokens [query]
(->> (re-seq #"\"([^\"]+)\"|([^\s]+)" query)
(mapv (fn [[_ a b]] (or a b)))))
(defn text-matcher [token]
(let [match? (partial re-find (->regex token))]
(filter (fn [post]
(or (match? (j/get post :content))
(match? (j/get-in post [:account :acct])) ; search for url + username of poster
(some #(match? (j/get % :username)) (j/get post :mentions))
(some #(some-> (j/get % :description) match?) (j/get post :media_attachments))))))) ; search in alt text
(defn query->matching-xform [query]
(if query
(->> (query->tokens query)
(mapv #(text-matcher %))
(reduce comp))
(filter (constantly true))))