Skip to content
This repository was archived by the owner on Oct 4, 2020. It is now read-only.

Commit 3b7f5a3

Browse files
committed
Parser support for Schedules
1 parent 6075a8a commit 3b7f5a3

File tree

4 files changed

+83
-3
lines changed

4 files changed

+83
-3
lines changed

Guardfile

+1
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ guard :rspec do
55
watch(%r{^spec/.+_spec\.rb$})
66
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
77
watch('spec/spec_helper.rb') { "spec" }
8+
watch('lib/slaw/parse/bylaw.treetop') { "spec/slaw/grammar/bylaw_spec.rb" }
89
end
910

lib/slaw/parse/bylaw.treetop

+27-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ module Slaw
1010

1111
rule bylaw
1212
preamble
13-
chapters:chapter+ <Bylaw>
13+
chapters:chapter+
14+
schedules:schedules <Bylaw>
1415
end
1516

1617
rule preamble
@@ -37,6 +38,15 @@ module Slaw
3738
blocklist:blocklist? <Subsection>
3839
end
3940

41+
rule schedules
42+
schedules:schedule* <ScheduleContainer>
43+
end
44+
45+
rule schedule
46+
schedule_title
47+
statements:schedule_statement* <Schedule>
48+
end
49+
4050
##########
4151
# headings
4252

@@ -75,8 +85,14 @@ module Slaw
7585
!{ |s| s[2].text_value[-1] =~ /[^a-zA-z]/ or s[2].text_value.length > 100 }
7686
end
7787

88+
rule schedule_title
89+
space? schedule_heading_prefix
90+
space? "\""? num:alphanums? "\""?
91+
eol
92+
end
93+
7894
##########
79-
# minor containers
95+
# statements
8096

8197
rule section_content
8298
subsection*
@@ -87,13 +103,17 @@ module Slaw
87103
end
88104

89105
rule naked_statement
90-
space? !(part_heading_prefix / chapter_heading_prefix / section_title / numbered_statement_prefix) content eol <NakedStatement>
106+
space? !(part_heading_prefix / chapter_heading_prefix / section_title / numbered_statement_prefix / schedule_heading_prefix) content eol <NakedStatement>
91107
end
92108

93109
rule preamble_statement
94110
space? !(part_heading_prefix / chapter_heading_prefix / section_title) content eol
95111
end
96112

113+
rule schedule_statement
114+
space? (!schedule_heading_prefix) content eol
115+
end
116+
97117
##########
98118
# prefixes
99119

@@ -105,6 +125,10 @@ module Slaw
105125
'chapter'i space alphanums
106126
end
107127

128+
rule schedule_heading_prefix
129+
'schedule'i
130+
end
131+
108132
rule section_title_prefix
109133
number_letter '.'?
110134
end

lib/slaw/parse/nodes.rb

+12
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,18 @@ def to_xml(b, i, idprefix)
362362
b.p(content.text_value)
363363
end
364364
end
365+
366+
class ScheduleContainer < Treetop::Runtime::SyntaxNode
367+
def to_xml(b)
368+
1/0
369+
end
370+
end
371+
372+
class Schedule < Treetop::Runtime::SyntaxNode
373+
def to_xml(b)
374+
1/0
375+
end
376+
end
365377
end
366378
end
367379
end

spec/slaw/grammar/bylaw_spec.rb

+43
Original file line numberDiff line numberDiff line change
@@ -323,4 +323,47 @@ def to_xml(node)
323323
defn.definition.elements[0].content.text_value.should == 'the bar thing;'
324324
end
325325
end
326+
327+
#-------------------------------------------------------------------------------
328+
# schedules
329+
330+
context 'schedules' do
331+
it 'should handle a simple schedule' do
332+
node = parse :schedules, <<EOS
333+
Schedule
334+
Subject to approval in terms of this By-Law, the erection:
335+
1. Foo
336+
2. Bar
337+
EOS
338+
339+
sched = node.schedules.elements[0]
340+
sched.schedule_title.schedule_heading_prefix.text_value.should == "Schedule"
341+
sched.statements.elements[0].content.text_value.should == "Subject to approval in terms of this By-Law, the erection:"
342+
sched.statements.elements[1].content.text_value.should == "1. Foo"
343+
sched.statements.elements[2].content.text_value.should == "2. Bar"
344+
end
345+
346+
it 'should handle many schedules' do
347+
node = parse :schedules, <<EOS
348+
Schedule "1"
349+
1. Foo
350+
2. Bar
351+
Schedule 2
352+
Baz
353+
Boom
354+
EOS
355+
356+
sched = node.schedules.elements[0]
357+
sched.schedule_title.schedule_heading_prefix.text_value.should == "Schedule"
358+
sched.schedule_title.num.text_value.should == "1"
359+
sched.statements.elements[0].content.text_value.should == "1. Foo"
360+
sched.statements.elements[1].content.text_value.should == "2. Bar"
361+
362+
sched = node.schedules.elements[1]
363+
sched.schedule_title.schedule_heading_prefix.text_value.should == "Schedule"
364+
sched.schedule_title.num.text_value.should == "2"
365+
sched.statements.elements[0].content.text_value.should == "Baz"
366+
sched.statements.elements[1].content.text_value.should == "Boom"
367+
end
368+
end
326369
end

0 commit comments

Comments
 (0)