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