module Roda::RodaPlugins::SymbolMatchers

  1. lib/roda/plugins/symbol_matchers.rb

The symbol_matchers plugin allows you do define custom regexps to use for specific symbols. For example, if you have a route such as:

r.on :username do
  # ...
end

By default this will match all nonempty segments. However, if your usernames must be 6-20 characters, and can only contain a-z and 0-9, you can do:

plugin :symbol_matchers
symbol_matcher :username, /([a-z0-9]{6,20})/

Then the route will only if the path is /foobar123, but not if it is /foo, /FooBar123, or /foobar_123.

By default, this plugin sets up the following symbol matchers:

:d

/(\d+)/, a decimal segment

:rest

/(.*)/, all remaining characters, if any

:w

/(\w+)/, a alphanumeric segment

If placeholder string matchers are supported, this feature also applies to embedded colons in strings, so the following:

r.on "users/:username" do
  # ...
end

Would match /users/foobar123, but not /users/foo, /users/FooBar123, or /users/foobar_123.

If placeholder string matchers are supported, it also adds the following symbol matchers:

:format

/(?:\.(\w+))?/, an optional format/extension

:opt

/(?:\/([^\/]+))?, an optional segment

:optd

/(?:\/(\d+))?, an optional decimal segment

These are only added when placeholder string matchers are supported, because they only make sense when used inside of a string, due to how segment matching works. Example:

r.is "album:opt" do |id| end
# matches /album (yielding nil) and /album/foo (yielding "foo")
# does not match /album/ or /album/foo/bar

If using this plugin with the params_capturing plugin, this plugin should be loaded first.

Methods

Public Class

  1. configure

Public Class methods

configure (app)
[show source]
# File lib/roda/plugins/symbol_matchers.rb, line 55
def self.configure(app)
  app.symbol_matcher(:d, /(\d+)/)
  app.symbol_matcher(:w, /(\w+)/)
  app.symbol_matcher(:rest, /(.*)/)

  if !app.opts[:verbatim_string_matcher]
    app.symbol_matcher(:format, /(?:\.(\w+))?/)
    app.symbol_matcher(:opt, /(?:\/([^\/]+))?/)
    app.symbol_matcher(:optd, /(?:\/(\d+))?/)
  end
end