class Chronic::Repeater

Public Instance Methods

<=>(other) click to toggle source
# File lib/chronic/repeater.rb, line 123
def <=>(other)
  width <=> other.width
end
next(pointer) click to toggle source

returns the next occurance of this repeatable.

# File lib/chronic/repeater.rb, line 133
def next(pointer)
  raise("Start point must be set before calling #next") unless @now
end
this(pointer) click to toggle source
# File lib/chronic/repeater.rb, line 137
def this(pointer)
  raise("Start point must be set before calling #this") unless @now
end
to_s() click to toggle source
# File lib/chronic/repeater.rb, line 141
def to_s
  'repeater'
end
width() click to toggle source

returns the width (in seconds or months) of this repeatable.

# File lib/chronic/repeater.rb, line 128
def width
  raise("Repeater#width must be overridden in subclasses")
end

Public Class Methods

scan(tokens, options) click to toggle source

Scan an Array of Token objects and apply any necessary Repeater tags to each token.

tokens - An Array of tokens to scan. options - The Hash of options specified in Chronic.parse.

Returns an Array of tokens.

# File lib/chronic/repeater.rb, line 11
def self.scan(tokens, options)
  tokens.each do |token|
    if t = scan_for_season_names(token, options) then token.tag(t); next end
    if t = scan_for_month_names(token, options) then token.tag(t); next end
    if t = scan_for_day_names(token, options) then token.tag(t); next end
    if t = scan_for_day_portions(token, options) then token.tag(t); next end
    if t = scan_for_times(token, options) then token.tag(t); next end
    if t = scan_for_units(token, options) then token.tag(t); next end
  end
end
scan_for_day_names(token, options = {}) click to toggle source

token - The Token object we want to scan.

Returns a new Repeater object.

# File lib/chronic/repeater.rb, line 59
def self.scan_for_day_names(token, options = {})
  scan_for token, RepeaterDayName,
  {
    /^m[ou]n(day)?$/ => :monday,
    /^t(ue|eu|oo|u|)s?(day)?$/ => :tuesday,
    /^we(d|dnes|nds|nns)(day)?$/ => :wednesday,
    /^th(u|ur|urs|ers)(day)?$/ => :thursday,
    /^fr[iy](day)?$/ => :friday,
    /^sat(t?[ue]rday)?$/ => :saturday,
    /^su[nm](day)?$/ => :sunday
  }, options
end
scan_for_day_portions(token, options = {}) click to toggle source

token - The Token object we want to scan.

Returns a new Repeater object.

# File lib/chronic/repeater.rb, line 75
def self.scan_for_day_portions(token, options = {})
  scan_for token, RepeaterDayPortion,
  {
    /^ams?$/ => :am,
    /^pms?$/ => :pm,
    /^mornings?$/ => :morning,
    /^afternoons?$/ => :afternoon,
    /^evenings?$/ => :evening,
    /^(night|nite)s?$/ => :night
  }, options
end
scan_for_month_names(token, options = {}) click to toggle source

token - The Token object we want to scan.

Returns a new Repeater object.

# File lib/chronic/repeater.rb, line 38
def self.scan_for_month_names(token, options = {})
  scan_for token, RepeaterMonthName,
  {
    /^jan[:\.]?(uary)?$/ => :january,
    /^feb[:\.]?(ruary)?$/ => :february,
    /^mar[:\.]?(ch)?$/ => :march,
    /^apr[:\.]?(il)?$/ => :april,
    /^may$/ => :may,
    /^jun[:\.]?e?$/ => :june,
    /^jul[:\.]?y?$/ => :july,
    /^aug[:\.]?(ust)?$/ => :august,
    /^sep[:\.]?(t[:\.]?|tember)?$/ => :september,
    /^oct[:\.]?(ober)?$/ => :october,
    /^nov[:\.]?(ember)?$/ => :november,
    /^dec[:\.]?(ember)?$/ => :december
  }, options
end
scan_for_season_names(token, options = {}) click to toggle source

token - The Token object we want to scan.

Returns a new Repeater object.

# File lib/chronic/repeater.rb, line 25
def self.scan_for_season_names(token, options = {})
  scan_for token, RepeaterSeasonName,
  {
    /^springs?$/ => :spring,
    /^summers?$/ => :summer,
    /^(autumn)|(fall)s?$/ => :autumn,
    /^winters?$/ => :winter
  }, options
end
scan_for_times(token, options = {}) click to toggle source

token - The Token object we want to scan.

Returns a new Repeater object.

# File lib/chronic/repeater.rb, line 90
def self.scan_for_times(token, options = {})
  scan_for token, RepeaterTime, /^\d{1,2}(:?\d{1,2})?([\.:]?\d{1,2}([\.:]\d{1,6})?)?$/, options
end
scan_for_units(token, options = {}) click to toggle source

token - The Token object we want to scan.

Returns a new Repeater object.

# File lib/chronic/repeater.rb, line 97
def self.scan_for_units(token, options = {})
  {
    /^years?$/ => :year,
    /^seasons?$/ => :season,
    /^months?$/ => :month,
    /^fortnights?$/ => :fortnight,
    /^weeks?$/ => :week,
    /^weekends?$/ => :weekend,
    /^(week|business)days?$/ => :weekday,
    /^days?$/ => :day,
          /^hrs?$/ => :hour,
    /^hours?$/ => :hour,
          /^mins?$/ => :minute,
    /^minutes?$/ => :minute,
          /^secs?$/ => :second,
    /^seconds?$/ => :second
  }.each do |item, symbol|
    if item =~ token.word
      klass_name = 'Repeater' + symbol.to_s.capitalize
      klass = Chronic.const_get(klass_name)
      return klass.new(symbol, options)
    end
  end
  return nil
end