Sha256: 46df1e32de8328c661207796b26470e0eb3d39b13a0789f73d29d7f3850ee8fb
Contents?: true
Size: 1.27 KB
Versions: 3
Compression:
Stored size: 1.27 KB
Contents
module Timeliness class FormatSet attr_reader :formats, :regexp def self.compile(formats) new(formats).compile! end def initialize(formats) @formats = formats @formats_hash = {} @match_indexes = {} end # Compiles the formats into one big regexp. Stores the index of where # each format's capture values begin in the matchdata. def compile! regexp_string = '' @formats.inject(0) { |index, format_string| format = Format.new(format_string).compile! @formats_hash[format_string] = format @match_indexes[index] = format regexp_string = "#{regexp_string}(#{format.regexp_string})|" index + format.token_count + 1 # add one for wrapper capture } @regexp = Regexp.new("^(?:#{regexp_string.chop})$") self end def match(string, format_string=nil) format = @formats_hash[format_string] if format_string match_regexp = format && format.regexp || @regexp if match_data = match_regexp.match(string) index = match_data.captures.index(string) start = index + 1 values = match_data.captures[start..(start+7)].compact format ||= @match_indexes[index] format.process(*values) end end end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
timeliness-0.3.2 | lib/timeliness/format_set.rb |
timeliness-0.3.1 | lib/timeliness/format_set.rb |
timeliness-0.3.0 | lib/timeliness/format_set.rb |