bible_ref 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +29 -0
- data/lib/bible_ref/book.rb +118 -0
- data/lib/bible_ref/parser.rb +39 -0
- data/lib/bible_ref/reference.rb +61 -0
- data/lib/bible_ref/version.rb +3 -0
- data/lib/bible_ref.rb +1 -0
- metadata +78 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: dea4f491ea3eb6ab3423ef43ffb28bfbf476c90c
|
4
|
+
data.tar.gz: 99173e007d6f7525a4e33bdd31539ac0752bcb02
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 935df69f67503f12b49b4d9e86db595d4bbc14509f82de795c2a03209d4231f2c92a5bd1145b0bedc954d7a40aef7a1fadbf22e780db6cf7314a04fea5f92156
|
7
|
+
data.tar.gz: 58c8b85919fad6da9072b2a1da22d402513a0888057285c321c51229f18e7d3067e4dfd806554e79dab8233b4b43c268f3064028a7ddddb614cf0b0f53e17ea0
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# BibleRef
|
2
|
+
|
3
|
+
Turn "John 3:16" into:
|
4
|
+
|
5
|
+
```ruby
|
6
|
+
[
|
7
|
+
[{ book: 'JHN', chapter: 3, verse: 16 },
|
8
|
+
{ book: 'JHN', chapter: 3, verse: 16 }]
|
9
|
+
]
|
10
|
+
```
|
11
|
+
|
12
|
+
...and turn "Romans 12:1,3-4 & 13:2-4,7-8" into:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
[
|
16
|
+
[{ book: 'ROM', chapter: 12, verse: 1 },
|
17
|
+
{ book: 'ROM', chapter: 12, verse: 1 }],
|
18
|
+
[{ book: 'ROM', chapter: 12, verse: 3 },
|
19
|
+
{ book: 'ROM', chapter: 12, verse: 4 }],
|
20
|
+
[{ book: 'ROM', chapter: 13, verse: 2 },
|
21
|
+
{ book: 'ROM', chapter: 13, verse: 4 }],
|
22
|
+
[{ book: 'ROM', chapter: 13, verse: 7 },
|
23
|
+
{ book: 'ROM', chapter: 13, verse: 8 }]
|
24
|
+
]
|
25
|
+
```
|
26
|
+
|
27
|
+
## Copyright
|
28
|
+
|
29
|
+
Copyright [Tim Morgan](http://timmorgan.org). See LICENSE.
|
@@ -0,0 +1,118 @@
|
|
1
|
+
module BibleRef
|
2
|
+
|
3
|
+
class UnknownCanon < StandardError; end
|
4
|
+
|
5
|
+
class Book
|
6
|
+
|
7
|
+
CANONS = {
|
8
|
+
protestant: %w(
|
9
|
+
GEN EXO LEV NUM DEU JOS JDG RUT 1SA 2SA 1KI 2KI 1CH 2CH EZR NEH EST JOB PSA PRO ECC SNG ISA JER LAM EZK DAN HOS JOL AMO OBA JON MIC NAM HAB ZEP HAG ZEC MAL
|
10
|
+
MAT MRK LUK JHN ACT ROM 1CO 2CO GAL EPH PHP COL 1TH 2TH 1TI 2TI TIT PHM HEB JAS 1PE 2PE 1JN 2JN 3JN JUD REV
|
11
|
+
)
|
12
|
+
}
|
13
|
+
|
14
|
+
BOOKS = {
|
15
|
+
'GEN' => /^gen/,
|
16
|
+
'EXO' => /^ex/,
|
17
|
+
'LEV' => /^le?v/,
|
18
|
+
'NUM' => /^nu/,
|
19
|
+
'DEU' => /^de?ut/,
|
20
|
+
'JOS' => /^jos/,
|
21
|
+
'JDG' => /^ju?dg/,
|
22
|
+
'RUT' => /^ru/,
|
23
|
+
'1SA' => /^1 sa?m/,
|
24
|
+
'2SA' => /^2 sa?m/,
|
25
|
+
'1KI' => /^1 (king|kgs)/,
|
26
|
+
'2KI' => /^2 (king|kgs)/,
|
27
|
+
'1CH' => /^1 chr/,
|
28
|
+
'2CH' => /^2 chr/,
|
29
|
+
'EZR' => /^ez/,
|
30
|
+
'NEH' => /^ne/,
|
31
|
+
'EST' => /^est/,
|
32
|
+
'JOB' => /^jo?b/,
|
33
|
+
'PSA' => /^ps/,
|
34
|
+
'PRO' => /^pro?v/,
|
35
|
+
'ECC' => /^ecc/,
|
36
|
+
'SNG' => /^so?ng|^sol|^sg$/,
|
37
|
+
'ISA' => /^isa/,
|
38
|
+
'JER' => /^jer/,
|
39
|
+
'LAM' => /^lam/,
|
40
|
+
'EZK' => /^ez/,
|
41
|
+
'DAN' => /^dan/,
|
42
|
+
'HOS' => /^hos/,
|
43
|
+
'JOL' => /^joel/,
|
44
|
+
'AMO' => /^amo/,
|
45
|
+
'OBA' => /^ob/,
|
46
|
+
'JON' => /^jona/,
|
47
|
+
'MIC' => /^mi/,
|
48
|
+
'NAM' => /^nah/,
|
49
|
+
'HAB' => /^hab/,
|
50
|
+
'ZEP' => /^zep/,
|
51
|
+
'HAG' => /^hag/,
|
52
|
+
'ZEC' => /^zec/,
|
53
|
+
'MAL' => /^mal/,
|
54
|
+
'TOB' => /^tob/,
|
55
|
+
'JDT' => /^jud/,
|
56
|
+
'ESG' => /^est.*greek/,
|
57
|
+
'WIS' => /^wisdom/,
|
58
|
+
'SIR' => /^sir/,
|
59
|
+
'BAR' => /^bar/,
|
60
|
+
'LJE' => /^jeremy/,
|
61
|
+
'S3Y' => /^3 holy/,
|
62
|
+
'SUS' => /^sus/,
|
63
|
+
'BEL' => /^bel/,
|
64
|
+
'1MA' => /^1 mac/,
|
65
|
+
'2MA' => /^2 mac/,
|
66
|
+
'1ES' => /^1 esd/,
|
67
|
+
'MAN' => /^prayer/,
|
68
|
+
'PS2' => /^psalm 151/,
|
69
|
+
'3MA' => /^3 mac/,
|
70
|
+
'2ES' => /^2 esd/,
|
71
|
+
'4MA' => /^4 mac/,
|
72
|
+
'MAT' => /^mat/,
|
73
|
+
'MRK' => /^ma?rk/,
|
74
|
+
'LUK' => /^lu?k/,
|
75
|
+
'JHN' => /^john|^jn/,
|
76
|
+
'ACT' => /^act/,
|
77
|
+
'ROM' => /^rom/,
|
78
|
+
'1CO' => /^1 cor/,
|
79
|
+
'2CO' => /^2 cor/,
|
80
|
+
'GAL' => /^gal/,
|
81
|
+
'EPH' => /^eph/,
|
82
|
+
'PHP' => /^phil/,
|
83
|
+
'COL' => /^col/,
|
84
|
+
'1TH' => /^1 the?s/,
|
85
|
+
'2TH' => /^2 the?s/,
|
86
|
+
'1TI' => /^1 tim/,
|
87
|
+
'2TI' => /^2 tim/,
|
88
|
+
'TIT' => /^tit/,
|
89
|
+
'PHM' => /^phi?l/,
|
90
|
+
'HEB' => /^heb/,
|
91
|
+
'JAS' => /^jam/,
|
92
|
+
'1PE' => /^1 pet/,
|
93
|
+
'2PE' => /^2 pet/,
|
94
|
+
'1JN' => /^1 jo?h?n/,
|
95
|
+
'2JN' => /^2 jo?h?n/,
|
96
|
+
'3JN' => /^3 jo?h?n/,
|
97
|
+
'JUD' => /^jud/,
|
98
|
+
'REV' => /^re?v/
|
99
|
+
}
|
100
|
+
|
101
|
+
def initialize(book, canon=:protestant)
|
102
|
+
@canon = canon
|
103
|
+
unless CANONS[@canon]
|
104
|
+
raise UnknownCanon.new("#{canon} is not known. Canons this library support are: #{CANONS.join(', ')}")
|
105
|
+
end
|
106
|
+
@book = book
|
107
|
+
end
|
108
|
+
|
109
|
+
def id
|
110
|
+
CANONS[@canon].each do |book|
|
111
|
+
match = BOOKS[book]
|
112
|
+
return book if @book.downcase =~ match
|
113
|
+
end
|
114
|
+
nil
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'parslet'
|
2
|
+
|
3
|
+
module BibleRef
|
4
|
+
class Parser < Parslet::Parser
|
5
|
+
rule(:refs) do
|
6
|
+
(
|
7
|
+
(ref_range | ref) >>
|
8
|
+
(
|
9
|
+
separator >>
|
10
|
+
(ref_range | verse_range | ref | verse)
|
11
|
+
).repeat
|
12
|
+
).as(:refs)
|
13
|
+
end
|
14
|
+
|
15
|
+
rule(:ref_range) { (ref.as(:from) >> str("-") >> (ref | verse).as(:to)).as(:range) }
|
16
|
+
rule(:verse_range) { (verse.as(:from) >> str("-") >> verse.as(:to)).as(:range) }
|
17
|
+
|
18
|
+
rule(:ref) { (chapter >> str(":") >> verse) }
|
19
|
+
|
20
|
+
rule(:chapters) { (chapter >> (match("[-,]") >> chapter).repeat).as(:refs) }
|
21
|
+
rule(:chapter) { num.as(:chapter) }
|
22
|
+
rule(:verse) { num.as(:verse) }
|
23
|
+
|
24
|
+
rule(:word) { (match("[0-9]").maybe >> match("[A-Za-z ]").repeat(1)).as(:word) }
|
25
|
+
rule(:separator) { (str(",") >> space.maybe) | (space.maybe >> str("&") >> space.maybe) }
|
26
|
+
rule(:num) { match("[0-9]").repeat(1).as(:num) }
|
27
|
+
rule(:space) { str(" ").repeat(1) }
|
28
|
+
|
29
|
+
rule(:reference) { word.as(:book) >> space.maybe >> (refs | chapters) }
|
30
|
+
|
31
|
+
root(:reference)
|
32
|
+
end
|
33
|
+
|
34
|
+
class ParserTransform < Parslet::Transform
|
35
|
+
rule(word: simple(:w)) { w.to_s.strip }
|
36
|
+
|
37
|
+
rule(num: simple(:n)) { n.to_i }
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require_relative './book'
|
2
|
+
require_relative './parser'
|
3
|
+
|
4
|
+
module BibleRef
|
5
|
+
class Reference
|
6
|
+
|
7
|
+
attr_reader :book
|
8
|
+
attr_reader :reference
|
9
|
+
|
10
|
+
def initialize(reference)
|
11
|
+
@reference = reference
|
12
|
+
@details = parse
|
13
|
+
end
|
14
|
+
|
15
|
+
def ranges
|
16
|
+
return nil unless valid?
|
17
|
+
@chapter = nil
|
18
|
+
[@details[:refs]].flatten.map do |ref|
|
19
|
+
normalize_range(ref) || normalize_ref(ref)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def book
|
24
|
+
@book ||= Book.new(@details[:book]).id
|
25
|
+
end
|
26
|
+
|
27
|
+
def valid?
|
28
|
+
@details and book
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def parse
|
34
|
+
begin
|
35
|
+
parsed = Parser.new.parse(@reference)
|
36
|
+
rescue Parslet::ParseFailed
|
37
|
+
nil
|
38
|
+
else
|
39
|
+
ParserTransform.new.apply(parsed)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def normalize_range(ref)
|
44
|
+
return unless range = ref[:range]
|
45
|
+
ch = range.detect { |_, r| r[:chapter] }
|
46
|
+
@chapter = ch.last[:chapter] if ch
|
47
|
+
[
|
48
|
+
{ book: @book, chapter: @chapter }.merge(range[:from]),
|
49
|
+
{ book: @book, chapter: @chapter }.merge(range[:to])
|
50
|
+
]
|
51
|
+
end
|
52
|
+
|
53
|
+
def normalize_ref(ref)
|
54
|
+
@chapter = ref[:chapter] if ref[:chapter]
|
55
|
+
(1..2).map do
|
56
|
+
{ book: @book, chapter: @chapter }.merge(ref)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
data/lib/bible_ref.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require_relative 'bible_ref/reference'
|
metadata
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bible_ref
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tim Morgan
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-07-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: parslet
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.6'
|
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'
|
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.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.0'
|
41
|
+
description: Bible reference parser returns normalized sets of ranges, ideal for querying
|
42
|
+
a database or XML data source such as WEB in USFX.
|
43
|
+
email: tim@timmorgan.org
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- README.md
|
49
|
+
- lib/bible_ref.rb
|
50
|
+
- lib/bible_ref/book.rb
|
51
|
+
- lib/bible_ref/parser.rb
|
52
|
+
- lib/bible_ref/reference.rb
|
53
|
+
- lib/bible_ref/version.rb
|
54
|
+
homepage: https://github.com/seven1m/bible_ref
|
55
|
+
licenses:
|
56
|
+
- MIT
|
57
|
+
metadata: {}
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options: []
|
60
|
+
require_paths:
|
61
|
+
- lib
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
requirements: []
|
73
|
+
rubyforge_project:
|
74
|
+
rubygems_version: 2.2.2
|
75
|
+
signing_key:
|
76
|
+
specification_version: 4
|
77
|
+
summary: Bible reference parser
|
78
|
+
test_files: []
|