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