class Eternal
Public Class Methods
cleanup!(str)
click to toggle source
# File lib/eternal.rb, line 19 def self.cleanup!(str) str.gsub!(/\b(?:(last|spann?)(?:ing|s)?(?: for)?|for)(?: a| the)?(?: period| time| duration| span)?(?: of)?\b/i, 'duration') str.gsub!(/\b(start|end)(s|ing)?(\sin|\son)?\b/i, '\1') str.gsub!(/\b(end)(\sat)\b/i, 'endtime') str.gsub!(/\beach\b/i,'every') str.gsub!(/\b(start)(\sat)\b/i, 'at') str.gsub!(/\b(?:every\s)?(#{DAYS_REGEX})\b/i, 'every 1 week on \1') str.gsub!(/\b(?:on\s?)?(#{DAYS_REGEX})s\b/i, 'every 1 week on \1') str.gsub!(/\bevery (#{TIME_UNITS_REGEX})\b/i, 'every 1 \1') str.gsub!(/\bevery other\b/i, 'every 2') str.gsub!(/\b(#{REPEATERS_REGEX})\b/i) { 'every 1 ' + REPEATERS[$1]} str.gsub!(/\b(#{TIME_UNITS_REGEX})(?:s)\b/i, '\1') # I HAVE NO IDEA IF THIS WORKS | DEFINITELY A HACK str.gsub!(/\b(\w*)\sto\b/i) do |match| previous_word = $1 if ($1 =~ /#{TIME_UNITS_REGEX}s?/i) == nil match = previous_word + ' ' + 'end' else match = previous_word + ' ' + 'before' end match end str.gsub!(/\b(\w*)\sfrom\b/i) do |match| previous_word = $1 if ($1 =~ /#{TIME_UNITS_REGEX}s?/i) == nil match = previous_word + ' ' + 'start' else match = previous_word + ' ' + 'after' end match end end
delete_unknown!(tokens)
click to toggle source
# File lib/eternal.rb, line 58 def self.delete_unknown!(tokens) tokens.select! {|token| (token =~ REGEX_ALL) != nil} end
nest_keywords(tokens)
click to toggle source
# File lib/eternal.rb, line 70 def self.nest_keywords(tokens) nested = [[]] tokens.each do |token| if (token.is_a? Symbol) nested << [] end nested.last << token end nested end
parse(str)
click to toggle source
# File lib/eternal.rb, line 8 def self.parse(str) str = str.dup cleanup!(str) tokens = tokenize(str) #delete_unknown!(tokens) recognize_keywords!(tokens) nested_tokens = nest_keywords(tokens) rrule = Evaluator.new(nested_tokens) rrule.evaluate end
recognize_keywords!(tokens)
click to toggle source
# File lib/eternal.rb, line 62 def self.recognize_keywords!(tokens) tokens.map! do |token| token = token.to_sym if (token =~ KEYWORDS_REGEX) != nil token end end
tokenize(str)
click to toggle source
# File lib/eternal.rb, line 52 def self.tokenize(str) str.gsub!(/\s+/m, ' ') str.strip! str.split(" ") end