bible_ref 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,3 @@
1
+ module BibleRef
2
+ VERSION = '0.1.0'
3
+ 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: []