class CulturalDates::CulturalInterval

Public Class Methods

new(val="", debug=false) click to toggle source
# File lib/cultural_dates/cultural_interval.rb, line 13
def initialize(val="", debug=false)
  if val
    begin
      parse_result = DateStringParser.new.parse_with_debug(val, reporter: Parslet::ErrorReporter::Deepest.new)
      puts "parse_result: #{parse_result.inspect}" if debug
      transformed_result = DateTransform.new.apply(parse_result)
      puts "transformed_result: #{transformed_result.inspect}" if debug
      if transformed_result
        @value = transformed_result
      end
    rescue Parslet::ParseFailed => e
      @value = nil
    end
  else
    @value = nil
  end
  # puts "@value: #{@value}"
end
parse(val, debug=false) click to toggle source
# File lib/cultural_dates/cultural_interval.rb, line 8
def parse(val, debug=false)
  return CulturalInterval.new(val, debug)
end

Public Instance Methods

begin_interval() click to toggle source
# File lib/cultural_dates/cultural_interval.rb, line 73
def begin_interval
  from = earliest || :unknown
  to = earliest_definite || :unknown
  EDTF::Interval.new(from, to)
end
Also aliased as: beginning_interval, beginning
beginning()
Alias for: begin_interval
beginning_interval()
Alias for: begin_interval
botb() click to toggle source
# File lib/cultural_dates/cultural_interval.rb, line 32
def botb
  @botb ||= CulturalDate.edtf @value[:botb]
end
bote() click to toggle source
# File lib/cultural_dates/cultural_interval.rb, line 36
def bote
  @bote ||= CulturalDate.edtf @value[:bote]
end
definite_interval() click to toggle source
# File lib/cultural_dates/cultural_interval.rb, line 98
def definite_interval
  from = earliest_definite || :unknown
  to = latest_definite || :unknown
  EDTF::Interval.new(from, to)
end
earliest() click to toggle source
# File lib/cultural_dates/cultural_interval.rb, line 49
 def earliest
   return nil if botb.unknown?
   botb.earliest
end
earliest_definite() click to toggle source
# File lib/cultural_dates/cultural_interval.rb, line 59
 def earliest_definite
   return nil if eotb.unknown? && bote.unknown?
   return latest_definite if eotb.unknown?
   return eotb.earliest if eotb == bote
   eotb.latest
end
end_interval() click to toggle source
# File lib/cultural_dates/cultural_interval.rb, line 82
def end_interval
  from = latest_definite || :unknown
  to = latest || :unknown
  EDTF::Interval.new(from, to)
end
Also aliased as: ending_interval, ending
ending()
Alias for: end_interval
ending_interval()
Alias for: end_interval
eotb() click to toggle source
# File lib/cultural_dates/cultural_interval.rb, line 40
def eotb
  @eotb ||= CulturalDate.edtf @value[:eotb]
end
eote() click to toggle source
# File lib/cultural_dates/cultural_interval.rb, line 44
def eote
  @eote ||= CulturalDate.edtf @value[:eote]
end
latest() click to toggle source
# File lib/cultural_dates/cultural_interval.rb, line 54
 def latest
   return nil if eote.unknown?
   eote.latest
end
latest_definite() click to toggle source
# File lib/cultural_dates/cultural_interval.rb, line 66
 def latest_definite
   return nil if bote.unknown? && eotb.unknown?
   return earliest_definite if bote.unknown?
   return bote.latest if eotb == bote
   bote.earliest
end
possible_interval() click to toggle source
# File lib/cultural_dates/cultural_interval.rb, line 90
def possible_interval
  from = earliest || :unknown
  to = latest || :unknown
  EDTF::Interval.new(from, to)
end
to_definite_edtf() click to toggle source
# File lib/cultural_dates/cultural_interval.rb, line 109
def to_definite_edtf 
  definite_interval.edtf
end
to_edtf() click to toggle source
# File lib/cultural_dates/cultural_interval.rb, line 105
def to_edtf 
  possible_interval.edtf
end
to_s() click to toggle source

Generate a textual representation of the timeframe of the period. @return [String]

# File lib/cultural_dates/cultural_interval.rb, line 115
def to_s

  # Handle special "throughout" case
  if (eotb.known? && bote.known?) && !(botb.known? || eote.known?) && eotb == bote
    return "throughout #{eotb}"
  end

  # Handle special "throughout, until" case
  if (eotb.known? && bote.known? && eote.known?) && !botb.known? && eotb == bote
    return "throughout #{eotb} until no later than #{eote}"
  end

  # Handle special "on" case
  if (botb.known? && eotb.known? && bote.known? && eote.known?) && 
     (botb == eotb && bote == eote && botb == eote) &&
     botb.earliest == botb.latest
     return "on #{botb}"
  end

  first_string = ""
  if botb.known? && eotb.known?
    if botb == eotb
      first_string = botb
    else
      first_string = "sometime between #{botb} and #{eotb}"
    end
  elsif botb.known?
    first_string = "after #{botb}"
  elsif eotb.known?
    first_string = "by #{eotb}"
  end

  second_string = nil
  if bote.known? && eote.known?
    if bote == eote
      second_string = bote
    else
      second_string = "sometime between #{bote} and #{eote}"
    end
  elsif bote.known?
    second_string = "at least #{bote}"
  elsif eote.known?
    second_string = "no later than #{eote}"
  end

  [first_string,second_string].compact.join(" until ").strip

end