juxt / bidi

Bidirectional URI routing

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

RegExp flags not respected by match-pattern

olivergeorge opened this issue · comments

This issue came up while I tried to setup a case insensitive PatternSegment in my routing table.

Clojurescript re-pattern implementation handle's java style regex flags by picking them off the front of the string and building a compatible js/RegExp object.

(defn re-pattern
  "Returns an instance of RegExp which has compiled the provided string."
  [s]
  (if (instance? js/RegExp s)
    s
    (let [[prefix flags] (re-find #"^\(\?([idmsux]*)\)" s)
          pattern (subs s (count prefix))]
      (js/RegExp. pattern (or flags "")))))

This means a case insensitive route could be written as ["/" {#"(?i)Foo" ::foo}].

Currently this doesn't work because the regex is wrapped in parens before use.

(match-beginning (str "(" (segment-regex-group this) ")") env)

(re-pattern (str regex-pattern "(.*)"))

This means the regex string doesn't start with the regex flags anymore. (?i)Foo becomes ((?i)Foo)(.*) but we need (?i)(Foo)(.*)

Possible fixes:

  • global "case insensitive" mode. update match-beginning to use flag and prefix "(?i)" if needed.
  • use helper to change the RegExp PatternSegment so that regex flags are respected. So that (?i)Foo becomes (?i)(Foo). Use this helper when making match-beginning calls.

Good spot. Yes, a valid issue. Not sure what to do, will sleep on it.