diff --git a/lib/pericope/parsing.rb b/lib/pericope/parsing.rb index 5ccf358..d2792c4 100644 --- a/lib/pericope/parsing.rb +++ b/lib/pericope/parsing.rb @@ -80,7 +80,8 @@ def match_all(text) end def parse_reference(book, reference) - parse_ranges(book, normalize_reference(reference).split(/[,;]/)) + # Use positive lookahead to keep delimiter with the fragment that follows + parse_ranges(book, normalize_reference(reference).split(/(?=[,;])/)) end def normalize_reference(reference) @@ -93,8 +94,12 @@ def parse_ranges(book, ranges) default_verse = nil ranges.map do |range| + range_delimiter, range = range[0], range[1..-1] if range =~ /^[,;]/ range_begin_string, range_end_string = range.split("-") + # semicolon is used between chapters, even if it doesn't otherwise look it, e.g., Psalm 1; 3 + default_chapter = default_verse = nil if range_delimiter == ";" && book_has_chapters?(book) + # treat 12:4 as 12:4-12:4 range_end_string ||= range_begin_string diff --git a/test/pericope_test.rb b/test/pericope_test.rb index b30adb6..d16677e 100644 --- a/test/pericope_test.rb +++ b/test/pericope_test.rb @@ -145,6 +145,10 @@ def setup assert_equal [r(1001001, 1001031)], Pericope.parse_reference(1, "1") # Genesis 1 end + should "parse multiple chapters into ranges of verses in that chapter" do + assert_equal [r(1001001, 1001031), r(1003001, 1003024)], Pericope.parse_reference(1, "1; 3") # Genesis 1; 3 + end + should "parse multiple ranges into an array of ranges" do expected_ranges = [ r(40003001), @@ -155,7 +159,7 @@ def setup tests = [ "3:1,3,4-5,7; 4:19", - "3:1, 3 ,4-5; 7,4:19" + "3:1, 3 ,4-5, 7;4:19" ] tests.each do |input|