slaw 7.0.0 → 9.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/README.md +26 -0
- data/lib/slaw/grammars/core_nodes.rb +3 -3
- data/lib/slaw/grammars/schedules_nodes.rb +2 -2
- data/lib/slaw/grammars/terminals.treetop +5 -1
- data/lib/slaw/grammars/za/act.treetop +26 -7
- data/lib/slaw/grammars/za/act_nodes.rb +38 -13
- data/lib/slaw/grammars/za/act_text.xsl +11 -0
- data/lib/slaw/parse/builder.rb +1 -8
- data/lib/slaw/version.rb +1 -1
- data/spec/za/act_block_spec.rb +118 -0
- data/spec/za/act_schedules_spec.rb +4 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0654597e1ede427474f5b9b4f703070c4d23fc34fdbf10700ae72485f8372a21'
|
4
|
+
data.tar.gz: d19cd4ebfe1e256f5366addde1723817547075e6468ab31b0d65c8d492f5c6d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a778d4798462049e8fbb123c30d72d2e43c4f7f8344e0bc31590d2c5873daa3675979cafdb3fc14be1327f3ed262c19e6220b2e2ed40e825cc68fe353bb57614
|
7
|
+
data.tar.gz: 585ea851576bca2c5059a3693067066f9f06a9b1ef67761534b707ddcd51f447cc8953f7f7b33842486cb77e442b3f7d60dd63e763306d269db14f1c1b17fcaa
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -79,8 +79,34 @@ You can create your own grammar by creating a gem that provides these files and
|
|
79
79
|
7. Push to the branch: `git push origin my-new-feature`
|
80
80
|
8. Create a new Pull Request
|
81
81
|
|
82
|
+
## Releasing
|
83
|
+
|
84
|
+
1. Update `lib/slaw/version.rb`
|
85
|
+
2. Run `rake release`
|
86
|
+
|
82
87
|
## Changelog
|
83
88
|
|
89
|
+
### 9.2.0 (10 June 2020)
|
90
|
+
|
91
|
+
* Subpart numbers are optional
|
92
|
+
|
93
|
+
### 9.1.0 (15 April 2020)
|
94
|
+
|
95
|
+
* Subsections can have numbers such as 1.1A and 1.1bis
|
96
|
+
|
97
|
+
### 9.0.0 (17 Mar 2020)
|
98
|
+
|
99
|
+
* Support SUBPART
|
100
|
+
|
101
|
+
### 8.0.1 (26 Feb 2020)
|
102
|
+
|
103
|
+
* Fix bug with id prefix on schedules container
|
104
|
+
|
105
|
+
### 8.0.0 (19 Feb 2020)
|
106
|
+
|
107
|
+
* Obey --id-prefix for group nodes
|
108
|
+
* Ensure that schedules prefix their children, for those that require it (parts and chapters)
|
109
|
+
|
84
110
|
### 7.0.0 (31 Jan 2020)
|
85
111
|
|
86
112
|
* Lists ids are now numbered sequentially, rather than by tree position
|
@@ -1,13 +1,13 @@
|
|
1
1
|
module Slaw
|
2
2
|
module Grammars
|
3
3
|
class GroupNode < Treetop::Runtime::SyntaxNode
|
4
|
-
def to_xml(b,
|
5
|
-
children.elements.each { |e| e.to_xml(b,
|
4
|
+
def to_xml(b, id_prefix='')
|
5
|
+
children.elements.each { |e| e.to_xml(b, id_prefix) }
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
9
9
|
class Body < Treetop::Runtime::SyntaxNode
|
10
|
-
def to_xml(b)
|
10
|
+
def to_xml(b, id_prefix='')
|
11
11
|
b.body { |b|
|
12
12
|
children.elements.each_with_index { |e, i| e.to_xml(b, '', i) }
|
13
13
|
}
|
@@ -9,10 +9,10 @@ module Slaw
|
|
9
9
|
MANIFESTATION_URI = EXPRESSION_URI
|
10
10
|
|
11
11
|
class ScheduleContainer < Treetop::Runtime::SyntaxNode
|
12
|
-
def to_xml(b)
|
12
|
+
def to_xml(b, idprefix="")
|
13
13
|
b.components { |b|
|
14
14
|
schedules.children.elements.each_with_index { |e, i|
|
15
|
-
e.to_xml(b,
|
15
|
+
e.to_xml(b, idprefix, i+1)
|
16
16
|
}
|
17
17
|
}
|
18
18
|
end
|
@@ -44,37 +44,43 @@ module Slaw
|
|
44
44
|
|
45
45
|
rule body
|
46
46
|
('BODY' space? eol)?
|
47
|
-
children:(chapter / part / section / subsection / generic_container)* <Body>
|
47
|
+
children:(chapter / part / subpart / section / subsection / generic_container)* <Body>
|
48
48
|
end
|
49
49
|
|
50
50
|
# chapter (parts allowed)
|
51
51
|
rule chapter
|
52
52
|
heading:chapter_heading
|
53
|
-
children:(part_no_chapter / section / subsection / generic_container)*
|
53
|
+
children:(part_no_chapter / subpart / section / subsection / generic_container)*
|
54
54
|
<Chapter>
|
55
55
|
end
|
56
56
|
|
57
57
|
# part (chapters allowed)
|
58
58
|
rule part
|
59
59
|
heading:part_heading
|
60
|
-
children:(chapter_no_part / section / subsection / generic_container)*
|
60
|
+
children:(chapter_no_part / subpart / section / subsection / generic_container)*
|
61
61
|
<Part>
|
62
62
|
end
|
63
63
|
|
64
64
|
# part (no chapters)
|
65
65
|
rule part_no_chapter
|
66
66
|
heading:part_heading
|
67
|
-
children:(section / subsection / generic_container)*
|
67
|
+
children:(subpart / section / subsection / generic_container)*
|
68
68
|
<Part>
|
69
69
|
end
|
70
70
|
|
71
71
|
# chapter (no parts)
|
72
72
|
rule chapter_no_part
|
73
73
|
heading:chapter_heading
|
74
|
-
children:(section / subsection / generic_container)*
|
74
|
+
children:(subpart / section / subsection / generic_container)*
|
75
75
|
<Chapter>
|
76
76
|
end
|
77
77
|
|
78
|
+
rule subpart
|
79
|
+
heading:subpart_heading
|
80
|
+
children:(section / subsection / generic_container)*
|
81
|
+
<Subpart>
|
82
|
+
end
|
83
|
+
|
78
84
|
rule section
|
79
85
|
section_title
|
80
86
|
children:(subsection / generic_container)* <Section>
|
@@ -134,6 +140,10 @@ module Slaw
|
|
134
140
|
children:part_no_chapter+ <GroupNode>
|
135
141
|
end
|
136
142
|
|
143
|
+
rule subparts
|
144
|
+
children:subpart+ <GroupNode>
|
145
|
+
end
|
146
|
+
|
137
147
|
rule sections
|
138
148
|
children:section+ <GroupNode>
|
139
149
|
end
|
@@ -151,6 +161,11 @@ module Slaw
|
|
151
161
|
<PartHeading>
|
152
162
|
end
|
153
163
|
|
164
|
+
rule subpart_heading
|
165
|
+
space? subpart_heading_prefix heading:(newline? space? inline_items)? eol
|
166
|
+
<SubpartHeading>
|
167
|
+
end
|
168
|
+
|
154
169
|
rule section_title
|
155
170
|
section_title_1 / section_1_title
|
156
171
|
end
|
@@ -241,6 +256,10 @@ module Slaw
|
|
241
256
|
'part'i space alphanums [ :-]*
|
242
257
|
end
|
243
258
|
|
259
|
+
rule subpart_heading_prefix
|
260
|
+
'subpart'i num:(space alphanums)? [ :-]*
|
261
|
+
end
|
262
|
+
|
244
263
|
rule chapter_heading_prefix
|
245
264
|
'chapter'i space alphanums [ :-]*
|
246
265
|
end
|
@@ -275,12 +294,12 @@ module Slaw
|
|
275
294
|
|
276
295
|
rule body_hierarchy_prefix
|
277
296
|
# Text that indicates the start of a hierarchy element, in the body
|
278
|
-
chapter_heading / part_heading / section_title / schedule_title / subsection_prefix / crossheading
|
297
|
+
chapter_heading / part_heading / subpart_heading / section_title / schedule_title / subsection_prefix / crossheading
|
279
298
|
end
|
280
299
|
|
281
300
|
rule non_body_hierarchy_prefix
|
282
301
|
# Text that indicates the start of a hierarchy element, in the preamble or preface
|
283
|
-
chapter_heading / part_heading / section_title / schedule_title / crossheading
|
302
|
+
chapter_heading / part_heading / subpart_heading / section_title / schedule_title / crossheading
|
284
303
|
end
|
285
304
|
|
286
305
|
include Slaw::Grammars::Inlines
|
@@ -137,13 +137,8 @@ module Slaw
|
|
137
137
|
heading.num
|
138
138
|
end
|
139
139
|
|
140
|
-
def to_xml(b, *args)
|
141
|
-
id = "part-#{num}"
|
142
|
-
|
143
|
-
# include a chapter number in the id if our parent has one
|
144
|
-
if parent and parent.parent.is_a?(Chapter) and parent.parent.num
|
145
|
-
id = "chapter-#{parent.parent.num}.#{id}"
|
146
|
-
end
|
140
|
+
def to_xml(b, id_prefix='', *args)
|
141
|
+
id = id_prefix + "part-#{num}"
|
147
142
|
|
148
143
|
b.part(id: id) { |b|
|
149
144
|
heading.to_xml(b)
|
@@ -167,18 +162,48 @@ module Slaw
|
|
167
162
|
end
|
168
163
|
end
|
169
164
|
|
170
|
-
class
|
165
|
+
class Subpart < Treetop::Runtime::SyntaxNode
|
171
166
|
def num
|
172
167
|
heading.num
|
173
168
|
end
|
174
169
|
|
175
|
-
def to_xml(b, *args)
|
176
|
-
|
170
|
+
def to_xml(b, id_prefix='', *args)
|
171
|
+
num = self.num
|
172
|
+
if num.empty?
|
173
|
+
num = Slaw::Grammars::Counters.counters[id_prefix]['subpart'] += 1
|
174
|
+
end
|
177
175
|
|
178
|
-
|
179
|
-
|
180
|
-
|
176
|
+
id = id_prefix + "subpart-#{num}"
|
177
|
+
|
178
|
+
b.subpart(id: id) { |b|
|
179
|
+
heading.to_xml(b)
|
180
|
+
children.elements.each_with_index { |e, i| e.to_xml(b, id + '.', i) }
|
181
|
+
}
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
class SubpartHeading < Treetop::Runtime::SyntaxNode
|
186
|
+
def num
|
187
|
+
subpart_heading_prefix.num.text_value.strip()
|
188
|
+
end
|
189
|
+
|
190
|
+
def to_xml(b)
|
191
|
+
b.num(num) unless self.num.empty?
|
192
|
+
if heading.respond_to? :inline_items
|
193
|
+
b.heading { |b|
|
194
|
+
heading.inline_items.to_xml(b)
|
195
|
+
}
|
181
196
|
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
class Chapter < Treetop::Runtime::SyntaxNode
|
201
|
+
def num
|
202
|
+
heading.num
|
203
|
+
end
|
204
|
+
|
205
|
+
def to_xml(b, id_prefix='', *args)
|
206
|
+
id = id_prefix + "chapter-#{num}"
|
182
207
|
|
183
208
|
b.chapter(id: id) { |b|
|
184
209
|
heading.to_xml(b)
|
@@ -23,6 +23,7 @@
|
|
23
23
|
$prefix = 'PREFACE' or
|
24
24
|
starts-with($prefix, 'CHAPTER ') or
|
25
25
|
starts-with($prefix, 'PART ') or
|
26
|
+
starts-with($prefix, 'SUBPART ') or
|
26
27
|
starts-with($prefix, 'SCHEDULE ') or
|
27
28
|
starts-with($prefix, 'HEADING ') or
|
28
29
|
starts-with($prefix, 'SUBHEADING ') or
|
@@ -74,6 +75,16 @@
|
|
74
75
|
<xsl:apply-templates select="./*[not(self::a:num) and not(self::a:heading)]" />
|
75
76
|
</xsl:template>
|
76
77
|
|
78
|
+
<xsl:template match="a:subpart">
|
79
|
+
<xsl:text>Subpart </xsl:text>
|
80
|
+
<xsl:value-of select="a:num" />
|
81
|
+
<xsl:text> - </xsl:text>
|
82
|
+
<xsl:apply-templates select="a:heading" />
|
83
|
+
<xsl:text> </xsl:text>
|
84
|
+
|
85
|
+
<xsl:apply-templates select="./*[not(self::a:num) and not(self::a:heading)]" />
|
86
|
+
</xsl:template>
|
87
|
+
|
77
88
|
<xsl:template match="a:chapter">
|
78
89
|
<xsl:text>Chapter </xsl:text>
|
79
90
|
<xsl:value-of select="a:num" />
|
data/lib/slaw/parse/builder.rb
CHANGED
@@ -148,14 +148,7 @@ module Slaw
|
|
148
148
|
builder.akomaNtoso("xmlns:xsi"=> "http://www.w3.org/2001/XMLSchema-instance",
|
149
149
|
"xsi:schemaLocation" => "http://www.akomantoso.org/2.0 akomantoso20.xsd",
|
150
150
|
"xmlns" => NS) do |b|
|
151
|
-
|
152
|
-
|
153
|
-
# should we provide an id prefix?
|
154
|
-
arity = tree.method('to_xml').arity
|
155
|
-
arity = arity.abs-1 if arity < 0
|
156
|
-
args << (fragment_id_prefix || "") if arity > 1
|
157
|
-
|
158
|
-
tree.to_xml(*args)
|
151
|
+
tree.to_xml(b, fragment_id_prefix || '')
|
159
152
|
end
|
160
153
|
|
161
154
|
builder.to_xml(encoding: 'UTF-8')
|
data/lib/slaw/version.rb
CHANGED
data/spec/za/act_block_spec.rb
CHANGED
@@ -755,6 +755,102 @@ EOS
|
|
755
755
|
end
|
756
756
|
end
|
757
757
|
|
758
|
+
#-------------------------------------------------------------------------------
|
759
|
+
# Subparts
|
760
|
+
|
761
|
+
describe 'subparts' do
|
762
|
+
it 'should handle subparts' do
|
763
|
+
node = parse :subpart, <<EOS
|
764
|
+
SUBPART 2 - Heading
|
765
|
+
|
766
|
+
1. Section
|
767
|
+
Hello there
|
768
|
+
EOS
|
769
|
+
to_xml(node).should == '<subpart id="subpart-2">
|
770
|
+
<num>2</num>
|
771
|
+
<heading>Heading</heading>
|
772
|
+
<section id="section-1">
|
773
|
+
<num>1.</num>
|
774
|
+
<heading>Section</heading>
|
775
|
+
<paragraph id="section-1.paragraph0">
|
776
|
+
<content>
|
777
|
+
<p>Hello there</p>
|
778
|
+
</content>
|
779
|
+
</paragraph>
|
780
|
+
</section>
|
781
|
+
</subpart>'
|
782
|
+
end
|
783
|
+
|
784
|
+
it 'should handle subparts in parts' do
|
785
|
+
node = parse :part, <<EOS
|
786
|
+
PART A - The Part
|
787
|
+
|
788
|
+
SUBPART 1 - The Subpart 1
|
789
|
+
|
790
|
+
1. Section
|
791
|
+
|
792
|
+
Hello
|
793
|
+
|
794
|
+
SUBPART 2 - The Subpart 2
|
795
|
+
|
796
|
+
2. Section
|
797
|
+
|
798
|
+
Bye
|
799
|
+
EOS
|
800
|
+
to_xml(node).should == '<part id="part-A">
|
801
|
+
<num>A</num>
|
802
|
+
<heading>The Part</heading>
|
803
|
+
<subpart id="part-A.subpart-1">
|
804
|
+
<num>1</num>
|
805
|
+
<heading>The Subpart 1</heading>
|
806
|
+
<section id="section-1">
|
807
|
+
<num>1.</num>
|
808
|
+
<heading>Section</heading>
|
809
|
+
<paragraph id="section-1.paragraph0">
|
810
|
+
<content>
|
811
|
+
<p>Hello</p>
|
812
|
+
</content>
|
813
|
+
</paragraph>
|
814
|
+
</section>
|
815
|
+
</subpart>
|
816
|
+
<subpart id="part-A.subpart-2">
|
817
|
+
<num>2</num>
|
818
|
+
<heading>The Subpart 2</heading>
|
819
|
+
<section id="section-2">
|
820
|
+
<num>2.</num>
|
821
|
+
<heading>Section</heading>
|
822
|
+
<paragraph id="section-2.paragraph0">
|
823
|
+
<content>
|
824
|
+
<p>Bye</p>
|
825
|
+
</content>
|
826
|
+
</paragraph>
|
827
|
+
</section>
|
828
|
+
</subpart>
|
829
|
+
</part>'
|
830
|
+
end
|
831
|
+
|
832
|
+
it 'should allow optional numbers' do
|
833
|
+
node = parse :subpart, <<EOS
|
834
|
+
SUBPART - Heading - with a dash
|
835
|
+
|
836
|
+
1. Section
|
837
|
+
Hello there
|
838
|
+
EOS
|
839
|
+
to_xml(node).should == '<subpart id="subpart-0">
|
840
|
+
<heading>Heading - with a dash</heading>
|
841
|
+
<section id="section-1">
|
842
|
+
<num>1.</num>
|
843
|
+
<heading>Section</heading>
|
844
|
+
<paragraph id="section-1.paragraph0">
|
845
|
+
<content>
|
846
|
+
<p>Hello there</p>
|
847
|
+
</content>
|
848
|
+
</paragraph>
|
849
|
+
</section>
|
850
|
+
</subpart>'
|
851
|
+
end
|
852
|
+
end
|
853
|
+
|
758
854
|
#-------------------------------------------------------------------------------
|
759
855
|
# Subsections
|
760
856
|
|
@@ -963,6 +1059,28 @@ EOS
|
|
963
1059
|
9.9. foo
|
964
1060
|
EOS
|
965
1061
|
node.num.should == "9.9"
|
1062
|
+
|
1063
|
+
node = parse :subsection, <<EOS
|
1064
|
+
9.9 foo
|
1065
|
+
EOS
|
1066
|
+
node.num.should == "9.9"
|
1067
|
+
end
|
1068
|
+
|
1069
|
+
it 'should handle dotted number and letter subsection numbers' do
|
1070
|
+
node = parse :subsection, <<EOS
|
1071
|
+
9.9A. foo
|
1072
|
+
EOS
|
1073
|
+
node.num.should == "9.9A"
|
1074
|
+
|
1075
|
+
node = parse :subsection, <<EOS
|
1076
|
+
9.9bis foo
|
1077
|
+
EOS
|
1078
|
+
node.num.should == "9.9bis"
|
1079
|
+
|
1080
|
+
node = parse :subsection, <<EOS
|
1081
|
+
9.9A foo
|
1082
|
+
EOS
|
1083
|
+
node.num.should == "9.9A"
|
966
1084
|
end
|
967
1085
|
|
968
1086
|
it 'should handle dotted number sublists' do
|
@@ -383,19 +383,19 @@ EOS
|
|
383
383
|
<hcontainer id="schedule1" name="schedule">
|
384
384
|
<heading>Schedule 1</heading>
|
385
385
|
<subheading>Forms</subheading>
|
386
|
-
<part id="part-I">
|
386
|
+
<part id="schedule1.part-I">
|
387
387
|
<num>I</num>
|
388
388
|
<heading>Form of authentication statement</heading>
|
389
|
-
<paragraph id="part-I.paragraph0">
|
389
|
+
<paragraph id="schedule1.part-I.paragraph0">
|
390
390
|
<content>
|
391
391
|
<p>This printed impression has been carefully compared by me with the bill which was passed by Parliament and found by me to be a true copy of the bill.</p>
|
392
392
|
</content>
|
393
393
|
</paragraph>
|
394
394
|
</part>
|
395
|
-
<part id="part-II">
|
395
|
+
<part id="schedule1.part-II">
|
396
396
|
<num>II</num>
|
397
397
|
<heading>Form of statement of the President’s assent.</heading>
|
398
|
-
<paragraph id="part-II.paragraph0">
|
398
|
+
<paragraph id="schedule1.part-II.paragraph0">
|
399
399
|
<content>
|
400
400
|
<p>I signify my assent to the bill and a whole bunch of other stuff.</p>
|
401
401
|
</content>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slaw
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 9.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Greg Kempe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|