Skip to content

Commit

Permalink
Fix parsing of certain mix of chapters and verses
Browse files Browse the repository at this point in the history
  • Loading branch information
seven1m committed May 24, 2017
1 parent 833de4a commit 8c8e4d9
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 5 deletions.
18 changes: 13 additions & 5 deletions lib/bible_ref/parser.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,22 @@ module BibleRef
class Parser < Parslet::Parser
rule(:refs) do
(
(ref_range | ref) >>
(
separator >>
(ref_range | verse_range | ref | verse)
).repeat
chapter_range | chapter_and_verse_range
).as(:refs)
end

rule(:chapter_range) do
chapter >> (separator >> chapter).repeat
end

rule(:chapter_and_verse_range) do
(ref_range | ref | chapter) >>
(
separator >>
(ref_range | verse_range | ref | verse)
).repeat
end

rule(:ref_range) { (ref.as(:from) >> str("-") >> (ref | verse).as(:to)).as(:range) }
rule(:verse_range) { (verse.as(:from) >> str("-") >> verse.as(:to)).as(:range) }

Expand Down
21 changes: 21 additions & 0 deletions spec/bible_ref/parser_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,27 @@ def parse(str)
)
end

it 'parses mix of chapter and chapter+verse range' do
expect(parse('Psalms 138,139:1-17,18-23')).to eq(
book: 'Psalms',
refs: [
{ chapter: 138 },
{
range: {
from: { chapter: 139, verse: 1 },
to: { verse: 17 }
}
},
{
range: {
from: { verse: 18 },
to: { verse: 23 }
}
}
]
)
end

it 'parses a whole chapter' do
expect(parse('Romans 12')).to eq(
book: 'Romans',
Expand Down

0 comments on commit 8c8e4d9

Please sign in to comment.