bible_ref 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|