class Orbit::Routing::Pattern
Attributes
ignore[RW]
keys[RW]
segment[RW]
Public Class Methods
new(segment)
click to toggle source
# File lib/orbit/routing/pattern.rb, line 4 def initialize(segment) @segment = segment @ignore = [] @keys = [] end
resolve(segment)
click to toggle source
# File lib/orbit/routing/pattern.rb, line 10 def self.resolve(segment) new(segment).resolve end
Public Instance Methods
resolve()
click to toggle source
# File lib/orbit/routing/pattern.rb, line 14 def resolve result = pattern.gsub(/((:\w+)|\*)/) do |match| if match == "*" keys << 'splat' "(.*?)" else keys << $2[1..-1] safe_ignore end end [keys, ignore, result] end
Private Instance Methods
define_pattern(ch)
click to toggle source
# File lib/orbit/routing/pattern.rb, line 38 def define_pattern(ch) encoded(ch).gsub(/%[\da-fA-F]{2}/) do |match| match.split(//).map! {|char| char =~ /[A-Z]/ ? "[#{char}#{char.tr('A-Z', 'a-z')}]" : char}.join end end
pattern()
click to toggle source
# File lib/orbit/routing/pattern.rb, line 31 def pattern segment.to_str.gsub(/[^\?\%\\\/\:\*\w]|:(?!\w)/) do |char| ignore.push(escaped(char).join) if char.match(/[\.@]/) define_pattern(char) end end
safe_ignore()
click to toggle source
# File lib/orbit/routing/pattern.rb, line 44 def safe_ignore unsafe_ignore = [] local_ignore = ignore.uniq.join.gsub(/%[\da-fA-F]{2}/) do |hex| unsafe_ignore << hex[1..2] '' end unsafe_patterns = unsafe_ignore.map! do |unsafe| chars = unsafe.split(//).map! do |char| if char =~ /[A-Z]/ char <<= char.tr('A-Z', 'a-z') end char end "|(?:%[^#{chars[0]}].|%[#{chars[0]}][^#{chars[1]}])" end if unsafe_patterns.length > 0 "((?:[^#{local_ignore}/?#%]#{unsafe_patterns.join()})+)" else "([^#{local_ignore}/?#]+)" end end