lib/usher/splitter.rb in joshbuddy-usher-0.4.3 vs lib/usher/splitter.rb in joshbuddy-usher-0.4.5
- old
+ new
@@ -6,33 +6,32 @@
def self.for_delimiters(delimiters, valid_regex)
delimiters_regex = delimiters.collect{|d| Regexp.quote(d)} * '|'
SplitterInstance.new(
delimiters,
Regexp.new('((:|\*)?' + valid_regex + '|' + delimiters_regex + '|\(|\)|\||\{)'),
- Regexp.new(delimiters_regex + '|' + valid_regex)
+ Regexp.new("[#{delimiters.collect{|d| Regexp.quote(d)}}]|[^#{delimiters.collect{|d| Regexp.quote(d)}}]+")
)
end
attr_reader :paths
class SplitterInstance
+ attr_reader :delimiter_chars
+
def initialize(delimiters, split_regex, url_split_regex)
@delimiters = delimiters
@delimiter_chars = delimiters.collect{|d| d[0]}
- @delimiter_chars_map = Hash[*@delimiter_chars.map{|c| [c, c.chr.to_sym]}.flatten]
@split_regex = split_regex
@url_split_regex = url_split_regex
end
def url_split(path)
- parts = path.scan(@url_split_regex)
- parts.map!{ |part| @delimiter_chars_map[part[0]] || part}
- parts
+ path.scan(@url_split_regex)
end
- def split(path, requirements = nil)
+ def split(path, requirements = nil, default_values = nil)
parts = Group.new(:all, nil)
ss = StringScanner.new(path)
current_group = parts
while !ss.eos?
part = ss.scan(@split_regex)
@@ -78,24 +77,24 @@
new_group << detached_group
new_group.parent << new_group
end
current_group.parent << Group.new(:all, current_group.parent)
current_group = current_group.parent.last
- when *@delimiter_chars
- current_group << part.to_sym
else
current_group << part
end
end unless !path || path.empty?
paths = calc_paths(parts)
paths.each do |path|
path.each_with_index do |part, index|
if part.is_a?(Usher::Route::Variable)
+ part.default_value = default_values[part.name] if default_values
+
case part.type
when :*
- part.look_ahead = path[index + 1, path.size].find{|p| !p.is_a?(Symbol) && !p.is_a?(Usher::Route::Variable)} || nil
+ part.look_ahead = path[index + 1, path.size].find{|p| !p.is_a?(Usher::Route::Variable) && !@delimiter_chars.include?(p[0])} || nil
when :':'
- part.look_ahead = path[index + 1, path.size].find{|p| p.is_a?(Symbol)} || @delimiters.first.to_sym
+ part.look_ahead = path[index + 1, path.size].find{|p| @delimiter_chars.include?(p[0])} || @delimiters.first
end
end
end
end
paths
\ No newline at end of file