bible_parser 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 81b20722da2fe055932ce55362c9b9856b1b8263
4
+ data.tar.gz: 9c7c29b4fd023897ddc4d0263113bedef3cabe19
5
+ SHA512:
6
+ metadata.gz: b0e8c2264b7ea234ea116c46e0090b67915e28b9a596ae80517cc6725b2bd06c0d24e1411768449f8b2ece2bc97e373cb2ecd6fde7b49ddf1b717a3a212323aa
7
+ data.tar.gz: eaa58f82526d4a717c77ec58e8b2ce0f3c4b4d200d402839a899dfda0bdf769c2201205f960dc66c411391c861eb871ebb73903fae976a16bc6b9e8b54464efb
@@ -0,0 +1,31 @@
1
+ # BibleParser
2
+
3
+ [![Build Status](https://travis-ci.org/seven1m/bible_parser.svg?branch=master)](https://travis-ci.org/seven1m/bible_parser)
4
+
5
+ This is a Ruby library for parsing different bible XML formats.
6
+
7
+ For now, it only supports USFX and OSIS, but I hope to add support for other formats also.
8
+
9
+ ## Install
10
+
11
+ ```
12
+ gem install bible_parser
13
+ ```
14
+
15
+ ## Use
16
+
17
+ You can get the a bible in XML format [here](https://github.com/seven1m/open-bibles).
18
+
19
+ ```ruby
20
+ require 'bible_parser'
21
+
22
+ bible = BibleParser.new(File.open('web.usfx.xml'))
23
+ verse = bible.books.first.chapters.first.verses.first
24
+ # => <Genesis 1:1>
25
+ verse.text
26
+ # => "In the beginning, God created the heavens and the earth.\n"
27
+ ```
28
+
29
+ ## License
30
+
31
+ Copyright (c) 2015 Tim Morgan. Licensed MIT. See LICENSE file.
@@ -0,0 +1,68 @@
1
+ require_relative 'bible_parser/parsers'
2
+ require_relative 'bible_parser/errors'
3
+ require_relative 'bible_parser/book'
4
+ require_relative 'bible_parser/chapter'
5
+ require_relative 'bible_parser/verse'
6
+
7
+ require 'stringio'
8
+
9
+ class BibleParser
10
+ attr_reader :format
11
+
12
+ def initialize(io, format: nil)
13
+ if io.is_a?(String)
14
+ @io = StringIO.new(io)
15
+ elsif io.respond_to?(:read)
16
+ @io = io
17
+ else
18
+ fail(
19
+ Errors::UnknownIoObjectError,
20
+ "#{io.inspect} is neither a File nor a String object. Please pass a File or a String."
21
+ )
22
+ end
23
+ @format = format || detect_format
24
+ end
25
+
26
+ def each_book(&block)
27
+ @io.rewind
28
+ if block
29
+ parser.each_book(&block)
30
+ else
31
+ parser.enum_for(:each_book)
32
+ end
33
+ end
34
+
35
+ def books
36
+ each_book.to_a
37
+ end
38
+
39
+ def each_verse(&block)
40
+ @io.rewind
41
+ if block
42
+ parser.each_verse(&block)
43
+ else
44
+ parser.enum_for(:each_verse)
45
+ end
46
+ end
47
+
48
+ def verses
49
+ each_verse.to_a
50
+ end
51
+
52
+ private
53
+
54
+ def parser
55
+ parser_class.new(@io)
56
+ end
57
+
58
+ def parser_class
59
+ PARSERS[format] or fail(Errors::ParserUnavailableError, "Parser for #{format.inspect} could not be loaded.")
60
+ end
61
+
62
+ def detect_format
63
+ PARSERS.each do |name, parser|
64
+ @io.rewind
65
+ return name if parser.new(@io).valid?
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,42 @@
1
+ class BibleParser
2
+ class Book
3
+ attr_reader :num, :id, :title
4
+
5
+ def initialize(num:, id:, title:, parser:)
6
+ @num = num
7
+ @id = id
8
+ @title = title
9
+ @parser = parser
10
+ end
11
+
12
+ def each_chapter(&block)
13
+ if block
14
+ @parser.each_chapter(book_id: id, &block)
15
+ else
16
+ enum_for(:each_chapter)
17
+ end
18
+ end
19
+
20
+ def chapters
21
+ each_chapter.to_a
22
+ end
23
+
24
+ def ==(other)
25
+ id == other.id
26
+ end
27
+
28
+ def inspect
29
+ "<#{to_s}>"
30
+ end
31
+
32
+ alias_method :to_s, :title
33
+
34
+ def to_h
35
+ {
36
+ num: num,
37
+ id: id,
38
+ title: title
39
+ }
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,55 @@
1
+ class BibleParser
2
+ class Chapter
3
+ attr_reader :num, :book_id, :book_num, :book_title
4
+
5
+ def initialize(num:, book_id:, book_num:, book_title:, parser:)
6
+ @num = num
7
+ @book_id = book_id
8
+ @book_num = book_num
9
+ @book_title = book_title
10
+ @parser = parser
11
+ end
12
+
13
+ def each_verse(&block)
14
+ if block
15
+ @parser.each_verse(book_id: book_id, chapter_num: num, &block)
16
+ else
17
+ enum_for(:each_verse)
18
+ end
19
+ end
20
+
21
+ def verses
22
+ each_verse.to_a
23
+ end
24
+
25
+ def book
26
+ Book.new(
27
+ id: book_id,
28
+ num: book_num,
29
+ title: book_title,
30
+ parser: @parser
31
+ )
32
+ end
33
+
34
+ def ==(other)
35
+ book_id == other.book_id && num == other.num
36
+ end
37
+
38
+ def inspect
39
+ "<#{to_s}>"
40
+ end
41
+
42
+ def to_s
43
+ "#{book_title} #{num}"
44
+ end
45
+
46
+ def to_h
47
+ {
48
+ num: num,
49
+ book_id: book_id,
50
+ book_num: book_num,
51
+ book_title: book_title
52
+ }
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,6 @@
1
+ class BibleParser
2
+ module Errors
3
+ class UnknownIoObjectError < StandardError; end
4
+ class ParserUnavailableError < StandardError; end
5
+ end
6
+ end
@@ -0,0 +1,10 @@
1
+ require_relative 'parsers/base'
2
+ require_relative 'parsers/usfx'
3
+ require_relative 'parsers/osis'
4
+
5
+ class BibleParser
6
+ PARSERS = {
7
+ 'USFX' => Parsers::USFX::Parser,
8
+ 'OSIS' => Parsers::OSIS::Parser
9
+ }
10
+ end
@@ -0,0 +1,9 @@
1
+ require_relative 'base/parser'
2
+ require_relative 'base/document'
3
+
4
+ class BibleParser
5
+ module Parsers
6
+ module Base
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,56 @@
1
+ require 'nokogiri'
2
+
3
+ class BibleParser
4
+ module Parsers
5
+ module Base
6
+ class Document < Nokogiri::XML::SAX::Document
7
+ def initialize(io:, iterator: :verse, iterate_book_id: nil, iterate_chapter_num: nil, &block)
8
+ super()
9
+ @book_num = 0
10
+ @io = io
11
+ @iterator = iterator
12
+ @iterate_book_id = iterate_book_id
13
+ @iterate_chapter_num = iterate_chapter_num
14
+ @block = block
15
+ end
16
+
17
+ def end_book
18
+ return unless @book_title
19
+ return unless @iterator == :book
20
+ @block.call(
21
+ num: @book_num,
22
+ id: @book_id,
23
+ title: @book_title
24
+ )
25
+ end
26
+
27
+ def end_chapter
28
+ return unless @chapter
29
+ return unless @iterator == :chapter
30
+ return if @iterate_book_id && @iterate_book_id != @book_id
31
+ @block.call(
32
+ num: @chapter,
33
+ book_id: @book_id,
34
+ book_num: @book_num,
35
+ book_title: @book_title
36
+ )
37
+ end
38
+
39
+ def end_verse
40
+ @mode = nil
41
+ return unless @iterator == :verse
42
+ return if @iterate_book_id && @iterate_book_id != @book_id
43
+ return if @iterate_chapter_num && @iterate_chapter_num != @chapter
44
+ @block.call(
45
+ num: @verse,
46
+ book_id: @book_id,
47
+ book_num: @book_num,
48
+ book_title: @book_title,
49
+ chapter_num: @chapter,
50
+ text: @text
51
+ )
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,68 @@
1
+ require 'nokogiri'
2
+
3
+ class BibleParser
4
+ module Parsers
5
+ module Base
6
+ class Parser
7
+ def initialize(io)
8
+ @io = io
9
+ end
10
+
11
+ def valid?
12
+ fail NotImplementedError, "override #valid? in your Parser class"
13
+ end
14
+
15
+ def document_class
16
+ module_name = self.class.name.sub(/::Parser$/, '')
17
+ Kernel.const_get("#{module_name}::Document")
18
+ end
19
+
20
+ def each_book
21
+ @io.rewind
22
+ document = document_class.new(io: @io, iterator: :book) do |book|
23
+ yield Book.new(
24
+ num: book[:num],
25
+ id: book[:id],
26
+ title: book[:title],
27
+ parser: self
28
+ )
29
+ end
30
+ sax_parser = Nokogiri::XML::SAX::Parser.new(document)
31
+ sax_parser.parse(@io)
32
+ end
33
+
34
+ def each_chapter(book_id: nil, &block)
35
+ @io.rewind
36
+ document = document_class.new(io: @io, iterator: :chapter, iterate_book_id: book_id) do |chapter|
37
+ yield Chapter.new(
38
+ num: chapter[:num],
39
+ book_id: chapter[:book_id],
40
+ book_num: chapter[:book_num],
41
+ book_title: chapter[:book_title],
42
+ parser: self
43
+ )
44
+ end
45
+ sax_parser = Nokogiri::XML::SAX::Parser.new(document)
46
+ sax_parser.parse(@io)
47
+ end
48
+
49
+ def each_verse(book_id: nil, chapter_num: nil, &block)
50
+ @io.rewind
51
+ document = document_class.new(io: @io, iterator: :verse, iterate_book_id: book_id, iterate_chapter_num: chapter_num) do |verse|
52
+ yield Verse.new(
53
+ num: verse[:num],
54
+ text: verse[:text],
55
+ book_id: verse[:book_id],
56
+ book_num: verse[:book_num],
57
+ book_title: verse[:book_title],
58
+ chapter_num: verse[:chapter_num],
59
+ parser: self
60
+ )
61
+ end
62
+ sax_parser = Nokogiri::XML::SAX::Parser.new(document)
63
+ sax_parser.parse(@io)
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,2 @@
1
+ require_relative 'osis/parser'
2
+ require_relative 'osis/document'
@@ -0,0 +1,94 @@
1
+ class BibleParser
2
+ module Parsers
3
+ module OSIS
4
+ module BookIDs
5
+ BOOK_IDS = {
6
+ 'Gen' => 'GEN',
7
+ 'Exod' => 'EXO',
8
+ 'Lev' => 'LEV',
9
+ 'Num' => 'NUM',
10
+ 'Deut' => 'DEU',
11
+ 'Josh' => 'JOS',
12
+ 'Judg' => 'JDG',
13
+ 'Ruth' => 'RUT',
14
+ '1Sam' => '1SA',
15
+ '2Sam' => '2SA',
16
+ '1Kgs' => '1KI',
17
+ '2Kgs' => '2KI',
18
+ '1Chr' => '1CH',
19
+ '2Chr' => '2CH',
20
+ 'Ezra' => 'EZR',
21
+ 'Neh' => 'NEH',
22
+ 'Esth' => 'EST',
23
+ 'Job' => 'JOB',
24
+ 'Ps' => 'PSA',
25
+ 'Prov' => 'PRO',
26
+ 'Eccl' => 'ECC',
27
+ 'Song' => 'SNG',
28
+ 'Isa' => 'ISA',
29
+ 'Jer' => 'JER',
30
+ 'Lam' => 'LAM',
31
+ 'Ezek' => 'EZK',
32
+ 'Dan' => 'DAN',
33
+ 'Hos' => 'HOS',
34
+ 'Joel' => 'JOL',
35
+ 'Amos' => 'AMO',
36
+ 'Obad' => 'OBA',
37
+ 'Jonah' => 'JON',
38
+ 'Mic' => 'MIC',
39
+ 'Nah' => 'NAM',
40
+ 'Hab' => 'HAB',
41
+ 'Zeph' => 'ZEP',
42
+ 'Hag' => 'HAG',
43
+ 'Zech' => 'ZEC',
44
+ 'Mal' => 'MAL',
45
+ 'Tob' => 'TOB',
46
+ 'Jdt' => 'JDT',
47
+ 'EsthGr' => 'ESG',
48
+ 'Wis' => 'WIS',
49
+ 'Sir' => 'SIR',
50
+ 'Bar' => 'BAR',
51
+ 'EpJer' => 'LJE',
52
+ 'PrAzar' => 'S3Y',
53
+ 'Sus' => 'SUS',
54
+ 'Bel' => 'BEL',
55
+ '1Macc' => '1MA',
56
+ '2Macc' => '2MA',
57
+ '3Macc' => '3MA',
58
+ '4Macc' => '4MA',
59
+ '1Esd' => '1ES',
60
+ '2Esd' => '2ES',
61
+ 'PrMan' => 'MAN',
62
+ '2Esd' => 'PS2',
63
+ 'Matt' => 'MAT',
64
+ 'Mark' => 'MRK',
65
+ 'Luke' => 'LUK',
66
+ 'John' => 'JHN',
67
+ 'Acts' => 'ACT',
68
+ 'Rom' => 'ROM',
69
+ '1Cor' => '1CO',
70
+ '2Cor' => '2CO',
71
+ 'Gal' => 'GAL',
72
+ 'Eph' => 'EPH',
73
+ 'Phil' => 'PHP',
74
+ 'Col' => 'COL',
75
+ '1Thess' => '1TH',
76
+ '2Thess' => '2TH',
77
+ '1Tim' => '1TI',
78
+ '2Tim' => '2TI',
79
+ 'Titus' => 'TIT',
80
+ 'Phlm' => 'PHM',
81
+ 'Heb' => 'HEB',
82
+ 'Jas' => 'JAS',
83
+ '1Pet' => '1PE',
84
+ '2Pet' => '2PE',
85
+ '1John' => '1JN',
86
+ '2John' => '2JN',
87
+ '3John' => '3JN',
88
+ 'Jude' => 'JUD',
89
+ 'Rev' => 'REV'
90
+ }
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,81 @@
1
+ require_relative 'book_ids'
2
+
3
+ class BibleParser
4
+ module Parsers
5
+ module OSIS
6
+ class Document < Base::Document
7
+ include BookIDs
8
+
9
+ def start_element(name, attributes)
10
+ case name
11
+ when 'div'
12
+ end_verse if @mode == 'verse'
13
+ start_book(attributes)
14
+ when 'title'
15
+ set_book_title(attributes)
16
+ when 'chapter'
17
+ end_verse if @mode == 'verse'
18
+ start_chapter(attributes)
19
+ when 'verse'
20
+ end_verse if @mode == 'verse'
21
+ start_verse(attributes)
22
+ end
23
+ end
24
+
25
+ def end_element(name)
26
+ case name
27
+ when 'div'
28
+ if @book_id
29
+ end_book
30
+ @book_id = nil
31
+ end
32
+ end
33
+ end
34
+
35
+ def start_book(attributes)
36
+ attributes = Hash[attributes]
37
+ return unless attributes['type'] == 'book'
38
+ id = attributes['osisID']
39
+ @book_num += 1
40
+ @book_id = BOOK_IDS[id] || id.upcase[0..2]
41
+ @mode = 'book'
42
+ @book_title = nil
43
+ end
44
+
45
+ def set_book_title(attributes)
46
+ attributes = Hash[attributes]
47
+ return unless attributes['type'] == 'main'
48
+ @book_title = attributes['short']
49
+ end
50
+
51
+ def end_book_title
52
+ @mode = nil
53
+ end
54
+
55
+ def start_chapter(attributes)
56
+ attributes = Hash[attributes]
57
+ if attributes['sID']
58
+ @chapter = attributes['n'].to_i
59
+ else
60
+ end_chapter
61
+ end
62
+ end
63
+
64
+ def start_verse(attributes)
65
+ attributes = Hash[attributes]
66
+ return unless attributes['sID']
67
+ @verse = attributes['n'].to_i
68
+ @text = ''
69
+ @mode = 'verse'
70
+ end
71
+
72
+ def characters(string)
73
+ case @mode
74
+ when 'verse'
75
+ @text << string
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,13 @@
1
+ class BibleParser
2
+ module Parsers
3
+ module OSIS
4
+ class Parser < Base::Parser
5
+ def valid?
6
+ (@io.read(1024) =~ /<osis.*>/i).tap do
7
+ @io.rewind
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,2 @@
1
+ require_relative 'usfx/parser'
2
+ require_relative 'usfx/document'
@@ -0,0 +1,90 @@
1
+ require 'nokogiri'
2
+
3
+ class BibleParser
4
+ module Parsers
5
+ module USFX
6
+ class Document < Base::Document
7
+ # list of book ids that should be skipped
8
+ IGNORE_BOOK_IDS = %w(FRT)
9
+
10
+ def start_element(name, attributes)
11
+ case name
12
+ when 'book'
13
+ start_book(attributes)
14
+ when 'h'
15
+ start_book_title(attributes)
16
+ when 'c'
17
+ start_chapter(attributes)
18
+ when 'v'
19
+ end_verse if @mode == 'verse'
20
+ start_verse(attributes)
21
+ when 've'
22
+ end_verse
23
+ when 'f', 'x'
24
+ start_footnote(attributes)
25
+ end
26
+ end
27
+
28
+ def end_element(name)
29
+ case name
30
+ when 'book'
31
+ end_book
32
+ end_verse if @mode == 'verse'
33
+ when 'c'
34
+ end_chapter
35
+ end_verse if @mode == 'verse'
36
+ when 'h'
37
+ end_book_title
38
+ when 'f', 'x'
39
+ end_footnote
40
+ end
41
+ end
42
+
43
+ def start_book(attributes)
44
+ id = Hash[attributes]['id']
45
+ return if IGNORE_BOOK_IDS.include?(id)
46
+ @book_num += 1
47
+ @book_id = id
48
+ @mode = 'book'
49
+ @book_title = ''
50
+ end
51
+
52
+ def start_book_title(_attributes)
53
+ @mode = 'book-title' if @mode == 'book'
54
+ end
55
+
56
+ def end_book_title
57
+ @book_title.strip! if @book_title
58
+ @mode = nil
59
+ end
60
+
61
+ def start_chapter(attributes)
62
+ @chapter = Hash[attributes]['id'].to_i
63
+ end
64
+
65
+ def start_verse(attributes)
66
+ @verse = Hash[attributes]['id'].to_i
67
+ @text = ''
68
+ @mode = 'verse'
69
+ end
70
+
71
+ def start_footnote(_attributes)
72
+ @mode = "footnote|#{@mode}"
73
+ end
74
+
75
+ def end_footnote
76
+ @mode = @mode.split('|').last
77
+ end
78
+
79
+ def characters(string)
80
+ case @mode
81
+ when 'book-title'
82
+ @book_title << string.gsub(/\n/, '')
83
+ when 'verse'
84
+ @text << string
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,13 @@
1
+ class BibleParser
2
+ module Parsers
3
+ module USFX
4
+ class Parser < Base::Parser
5
+ def valid?
6
+ (@io.read(1024) =~ /<usfx.*>/i).tap do
7
+ @io.rewind
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,54 @@
1
+ class BibleParser
2
+ class Verse
3
+ attr_reader :num, :book_id, :book_num, :book_title, :chapter_num, :text
4
+
5
+ def initialize(num:, book_id:, book_num:, book_title:, chapter_num:, text:, parser:)
6
+ @num = num
7
+ @book_id = book_id
8
+ @book_num = book_num
9
+ @book_title = book_title
10
+ @chapter_num = chapter_num
11
+ @text = text
12
+ @parser = parser
13
+ end
14
+
15
+ def inspect
16
+ "<#{to_s}>"
17
+ end
18
+
19
+ def to_s
20
+ "#{book_title} #{chapter_num}:#{num}"
21
+ end
22
+
23
+
24
+ def book
25
+ Book.new(
26
+ id: book_id,
27
+ num: book_num,
28
+ title: book_title,
29
+ parser: @parser
30
+ )
31
+ end
32
+
33
+ def chapter
34
+ Chapter.new(
35
+ book_id: book_id,
36
+ book_num: book_num,
37
+ book_title: book_title,
38
+ num: chapter_num,
39
+ parser: @parser
40
+ )
41
+ end
42
+
43
+ def to_h
44
+ {
45
+ num: num,
46
+ book_id: book_id,
47
+ book_num: book_num,
48
+ book_title: book_title,
49
+ chapter_num: chapter_num,
50
+ text: text
51
+ }
52
+ end
53
+ end
54
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bible_parser
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Tim Morgan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-05-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.6.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 1.6.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 3.2.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 3.2.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description:
56
+ email: tim@timmorgan.org
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - README.md
62
+ - lib/bible_parser.rb
63
+ - lib/bible_parser/book.rb
64
+ - lib/bible_parser/chapter.rb
65
+ - lib/bible_parser/errors.rb
66
+ - lib/bible_parser/parsers.rb
67
+ - lib/bible_parser/parsers/base.rb
68
+ - lib/bible_parser/parsers/base/document.rb
69
+ - lib/bible_parser/parsers/base/parser.rb
70
+ - lib/bible_parser/parsers/osis.rb
71
+ - lib/bible_parser/parsers/osis/book_ids.rb
72
+ - lib/bible_parser/parsers/osis/document.rb
73
+ - lib/bible_parser/parsers/osis/parser.rb
74
+ - lib/bible_parser/parsers/usfx.rb
75
+ - lib/bible_parser/parsers/usfx/document.rb
76
+ - lib/bible_parser/parsers/usfx/parser.rb
77
+ - lib/bible_parser/verse.rb
78
+ homepage: https://github.com/seven1m/bible_parser
79
+ licenses: []
80
+ metadata: {}
81
+ post_install_message:
82
+ rdoc_options: []
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ requirements: []
96
+ rubyforge_project:
97
+ rubygems_version: 2.4.3
98
+ signing_key:
99
+ specification_version: 4
100
+ summary: Library for parsing the bible in various formats
101
+ test_files: []