Sha256: 6eff600e18c513abf05888afbe4cb07bb68dbedad15b8fd4058ac67996835f87
Contents?: true
Size: 1.29 KB
Versions: 3
Compression:
Stored size: 1.29 KB
Contents
require 'mustermann/regexp_based' module Mustermann # Sinatra 1.3 style pattern implementation. # # @example # Mustermann.new('/:foo', type: :simple) === '/bar' # => true # # @see Mustermann::Pattern # @see file:README.md#simple Syntax description in the README class Simple < RegexpBased supported_options :greedy, :space_matches_plus def compile(greedy: true, uri_decode: true, space_matches_plus: true, **options) pattern = @string.gsub(/[^\?\%\\\/\:\*\w]/) { |c| encoded(c, uri_decode, space_matches_plus) } pattern.gsub!(/((:\w+)|\*)/) do |match| match == "*" ? "(?<splat>.*?)" : "(?<#{$2[1..-1]}>[^/?#]+#{?? unless greedy})" end /\A#{Regexp.new(pattern)}\Z/ rescue SyntaxError, RegexpError => error type = error.message["invalid group name"] ? CompileError : ParseError raise type, error.message, error.backtrace end def encoded(char, uri_decode, space_matches_plus) return Regexp.escape(char) unless uri_decode parser = URI::Parser.new encoded = Regexp.union(parser.escape(char), parser.escape(char, /./).downcase, parser.escape(char, /./).upcase) encoded = Regexp.union(encoded, encoded('+', true, true)) if space_matches_plus and char == " " encoded end private :compile, :encoded end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
mustermann-0.3.1 | lib/mustermann/simple.rb |
mustermann-0.3.0 | lib/mustermann/simple.rb |
mustermann-0.2.0 | lib/mustermann/simple.rb |