1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
module Chronic
class Scalar < Tag
DAY_PORTIONS = %w( am pm morning afternoon evening night )
# Scan an Array of Token objects and apply any necessary Scalar
# 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.
def self.scan(tokens, options)
tokens.each_index do |i|
token = tokens[i]
post_token = tokens[i + 1]
if token.word =~ /^\d+$/
scalar = token.word.to_i
token.tag(Scalar.new(scalar))
token.tag(ScalarSubsecond.new(scalar)) if Chronic::Time::could_be_subsecond?(scalar)
token.tag(ScalarSecond.new(scalar)) if Chronic::Time::could_be_second?(scalar)
token.tag(ScalarMinute.new(scalar)) if Chronic::Time::could_be_minute?(scalar)
token.tag(ScalarHour.new(scalar)) if Chronic::Time::could_be_hour?(scalar)
unless post_token and DAY_PORTIONS.include?(post_token.word)
token.tag(ScalarDay.new(scalar)) if Chronic::Date::could_be_day?(scalar)
token.tag(ScalarMonth.new(scalar)) if Chronic::Date::could_be_month?(scalar)
if Chronic::Date::could_be_year?(scalar)
year = Chronic::Date::make_year(scalar, options[:ambiguous_year_future_bias])
token.tag(ScalarYear.new(year.to_i))
end
end
end
end
end
def to_s
'scalar'
end
end
class ScalarSubsecond < Scalar #:nodoc:
def to_s
super << '-subsecond-' << @type.to_s
end
end
class ScalarSecond < Scalar #:nodoc:
def to_s
super << '-second-' << @type.to_s
end
end
class ScalarMinute < Scalar #:nodoc:
def to_s
super << '-minute-' << @type.to_s
end
end
class ScalarHour < Scalar #:nodoc:
def to_s
super << '-hour-' << @type.to_s
end
end
class ScalarDay < Scalar #:nodoc:
def to_s
super << '-day-' << @type.to_s
end
end
class ScalarMonth < Scalar #:nodoc:
def to_s
super << '-month-' << @type.to_s
end
end
class ScalarYear < Scalar #:nodoc:
def to_s
super << '-year-' << @type.to_s
end
end
end
|