slaw 0.12.0 → 0.13.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 +4 -4
- data/README.md +6 -0
- data/lib/slaw/version.rb +1 -1
- data/lib/slaw/za/act.treetop +22 -4
- data/lib/slaw/za/act_nodes.rb +12 -2
- data/spec/za/act_spec.rb +182 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60aacb892dc41e5b6f92e698df123bd34c46a585
|
4
|
+
data.tar.gz: 4aa1590df1aac33962cb38780235bd45a7e522be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ebd4dfc35e3f15518236ddea7bfd961482e768a39703bb4e123cb04695825938cd426600773ef3323592a616ea07be9eeaf678222cd7243c6fccf263a9cf1065
|
7
|
+
data.tar.gz: 1fbfd3883cb51575e7318f2bf1e1935ad6e5dc3ff1bed9f9dd6d71e19eb9c7bf895b2b7829a3402bc529675d80b34aeb921853c179074d77dc72437a8bc1c6ea
|
data/README.md
CHANGED
@@ -218,6 +218,12 @@ Akoma Ntoso `component` elements at the end of the XML document, with a name of
|
|
218
218
|
|
219
219
|
## Changelog
|
220
220
|
|
221
|
+
### 0.13.0
|
222
|
+
|
223
|
+
* FIX allow Schedule, Part and other headings at the start of blocklist and subsections
|
224
|
+
* FIX replace empty CONTENT elements with empty P tags so XML validates
|
225
|
+
* Better handling of empty subsections and blocklist items
|
226
|
+
|
221
227
|
### 0.12.0
|
222
228
|
|
223
229
|
* Support links/references using Markdown-like \[text](href) syntax.
|
data/lib/slaw/version.rb
CHANGED
data/lib/slaw/za/act.treetop
CHANGED
@@ -52,8 +52,11 @@ module Slaw
|
|
52
52
|
end
|
53
53
|
|
54
54
|
rule subsection
|
55
|
-
|
56
|
-
|
55
|
+
space? subsection_prefix space?
|
56
|
+
# eg: (2) (a) foo
|
57
|
+
first_child:inline_block_element?
|
58
|
+
# eg: (2)
|
59
|
+
eol?
|
57
60
|
children:block_element* <Subsection>
|
58
61
|
end
|
59
62
|
|
@@ -125,6 +128,9 @@ module Slaw
|
|
125
128
|
end
|
126
129
|
|
127
130
|
rule section_title_content
|
131
|
+
# don't match subsections, eg.
|
132
|
+
#
|
133
|
+
# 10. (1) subsection content...
|
128
134
|
space !subsection_prefix content eol
|
129
135
|
end
|
130
136
|
|
@@ -145,12 +151,19 @@ module Slaw
|
|
145
151
|
(table / blocklist / naked_statement)
|
146
152
|
end
|
147
153
|
|
154
|
+
# Block elements that don't have to appear at the start of a line.
|
155
|
+
# ie. we don't need to guard against the start of a chapter, section, etc.
|
156
|
+
rule inline_block_element
|
157
|
+
(table / blocklist / inline_statement)
|
158
|
+
end
|
159
|
+
|
148
160
|
rule blocklist
|
149
161
|
blocklist_item+ <Blocklist>
|
150
162
|
end
|
151
163
|
|
152
164
|
rule blocklist_item
|
153
|
-
|
165
|
+
# TODO: this whitespace should probably be space, to allow empty blocklist items followed by plain text
|
166
|
+
space? blocklist_item_prefix whitespace item_content:(!blocklist_item_prefix clauses:clauses? eol)? eol?
|
154
167
|
<BlocklistItem>
|
155
168
|
end
|
156
169
|
|
@@ -187,12 +200,17 @@ module Slaw
|
|
187
200
|
<NakedStatement>
|
188
201
|
end
|
189
202
|
|
203
|
+
rule inline_statement
|
204
|
+
space? '\\'? clauses eol
|
205
|
+
<NakedStatement>
|
206
|
+
end
|
207
|
+
|
190
208
|
##########
|
191
209
|
# inline content
|
192
210
|
|
193
211
|
# one or more words, allowing inline elements
|
194
212
|
rule clauses
|
195
|
-
(remark / ref / [^\n])
|
213
|
+
(remark / ref / [^\n])+
|
196
214
|
<Clauses>
|
197
215
|
end
|
198
216
|
|
data/lib/slaw/za/act_nodes.rb
CHANGED
@@ -267,10 +267,18 @@ module Slaw
|
|
267
267
|
id = idprefix + num.gsub(/[()]/, '')
|
268
268
|
idprefix = id + "."
|
269
269
|
|
270
|
+
kids = children.elements
|
271
|
+
kids = [first_child] + kids if first_child and !first_child.empty?
|
272
|
+
|
270
273
|
b.subsection(id: id) { |b|
|
271
274
|
b.num(num)
|
272
275
|
b.content { |b|
|
273
|
-
|
276
|
+
if kids.empty?
|
277
|
+
# schema requires a non-empty content element
|
278
|
+
b.p
|
279
|
+
else
|
280
|
+
kids.each_with_index { |e, i| e.to_xml(b, idprefix, i) }
|
281
|
+
end
|
274
282
|
}
|
275
283
|
}
|
276
284
|
end
|
@@ -333,7 +341,9 @@ module Slaw
|
|
333
341
|
def to_xml(b, idprefix)
|
334
342
|
b.item(id: idprefix + num.gsub(/[()]/, '')) { |b|
|
335
343
|
b.num(num)
|
336
|
-
b.p { |b|
|
344
|
+
b.p { |b|
|
345
|
+
item_content.clauses.to_xml(b, idprefix) if respond_to? :item_content and item_content.respond_to? :clauses
|
346
|
+
}
|
337
347
|
}
|
338
348
|
end
|
339
349
|
end
|
data/spec/za/act_spec.rb
CHANGED
@@ -586,6 +586,63 @@ EOS
|
|
586
586
|
</subsection>'
|
587
587
|
end
|
588
588
|
|
589
|
+
it 'should handle a subsection that is empty and dives straight into a list' do
|
590
|
+
node = parse(:subsection, <<EOS
|
591
|
+
(1)
|
592
|
+
(a) one
|
593
|
+
(b) two
|
594
|
+
EOS
|
595
|
+
)
|
596
|
+
to_xml(node, "", 1).should == '<subsection id="1">
|
597
|
+
<num>(1)</num>
|
598
|
+
<content>
|
599
|
+
<blockList id="1.list0">
|
600
|
+
<item id="1.list0.a">
|
601
|
+
<num>(a)</num>
|
602
|
+
<p>one</p>
|
603
|
+
</item>
|
604
|
+
<item id="1.list0.b">
|
605
|
+
<num>(b)</num>
|
606
|
+
<p>two</p>
|
607
|
+
</item>
|
608
|
+
</blockList>
|
609
|
+
</content>
|
610
|
+
</subsection>'
|
611
|
+
end
|
612
|
+
|
613
|
+
it 'should handle empty subsections' do
|
614
|
+
node = parse(:section, <<EOS
|
615
|
+
1. Section
|
616
|
+
(1)
|
617
|
+
(2)
|
618
|
+
next line
|
619
|
+
(3) third
|
620
|
+
EOS
|
621
|
+
)
|
622
|
+
to_xml(node).should == '<section id="section-1">
|
623
|
+
<num>1.</num>
|
624
|
+
<heading>Section</heading>
|
625
|
+
<subsection id="section-1.1">
|
626
|
+
<num>(1)</num>
|
627
|
+
<content>
|
628
|
+
<p/>
|
629
|
+
</content>
|
630
|
+
</subsection>
|
631
|
+
<subsection id="section-1.2">
|
632
|
+
<num>(2)</num>
|
633
|
+
<content>
|
634
|
+
<p>next line</p>
|
635
|
+
</content>
|
636
|
+
</subsection>
|
637
|
+
<subsection id="section-1.3">
|
638
|
+
<num>(3)</num>
|
639
|
+
<content>
|
640
|
+
<p>third</p>
|
641
|
+
</content>
|
642
|
+
</subsection>
|
643
|
+
</section>'
|
644
|
+
end
|
645
|
+
|
589
646
|
it 'should handle a blocklist that dives straight into another list' do
|
590
647
|
node = parse(:subsection, <<EOS
|
591
648
|
(1) here's my really cool list,
|
@@ -605,6 +662,41 @@ EOS
|
|
605
662
|
</item>
|
606
663
|
<item id="1.list1.b">
|
607
664
|
<num>(b)</num>
|
665
|
+
<p/>
|
666
|
+
</item>
|
667
|
+
<item id="1.list1.i">
|
668
|
+
<num>(i)</num>
|
669
|
+
<p>single</p>
|
670
|
+
</item>
|
671
|
+
<item id="1.list1.ii">
|
672
|
+
<num>(ii)</num>
|
673
|
+
<p>double</p>
|
674
|
+
</item>
|
675
|
+
</blockList>
|
676
|
+
</content>
|
677
|
+
</subsection>'
|
678
|
+
end
|
679
|
+
|
680
|
+
it 'should handle a blocklist with empty elements' do
|
681
|
+
node = parse(:subsection, <<EOS
|
682
|
+
(1) here's my really cool list,
|
683
|
+
(a)
|
684
|
+
(b) (i) single
|
685
|
+
(ii) double
|
686
|
+
EOS
|
687
|
+
)
|
688
|
+
to_xml(node, "", 1).should == '<subsection id="1">
|
689
|
+
<num>(1)</num>
|
690
|
+
<content>
|
691
|
+
<p>here\'s my really cool list,</p>
|
692
|
+
<blockList id="1.list1">
|
693
|
+
<item id="1.list1.a">
|
694
|
+
<num>(a)</num>
|
695
|
+
<p/>
|
696
|
+
</item>
|
697
|
+
<item id="1.list1.b">
|
698
|
+
<num>(b)</num>
|
699
|
+
<p/>
|
608
700
|
</item>
|
609
701
|
<item id="1.list1.i">
|
610
702
|
<num>(i)</num>
|
@@ -721,6 +813,33 @@ EOS
|
|
721
813
|
</content>
|
722
814
|
</subsection>'
|
723
815
|
end
|
816
|
+
|
817
|
+
it 'should ignore block elements mid-subsection' do
|
818
|
+
node = parse :body, <<EOS
|
819
|
+
1. Section
|
820
|
+
|
821
|
+
(2) Schedule 1 is cool.
|
822
|
+
(3) Part 1
|
823
|
+
EOS
|
824
|
+
to_xml(node).should == '<body>
|
825
|
+
<section id="section-1">
|
826
|
+
<num>1.</num>
|
827
|
+
<heading>Section</heading>
|
828
|
+
<subsection id="section-1.2">
|
829
|
+
<num>(2)</num>
|
830
|
+
<content>
|
831
|
+
<p>Schedule 1 is cool.</p>
|
832
|
+
</content>
|
833
|
+
</subsection>
|
834
|
+
<subsection id="section-1.3">
|
835
|
+
<num>(3)</num>
|
836
|
+
<content>
|
837
|
+
<p>Part 1</p>
|
838
|
+
</content>
|
839
|
+
</subsection>
|
840
|
+
</section>
|
841
|
+
</body>'
|
842
|
+
end
|
724
843
|
end
|
725
844
|
|
726
845
|
#-------------------------------------------------------------------------------
|
@@ -1407,6 +1526,48 @@ EOS
|
|
1407
1526
|
</section>'
|
1408
1527
|
end
|
1409
1528
|
|
1529
|
+
it 'should handle empty subsections and empty lines' do
|
1530
|
+
node = parse :section, <<EOS
|
1531
|
+
1. Section
|
1532
|
+
|
1533
|
+
(1)
|
1534
|
+
|
1535
|
+
something
|
1536
|
+
|
1537
|
+
(2) Schedule 1
|
1538
|
+
|
1539
|
+
(a) Part 1
|
1540
|
+
|
1541
|
+
(b) thing
|
1542
|
+
EOS
|
1543
|
+
to_xml(node, "").should == '<section id="section-1">
|
1544
|
+
<num>1.</num>
|
1545
|
+
<heading>Section</heading>
|
1546
|
+
<subsection id="section-1.1">
|
1547
|
+
<num>(1)</num>
|
1548
|
+
<content>
|
1549
|
+
<p>something</p>
|
1550
|
+
</content>
|
1551
|
+
</subsection>
|
1552
|
+
<subsection id="section-1.2">
|
1553
|
+
<num>(2)</num>
|
1554
|
+
<content>
|
1555
|
+
<p>Schedule 1</p>
|
1556
|
+
<blockList id="section-1.2.list1">
|
1557
|
+
<item id="section-1.2.list1.a">
|
1558
|
+
<num>(a)</num>
|
1559
|
+
<p>Part 1</p>
|
1560
|
+
</item>
|
1561
|
+
<item id="section-1.2.list1.b">
|
1562
|
+
<num>(b)</num>
|
1563
|
+
<p>thing</p>
|
1564
|
+
</item>
|
1565
|
+
</blockList>
|
1566
|
+
</content>
|
1567
|
+
</subsection>
|
1568
|
+
</section>'
|
1569
|
+
end
|
1570
|
+
|
1410
1571
|
it 'should ignore escaped section headings' do
|
1411
1572
|
node = parse :section, <<EOS
|
1412
1573
|
1. Section
|
@@ -2134,6 +2295,27 @@ EOS
|
|
2134
2295
|
</content>
|
2135
2296
|
</paragraph>'
|
2136
2297
|
end
|
2298
|
+
|
2299
|
+
it 'should allow a table as part of a subsection' do
|
2300
|
+
node = parse :subsection, <<EOS
|
2301
|
+
(1) {|
|
2302
|
+
| foo
|
2303
|
+
|}
|
2304
|
+
EOS
|
2305
|
+
|
2306
|
+
to_xml(node, '', 0).should == '<subsection id="1">
|
2307
|
+
<num>(1)</num>
|
2308
|
+
<content>
|
2309
|
+
<table id="1.table0">
|
2310
|
+
<tr>
|
2311
|
+
<td>
|
2312
|
+
<p>foo</p>
|
2313
|
+
</td>
|
2314
|
+
</tr>
|
2315
|
+
</table>
|
2316
|
+
</content>
|
2317
|
+
</subsection>'
|
2318
|
+
end
|
2137
2319
|
end
|
2138
2320
|
|
2139
2321
|
#-------------------------------------------------------------------------------
|
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: 0.
|
4
|
+
version: 0.13.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: 2017-
|
11
|
+
date: 2017-05-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|