bible_ref_parser 0.3.0 → 0.4.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 +4 -4
- data/.standard.yml +1 -1
- data/lib/bible_ref_parser/bible_reference.rb +15 -9
- data/lib/bible_ref_parser/parser.rb +7 -5
- data/lib/bible_ref_parser/reference_node.rb +79 -31
- data/lib/bible_ref_parser/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8881964f74bd9d7be1e27232326be473469e457a5fbe8c9a5d234e668198e717
|
|
4
|
+
data.tar.gz: 9681a524b8b4f0936b4956aed6ba2918b00c66528cf5f7cb4393ddd13d7d5bfc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4a560d88938857aa86f7c2b6a981e42b7c09e23ac101d2a1e058f91fb7713c817a1e0f4a8dcf28f8e271a4115cbad83a60be820ed6d71f8e36da9a4c26af28f7
|
|
7
|
+
data.tar.gz: c96e8ecbd32d8c51529512641283ca8485871e8810cae044589f8bdbe40f6b0bea3016b4247c1a33c9d59530be0c1b1158fe243b36bf6bb30b0f0f7d8ec104e1
|
data/.standard.yml
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
module BibleRefParser
|
|
2
|
-
BibleReference = Data.define(:text, :start_offset, :end_offset, :book_name, :_parts) do
|
|
3
|
-
def initialize(text:, start_offset:, end_offset:, book_name: nil, parts: [])
|
|
4
|
-
super(
|
|
5
|
-
text: text, start_offset: start_offset, end_offset: end_offset,
|
|
6
|
-
book_name: book_name, _parts: parts.freeze
|
|
7
|
-
)
|
|
2
|
+
BibleReference = Data.define(:text, :start_offset, :end_offset, :book_name, :chapter, :_parts) do
|
|
3
|
+
def initialize(text:, start_offset:, end_offset:, book_name: nil, chapter: nil, parts: [])
|
|
4
|
+
super(text:, start_offset:, end_offset:, book_name:, chapter:, _parts: parts.freeze)
|
|
8
5
|
end
|
|
9
6
|
|
|
10
7
|
def parts
|
|
@@ -15,11 +12,20 @@ module BibleRefParser
|
|
|
15
12
|
parts.size > 1
|
|
16
13
|
end
|
|
17
14
|
|
|
15
|
+
def same_chapter?
|
|
16
|
+
return false unless compound?
|
|
17
|
+
|
|
18
|
+
chapters = parts.map(&:chapter)
|
|
19
|
+
!chapters.first.nil? && chapters.uniq.size == 1
|
|
20
|
+
end
|
|
21
|
+
|
|
18
22
|
def qualified_text
|
|
19
|
-
|
|
20
|
-
|
|
23
|
+
return text unless book_name && !text.start_with?(book_name)
|
|
24
|
+
|
|
25
|
+
if chapter && !text.match?(/\A\d+:/)
|
|
26
|
+
"#{book_name} #{chapter}:#{text}"
|
|
21
27
|
else
|
|
22
|
-
text
|
|
28
|
+
"#{book_name} #{text}"
|
|
23
29
|
end
|
|
24
30
|
end
|
|
25
31
|
|
|
@@ -79,12 +79,14 @@ module BibleRefParser
|
|
|
79
79
|
(reference_int >> colon.absent?).as(:verse)
|
|
80
80
|
end
|
|
81
81
|
|
|
82
|
-
rule(:
|
|
83
|
-
|
|
82
|
+
rule(:verse_specifier) { verse_range | standalone_verse }
|
|
83
|
+
|
|
84
|
+
rule(:verse_specifier_list) do
|
|
85
|
+
(verse_specifier >> (list_sep >> verse_specifier).repeat(1)).as(:verse_specifier_list)
|
|
84
86
|
end
|
|
85
87
|
|
|
86
|
-
rule(:
|
|
87
|
-
(chapter >> colon >>
|
|
88
|
+
rule(:chapter_with_mixed_verses) do
|
|
89
|
+
(chapter >> colon >> verse_specifier_list).as(:chapter_with_mixed_verses)
|
|
88
90
|
end
|
|
89
91
|
|
|
90
92
|
rule(:chapter_with_verse_range) do
|
|
@@ -92,7 +94,7 @@ module BibleRefParser
|
|
|
92
94
|
end
|
|
93
95
|
|
|
94
96
|
rule(:chapter_with_verses) do
|
|
95
|
-
|
|
97
|
+
chapter_with_mixed_verses | chapter_with_verse_range
|
|
96
98
|
end
|
|
97
99
|
|
|
98
100
|
rule(:indicator) do
|
|
@@ -8,28 +8,16 @@ module BibleRefParser
|
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
def book_name
|
|
11
|
-
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
# The first Parslet::Slice in the entire reference structure
|
|
15
|
-
def first_slice
|
|
16
|
-
leaf_first(@ref_hash)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
# The last Parslet::Slice in the entire reference structure
|
|
20
|
-
def last_slice
|
|
21
|
-
leaf_last(@ref_hash)
|
|
11
|
+
book&.to_s
|
|
22
12
|
end
|
|
23
13
|
|
|
24
14
|
# Character range covered by this reference in the original text
|
|
25
15
|
def position
|
|
26
|
-
book
|
|
27
|
-
last = last_slice
|
|
28
|
-
book.offset...(last.offset + last.size)
|
|
16
|
+
book.offset...end_offset(indicators.last)
|
|
29
17
|
end
|
|
30
18
|
|
|
31
19
|
def compound?
|
|
32
|
-
|
|
20
|
+
multiple_indicators? || one_chapter_verse_list?
|
|
33
21
|
end
|
|
34
22
|
|
|
35
23
|
def to_bible_reference(text)
|
|
@@ -44,6 +32,10 @@ module BibleRefParser
|
|
|
44
32
|
|
|
45
33
|
private
|
|
46
34
|
|
|
35
|
+
def book
|
|
36
|
+
@ref_hash[:book]
|
|
37
|
+
end
|
|
38
|
+
|
|
47
39
|
def indicators
|
|
48
40
|
@ref_hash[:indicator_list]
|
|
49
41
|
end
|
|
@@ -51,35 +43,91 @@ module BibleRefParser
|
|
|
51
43
|
def extract_parts(text)
|
|
52
44
|
return [] unless compound?
|
|
53
45
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
46
|
+
if one_chapter_verse_list?
|
|
47
|
+
extract_verse_list_parts(text)
|
|
48
|
+
else
|
|
49
|
+
extract_parts_per_indicator(text)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def multiple_indicators?
|
|
54
|
+
indicators in [_, _, *]
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def one_chapter_verse_list?
|
|
58
|
+
indicators in [{chapter_with_mixed_verses: {verse_specifier_list: [_, _, *]}}]
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def extract_parts_per_indicator(text)
|
|
62
|
+
indicators.flat_map.with_index do |indicator, idx|
|
|
63
|
+
if indicator in {chapter_with_mixed_verses: {chapter: chapter_slice, verse_specifier_list: specifiers}}
|
|
64
|
+
first_start = (idx == 0) ? book.offset : chapter_slice.offset
|
|
65
|
+
extract_mixed_verse_parts(text, chapter_slice, specifiers, first_part_start: first_start)
|
|
66
|
+
else
|
|
67
|
+
end_pos = end_offset(indicator)
|
|
68
|
+
start_pos = (idx == 0) ? book.offset : start_offset(indicator)
|
|
69
|
+
|
|
70
|
+
BibleReference.new(
|
|
71
|
+
text: text[start_pos...end_pos],
|
|
72
|
+
start_offset: start_pos,
|
|
73
|
+
end_offset: end_pos,
|
|
74
|
+
book_name: book_name
|
|
75
|
+
)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def extract_verse_list_parts(text)
|
|
81
|
+
indicators => [{chapter_with_mixed_verses: {chapter: chapter_slice, verse_specifier_list: specifiers}}]
|
|
82
|
+
extract_mixed_verse_parts(text, chapter_slice, specifiers, first_part_start: book.offset)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def extract_mixed_verse_parts(text, chapter_slice, specifiers, first_part_start:)
|
|
86
|
+
specifiers.each_with_index.map do |spec, idx|
|
|
87
|
+
case spec
|
|
88
|
+
in {verse_range: {start: {verse: start_verse}, end: {verse: end_verse}}}
|
|
89
|
+
end_pos = end_verse.offset + end_verse.size
|
|
90
|
+
start_pos = (idx == 0) ? first_part_start : start_verse.offset
|
|
91
|
+
in {verse: verse_slice}
|
|
92
|
+
end_pos = verse_slice.offset + verse_slice.size
|
|
93
|
+
start_pos = (idx == 0) ? first_part_start : verse_slice.offset
|
|
94
|
+
end
|
|
59
95
|
|
|
60
96
|
BibleReference.new(
|
|
61
97
|
text: text[start_pos...end_pos],
|
|
62
98
|
start_offset: start_pos,
|
|
63
99
|
end_offset: end_pos,
|
|
64
|
-
book_name: book_name
|
|
100
|
+
book_name: book_name,
|
|
101
|
+
chapter: chapter_slice.to_s
|
|
65
102
|
)
|
|
66
103
|
end
|
|
67
104
|
end
|
|
68
105
|
|
|
69
|
-
def
|
|
70
|
-
case
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
106
|
+
def start_offset(indicator)
|
|
107
|
+
case indicator
|
|
108
|
+
in {chapter: first_slice}
|
|
109
|
+
in {explicit_verse: {chapter: first_slice}}
|
|
110
|
+
in {chapter_range: {start: {chapter: first_slice}}}
|
|
111
|
+
in {chapter_with_verse_range: {chapter: first_slice}}
|
|
112
|
+
in {chapter_with_mixed_verses: {chapter: first_slice}}
|
|
113
|
+
in {explicit_verse_range: {start: {explicit_verse: {chapter: first_slice}}}}
|
|
74
114
|
end
|
|
115
|
+
|
|
116
|
+
first_slice.offset
|
|
75
117
|
end
|
|
76
118
|
|
|
77
|
-
def
|
|
78
|
-
case
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
119
|
+
def end_offset(indicator)
|
|
120
|
+
case indicator
|
|
121
|
+
in {chapter: last_slice}
|
|
122
|
+
in {explicit_verse: {verse: last_slice}}
|
|
123
|
+
in {chapter_range: {end: {chapter: last_slice}}}
|
|
124
|
+
in {chapter_with_verse_range: {verse_range: {end: {verse: last_slice}}}}
|
|
125
|
+
in {chapter_with_mixed_verses: {verse_specifier_list: [*, {verse: last_slice}]}}
|
|
126
|
+
in {chapter_with_mixed_verses: {verse_specifier_list: [*, {verse_range: {end: {verse: last_slice}}}]}}
|
|
127
|
+
in {explicit_verse_range: {end: {explicit_verse: {verse: last_slice}}}}
|
|
82
128
|
end
|
|
129
|
+
|
|
130
|
+
last_slice.offset + last_slice.size
|
|
83
131
|
end
|
|
84
132
|
end
|
|
85
133
|
end
|