Class: ActionDispatch::Journey::Path::Pattern::AnchoredRegexp

Inherits:
Visitors::Visitor show all
Defined in:
actionpack/lib/action_dispatch/journey/path/pattern.rb

Overview

:nodoc:

Direct Known Subclasses

UnanchoredRegexp

Constant Summary

Constants inherited from Visitors::Visitor

Visitors::Visitor::DISPATCH_CACHE

Instance Method Summary collapse

Constructor Details

#initialize(separator, matchers) ⇒ AnchoredRegexp

Returns a new instance of AnchoredRegexp.



77
78
79
80
81
82
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 77

def initialize(separator, matchers)
  @separator = separator
  @matchers  = matchers
  @separator_re = "([^#{separator}]+)"
  super()
end

Instance Method Details

#accept(node) ⇒ Object



84
85
86
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 84

def accept(node)
  Pattern.dedup_regexp(%r{\A#{visit node}\Z})
end

#visit_CAT(node) ⇒ Object



88
89
90
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 88

def visit_CAT(node)
  "#{visit(node.left)}#{visit(node.right)}"
end

#visit_GROUP(node) ⇒ Object



101
102
103
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 101

def visit_GROUP(node)
  "(?:#{visit node.left})?"
end

#visit_LITERAL(node) ⇒ Object Also known as: visit_DOT



105
106
107
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 105

def visit_LITERAL(node)
  Regexp.escape(node.left)
end

#visit_OR(node) ⇒ Object



119
120
121
122
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 119

def visit_OR(node)
  children = node.children.map { |n| visit n }
  "(?:#{children.join(?|)})"
end

#visit_SLASH(node) ⇒ Object



110
111
112
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 110

def visit_SLASH(node)
  node.left
end

#visit_STAR(node) ⇒ Object



114
115
116
117
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 114

def visit_STAR(node)
  re = @matchers[node.left.to_sym]
  re ? "(#{re})" : "(.+)"
end

#visit_SYMBOL(node) ⇒ Object



92
93
94
95
96
97
98
99
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 92

def visit_SYMBOL(node)
  node = node.to_sym

  return @separator_re unless @matchers.key?(node)

  re = @matchers[node]
  "(#{Regexp.union(re)})"
end