Project

bible_ref

0.02
Low commit activity in last 3 years
A long-lived project that still receives updates
Bible reference parser returns normalized sets of ranges, ideal for querying a database or XML data source such as WEB in USFX.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies

Development

~> 0.10.1
~> 3.0

Runtime

~> 1.6
 Project Readme

BibleRef

This small Rubygem does its best at taking a user-input string like "john 3:16" and turning it into something useful for querying a database (this is how we use it in bible_api).

Usage

ref = BibleRef::Reference.new('jn 3:16')
# #<BibleRef::Reference:0x000001020f7000 @reference="jn 3:16", @details={:book=>"jn", :refs=>{:chapter=>3, :verse=>16}}>

ref.valid?
# true

ref.book_id
# "JHN"

ref.normalize
# "John 3:16"

Ranges

Call #ranges to get from/to pairs of verses.

BibleRef::Reference.new('john 3:16').ranges
# [
#   [{ book: 'JHN', chapter: 3, verse: 16 },
#    { book: 'JHN', chapter: 3, verse: 16 }]
# ]

BibleRef::Reference.new('Romans 12:1,3-4 & 13:2-4,7-8').ranges
# [
#   [{ book: 'ROM', chapter: 12, verse: 1 },
#    { book: 'ROM', chapter: 12, verse: 1 }],
#   [{ book: 'ROM', chapter: 12, verse: 3 },
#    { book: 'ROM', chapter: 12, verse: 4 }],
#   [{ book: 'ROM', chapter: 13, verse: 2 },
#    { book: 'ROM', chapter: 13, verse: 4 }],
#   [{ book: 'ROM', chapter: 13, verse: 7 },
#    { book: 'ROM', chapter: 13, verse: 8 }]
# ]

You can then take this and turn it into a few small SQL queries like this:

verses = ranges.map do |from_ref, to_ref|
  first = DB['select id from verses where book = :book and chapter = :chapter and verse = :verse limit 1', from_ref].first
  last  = DB['select id from verses where book = :book and chapter = :chapter and verse = :verse limit 1', to_ref].first
  DB['select * from verses where id between ? and ?', first['id'], last['id']]
end

Single-Chapter Book Matching

Passing single_chapter_book_matching keyword to Reference changes how single-chapter books are handled. It affects how something like Jude 1 is parsed:

setting input result
:special (default) jude 1 single verse of Jude 1:1
:indifferent jude 1 whole chapter of Jude

While the default of :special seems to match what most people expect, using the :indifferent setting will make jude 1 behave the same as something like john 1 -- both will return the entire chapter.

BibleRef::Reference.new('jude 1').ranges
# [
#   [{ book: 'JUD', chapter: 1, verse: 1 },
#    { book: 'JUD', chapter: 1, verse: 1 }]
# ]

BibleRef::Reference.new('jude 1', single_chapter_book_matching: :indifferent).ranges
# [
#   [{ book: 'JUD', chapter: 1 },
#    { book: 'JUD', chapter: 1 }]
# ]

Copyright

Copyright Tim Morgan. Licensed MIT.