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