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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 785c346d7af39dc9c8f2eee1088d443fb78ff980c33572bd27c28610ba364b04
4
- data.tar.gz: 87fcbaa84fb663b042352e4f78339a940922b673a62a76dd0bca0af68ca07d36
3
+ metadata.gz: 8881964f74bd9d7be1e27232326be473469e457a5fbe8c9a5d234e668198e717
4
+ data.tar.gz: 9681a524b8b4f0936b4956aed6ba2918b00c66528cf5f7cb4393ddd13d7d5bfc
5
5
  SHA512:
6
- metadata.gz: a7d0e3c59c1af88185012447a6f7db2e2feb13a351fa3b524bf3cdac98c4c5dbdb387bd1a467d6b08140c4bc8ea7a241331e2c0955c8ed0e18bc19a12d8526fc
7
- data.tar.gz: 79230b5b2b8a4b3bf1f2626089a3bc776552f92ca1f6ea5ec05d2364e2de1b976f5177f8ab37fef85c85212895f4e1d1a3321ad71c9820f157489f2b7f518c9c
6
+ metadata.gz: 4a560d88938857aa86f7c2b6a981e42b7c09e23ac101d2a1e058f91fb7713c817a1e0f4a8dcf28f8e271a4115cbad83a60be820ed6d71f8e36da9a4c26af28f7
7
+ data.tar.gz: c96e8ecbd32d8c51529512641283ca8485871e8810cae044589f8bdbe40f6b0bea3016b4247c1a33c9d59530be0c1b1158fe243b36bf6bb30b0f0f7d8ec104e1
data/.standard.yml CHANGED
@@ -1,4 +1,4 @@
1
- ruby_version: 2.7
1
+ ruby_version: 3.1
2
2
  ignore:
3
3
  - "bin/**/*"
4
4
  - "db/**/*"
@@ -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
- if book_name && !text.start_with?(book_name)
20
- "#{book_name} #{text}"
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(:verse_list) do
83
- (verse >> (list_sep >> standalone_verse).repeat(1)).as(:verse_list)
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(:chapter_with_verse_list) do
87
- (chapter >> colon >> verse_list).as(:chapter_with_verse_list)
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
- chapter_with_verse_list | chapter_with_verse_range
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
- @ref_hash[:book]&.to_s
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 = @ref_hash[: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
- indicators.is_a?(Array) && indicators.size > 1
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
- indicators.each_with_index.map do |indicator, idx|
55
- first = leaf_first(indicator)
56
- last = leaf_last(indicator)
57
- end_pos = last.offset + last.size
58
- start_pos = (idx == 0) ? @ref_hash[:book].offset : first.offset
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 leaf_first(node)
70
- case node
71
- when Hash then leaf_first(node.values.first)
72
- when Array then leaf_first(node.first)
73
- else node
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 leaf_last(node)
78
- case node
79
- when Hash then leaf_last(node.values.last)
80
- when Array then leaf_last(node.last)
81
- else node
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BibleRefParser
4
- VERSION = "0.3.0"
4
+ VERSION = "0.4.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bible_ref_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fabio Papa