Skip to content

Instantly share code, notes, and snippets.

@kordano
Last active September 12, 2022 12:14
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save kordano/56a16e1b28d706557f54 to your computer and use it in GitHub Desktop.
Save kordano/56a16e1b28d706557f54 to your computer and use it in GitHub Desktop.
URL parameter parsing with clojurescript
(defn parse-params
"Parse URL parameters into a hashmap"
[]
(let [param-strs (-> (.-location js/window) (split #"\?") last (split #"\&"))]
(into {} (for [[k v] (map #(split % #"=") param-strs)]
[(keyword k) v]))))
@olavfosse
Copy link

This function does not handle escape codes:

(new URLSearchParams("?foo=E%2BAXQB%2BA")).get("foo")
// => "E+AXQB+A"
(.-search (.-location js/window))
;; => "?foo=E%2BAXQB%2BA"
(parse-params)
;; => {:foo "E%2BAXQB%2BA"}

Here's a drop-in replacement which does:

(defn parse-params
  "Parse URL parameters into a hashmap"
  []
  (->> js/window
       (.-location)
       (.-search)
       (new js/URLSearchParams)
       (seq)
       
       ;; NB: `(js->clj v :keywordize-keys true)` does not keywordize
       ;;     our map keys, so we do that manually afterwards.
       (js->clj)
       (into {})
       (keywordize-keys) ;; clojure.walk/keywordize-keys
))

(comment
  (.-search (.-location js/window))
  ;; => "?foo=E%2BAXQB%2BA"
  (parse-params)
  ;; => {:foo "E+AXQB+A"}
)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment