class BibleBot::Reference

A Reference represents a range of verses.

Attributes

end_verse[R]
start_verse[R]

Public Class Methods

from_verse_ids(start_verse_id, end_verse_id=nil) click to toggle source

Initialize a {Reference} from {Verse} IDs. If no end_verse_id is provided, it will set end_verse to equal start_verse.

@param start_verse_id [Integer] @param end_verse_id [Integer] @return [Reference] @example

BibleBot::Reference.from_verse_ids(1001001, 1001010) #=> (Gen 1:1-10)
# File lib/bible_bot/reference.rb, line 15
def self.from_verse_ids(start_verse_id, end_verse_id=nil)
  new(
    start_verse: Verse.from_id(start_verse_id),
    end_verse: Verse.from_id(end_verse_id || start_verse_id),
  )
end
new(start_verse:, end_verse: nil) click to toggle source

@param start_verse [Verse] @param end_verse [Verse] Defaults to start_verse if no end_verse is provided

# File lib/bible_bot/reference.rb, line 42
def initialize(start_verse:, end_verse: nil)
  @start_verse = start_verse
  @end_verse   = end_verse || start_verse
end
parse(text, validate: true) click to toggle source

Parse text into an array of scripture References.

@param text [String] ex: “John 1:1 is the first but Romans 8:9-10 is another.” @param validate [Boolean, :raise_errors]

* true - Skip invalid references (default)
* false - Include invalid references
* :raise_errors - Raise error if any references are invalid

@return [Array<Reference>]

# File lib/bible_bot/reference.rb, line 30
def self.parse(text, validate: true)
  return [] if text.nil? || text.strip == ""

  ReferenceMatch.scan(text).map(&:reference).select do |ref|
    ref.validate! if validate == :raise_errors

    !validate || ref.valid?
  end
end

Public Instance Methods

formatted(include_chapter_on_single_chapter_books: false) click to toggle source

Returns a formatted string of the {Reference}.

@param include_chapter_on_single_chapter_books [Boolean] @return [String] @example

reference.formatted #=> "Genesis 2:4-5:9"
# File lib/bible_bot/reference.rb, line 53
def formatted(include_chapter_on_single_chapter_books: false)
  formatted_verses = [start_verse.formatted(include_verse: !full_chapters?, include_chapter_on_single_chapter_books: include_chapter_on_single_chapter_books)]

  if end_verse && end_verse > start_verse && !(same_start_and_end_chapter? && full_chapters?)
    formatted_verses << end_verse.formatted(
      include_book: !same_start_and_end_book?,
      include_chapter: !same_start_and_end_chapter?,
      include_verse: !full_chapters?,
    )
  end

  formatted_verses.join('-')
end
full_chapters?() click to toggle source

One or multiple full chapters.

@return [Boolean]

# File lib/bible_bot/reference.rb, line 81
def full_chapters?
  start_verse.verse_number == 1 && end_verse&.last_verse_in_chapter?
end
includes_verse?(verse) click to toggle source

Returns true if the given verse is within the start and end verse of the Reference.

@param verse [Verse] @return [Boolean]

# File lib/bible_bot/reference.rb, line 94
def includes_verse?(verse)
  return false unless verse.is_a?(Verse)

  start_verse <= verse && verse <= end_verse
end
inspect() click to toggle source

@return [Hash]

# File lib/bible_bot/reference.rb, line 130
def inspect
  {
    start_verse: start_verse&.formatted,
    end_verse: end_verse&.formatted,
  }
end
intersects_reference?(other) click to toggle source

Return true if the two references contain any of the same verses. @param other [Reference] @return [Boolean]

# File lib/bible_bot/reference.rb, line 103
def intersects_reference?(other)
  return false unless other.is_a?(Reference)

  start_verse <= other.end_verse && end_verse >= other.start_verse
end
same_start_and_end_book?() click to toggle source

@return [Boolean]

# File lib/bible_bot/reference.rb, line 68
def same_start_and_end_book?
  start_verse.book == end_verse&.book
end
same_start_and_end_chapter?() click to toggle source

@return [Boolean]

# File lib/bible_bot/reference.rb, line 73
def same_start_and_end_chapter?
  same_start_and_end_book? &&
  start_verse.chapter_number == end_verse&.chapter_number
end
to_s() click to toggle source

@return [string]

# File lib/bible_bot/reference.rb, line 86
def to_s
  "BibleBot::Reference — #{formatted}"
end
valid?() click to toggle source

@return [Boolean]

# File lib/bible_bot/reference.rb, line 138
def valid?
  start_verse&.valid? && end_verse&.valid? && end_verse >= start_verse
end
validate!() click to toggle source

Raises error if reference is invalid

# File lib/bible_bot/reference.rb, line 143
def validate!
  start_verse&.validate!
  end_verse&.validate!
  raise InvalidReferenceError.new "Reference is not vaild: #{inspect}" unless valid?
end
verses() click to toggle source

Returns an array of all the verses contained in the Reference.

@return [Array<Verse>]

# File lib/bible_bot/reference.rb, line 112
def verses
  return @verses if defined? @verses

  @verses = []
  return @verses unless valid?

  verse = start_verse

  loop do
    @verses << verse
    break if end_verse.nil? || verse == end_verse
    verse = verse.next_verse
  end

  @verses
end