slaw 0.6.6 → 0.6.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/slaw/parse/builder.rb +4 -7
- data/lib/slaw/version.rb +1 -1
- data/lib/slaw/za/act.treetop +14 -9
- data/lib/slaw/za/act_nodes.rb +27 -8
- data/slaw.gemspec +0 -1
- data/spec/za/act_spec.rb +263 -28
- metadata +1 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ffdf08fe85d90cfacaa3c1f054cd907a19b257a
|
4
|
+
data.tar.gz: b0b1f5870e4c6e55b3a9e08d979386be93bf6ebd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d2f4e281a3f03af67164b34c932956a53f5c63baf9befe1acce7b739b5d4e2d30e2aea588a8c55f4720c66281db3c6a00695c9007a5e15b6e5746f87c71f5dd2
|
7
|
+
data.tar.gz: f47c88f70b3a7c4ce16baa09c97d3e7812665b2ecf8bc570b9b782028257a1d3eebca65d5366aeb03b41ba33b5d2e34d2010d0570a4075a343a4758fe5c067c3
|
data/lib/slaw/parse/builder.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
|
-
require 'builder'
|
4
3
|
require 'treetop'
|
5
4
|
|
6
5
|
module Slaw
|
@@ -109,13 +108,11 @@ module Slaw
|
|
109
108
|
#
|
110
109
|
# @return [String] an XML string
|
111
110
|
def xml_from_syntax_tree(tree)
|
112
|
-
|
113
|
-
builder = ::Builder::XmlMarkup.new(indent: 2, target: s)
|
111
|
+
builder = ::Nokogiri::XML::Builder.new
|
114
112
|
|
115
|
-
builder.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
|
116
113
|
builder.akomaNtoso("xmlns:xsi"=> "http://www.w3.org/2001/XMLSchema-instance",
|
117
114
|
"xsi:schemaLocation" => "http://www.akomantoso.org/2.0 akomantoso20.xsd",
|
118
|
-
"xmlns" => NS)
|
115
|
+
"xmlns" => NS) do |b|
|
119
116
|
args = [b]
|
120
117
|
|
121
118
|
# should we provide an id prefix?
|
@@ -124,9 +121,9 @@ module Slaw
|
|
124
121
|
args << (fragment_id_prefix || "") if arity > 1
|
125
122
|
|
126
123
|
tree.to_xml(*args)
|
127
|
-
|
124
|
+
end
|
128
125
|
|
129
|
-
|
126
|
+
builder.to_xml(encoding: 'UTF-8')
|
130
127
|
end
|
131
128
|
|
132
129
|
# Parse a string into a Nokogiri::XML::Document
|
data/lib/slaw/version.rb
CHANGED
data/lib/slaw/za/act.treetop
CHANGED
@@ -38,7 +38,7 @@ module Slaw
|
|
38
38
|
end
|
39
39
|
|
40
40
|
rule subsection
|
41
|
-
statement:(numbered_statement / table /
|
41
|
+
statement:(numbered_statement / table / naked_statement)
|
42
42
|
blocklist:blocklist? <Subsection>
|
43
43
|
end
|
44
44
|
|
@@ -110,11 +110,11 @@ module Slaw
|
|
110
110
|
# statements
|
111
111
|
|
112
112
|
rule numbered_statement
|
113
|
-
space? numbered_statement_prefix whitespace (!blocklist_item_prefix
|
113
|
+
space? numbered_statement_prefix whitespace (!blocklist_item_prefix clauses eol)? <NumberedStatement>
|
114
114
|
end
|
115
115
|
|
116
116
|
rule naked_statement
|
117
|
-
space? !(part / chapter / section / schedule)
|
117
|
+
space? !(part / chapter / section / schedule) clauses eol
|
118
118
|
<NakedStatement>
|
119
119
|
end
|
120
120
|
|
@@ -123,6 +123,17 @@ module Slaw
|
|
123
123
|
<ScheduleStatement>
|
124
124
|
end
|
125
125
|
|
126
|
+
# one or more words, allowing inline elements
|
127
|
+
rule clauses
|
128
|
+
((remark / [^ \t\n]+) [ \t]*)+
|
129
|
+
<Clauses>
|
130
|
+
end
|
131
|
+
|
132
|
+
rule remark
|
133
|
+
'[[' content:(!']]' .)+ ']]'
|
134
|
+
<Remark>
|
135
|
+
end
|
136
|
+
|
126
137
|
##########
|
127
138
|
# tables
|
128
139
|
|
@@ -139,12 +150,6 @@ module Slaw
|
|
139
150
|
space? '|}'
|
140
151
|
end
|
141
152
|
|
142
|
-
rule remark
|
143
|
-
# TODO: support (Section 3.5 amended by ... )
|
144
|
-
space? '[[' content:[^\n\]]+ ']]' eol
|
145
|
-
<Remark>
|
146
|
-
end
|
147
|
-
|
148
153
|
##########
|
149
154
|
# prefixes
|
150
155
|
|
data/lib/slaw/za/act_nodes.rb
CHANGED
@@ -82,8 +82,8 @@ module Slaw
|
|
82
82
|
if text_value != ""
|
83
83
|
b.preamble { |b|
|
84
84
|
statements.elements.each { |e|
|
85
|
-
if not (e.
|
86
|
-
b.p(e.
|
85
|
+
if not (e.clauses.text_value =~ /^preamble/i)
|
86
|
+
b.p(e.clauses.text_value)
|
87
87
|
end
|
88
88
|
}
|
89
89
|
}
|
@@ -248,7 +248,8 @@ module Slaw
|
|
248
248
|
b.content { |b|
|
249
249
|
if blocklist and blocklist.is_a?(Blocklist)
|
250
250
|
if statement.content
|
251
|
-
|
251
|
+
# provide the statement as the list introduction to the block list
|
252
|
+
blocklist.to_xml(b, idprefix, i) { |b| statement.content.to_xml(b, idprefix) }
|
252
253
|
else
|
253
254
|
blocklist.to_xml(b, idprefix, i)
|
254
255
|
end
|
@@ -274,24 +275,42 @@ module Slaw
|
|
274
275
|
if elements[3].text_value == ""
|
275
276
|
nil
|
276
277
|
else
|
277
|
-
elements[3].
|
278
|
+
elements[3].clauses
|
278
279
|
end
|
279
280
|
end
|
280
281
|
|
281
282
|
def to_xml(b, idprefix)
|
282
|
-
b.p
|
283
|
+
b.p { |b| content.to_xml(b, idprefix) } if content
|
283
284
|
end
|
284
285
|
end
|
285
286
|
|
286
287
|
class NakedStatement < Treetop::Runtime::SyntaxNode
|
287
288
|
def to_xml(b, idprefix)
|
288
|
-
b.p(
|
289
|
+
b.p { |b| clauses.to_xml(b, idprefix) } if clauses
|
290
|
+
end
|
291
|
+
|
292
|
+
def content
|
293
|
+
clauses
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
class Clauses < Treetop::Runtime::SyntaxNode
|
298
|
+
def to_xml(b, idprefix=nil)
|
299
|
+
for e in elements
|
300
|
+
for e2 in e.elements
|
301
|
+
if e2.respond_to? :to_xml
|
302
|
+
e2.to_xml(b, idprefix)
|
303
|
+
else
|
304
|
+
b << e2.text_value
|
305
|
+
end
|
306
|
+
end
|
307
|
+
end
|
289
308
|
end
|
290
309
|
end
|
291
310
|
|
292
311
|
class Remark < Treetop::Runtime::SyntaxNode
|
293
312
|
def to_xml(b, idprefix)
|
294
|
-
b.
|
313
|
+
b.remark('[' + content.text_value + ']', status: 'editorial')
|
295
314
|
end
|
296
315
|
end
|
297
316
|
|
@@ -396,7 +415,7 @@ module Slaw
|
|
396
415
|
comp = "schedule#{n}"
|
397
416
|
id = "#{idprefix}schedule-#{n}"
|
398
417
|
|
399
|
-
b.
|
418
|
+
b.doc_(name: "schedule#{n}") { |b|
|
400
419
|
b.meta { |b|
|
401
420
|
b.identification(source: "#slaw") { |b|
|
402
421
|
b.FRBRWork { |b|
|
data/slaw.gemspec
CHANGED
@@ -24,7 +24,6 @@ Gem::Specification.new do |spec|
|
|
24
24
|
|
25
25
|
spec.add_runtime_dependency "nokogiri", "~> 1.6.0"
|
26
26
|
spec.add_runtime_dependency "treetop", "~> 1.5"
|
27
|
-
spec.add_runtime_dependency "builder", "~> 3.2.2"
|
28
27
|
spec.add_runtime_dependency "log4r", "~> 1.1.10"
|
29
28
|
spec.add_runtime_dependency "thor", "~> 0.19.1"
|
30
29
|
spec.add_runtime_dependency "mimemagic", "~> 0.2.1"
|
data/spec/za/act_spec.rb
CHANGED
@@ -21,11 +21,10 @@ describe Slaw::ActGenerator do
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
def to_xml(node,
|
25
|
-
|
26
|
-
b = Builder::XmlMarkup.new(target: s, indent: indent)
|
24
|
+
def to_xml(node, *args)
|
25
|
+
b = ::Nokogiri::XML::Builder.new
|
27
26
|
node.to_xml(b, *args)
|
28
|
-
|
27
|
+
b.doc.root.to_xml(encoding: 'UTF-8')
|
29
28
|
end
|
30
29
|
|
31
30
|
#-------------------------------------------------------------------------------
|
@@ -41,7 +40,19 @@ Hello there
|
|
41
40
|
EOS
|
42
41
|
node.num.should == "2"
|
43
42
|
node.heading.title.should == 'The Chapter Heading'
|
44
|
-
to_xml(node).should ==
|
43
|
+
to_xml(node).should == '<chapter id="chapter-2">
|
44
|
+
<num>2</num>
|
45
|
+
<heading>The Chapter Heading</heading>
|
46
|
+
<section id="section-1">
|
47
|
+
<num>1.</num>
|
48
|
+
<heading>Section</heading>
|
49
|
+
<subsection id="section-1.subsection-0">
|
50
|
+
<content>
|
51
|
+
<p>Hello there</p>
|
52
|
+
</content>
|
53
|
+
</subsection>
|
54
|
+
</section>
|
55
|
+
</chapter>'
|
45
56
|
end
|
46
57
|
end
|
47
58
|
|
@@ -58,7 +69,19 @@ Hello there
|
|
58
69
|
EOS
|
59
70
|
node.num.should == "2"
|
60
71
|
node.heading.title.should == 'The Part Heading'
|
61
|
-
to_xml(node).should ==
|
72
|
+
to_xml(node).should == '<part id="part-2">
|
73
|
+
<num>2</num>
|
74
|
+
<heading>The Part Heading</heading>
|
75
|
+
<section id="section-1">
|
76
|
+
<num>1.</num>
|
77
|
+
<heading>Section</heading>
|
78
|
+
<subsection id="section-1.subsection-0">
|
79
|
+
<content>
|
80
|
+
<p>Hello there</p>
|
81
|
+
</content>
|
82
|
+
</subsection>
|
83
|
+
</section>
|
84
|
+
</part>'
|
62
85
|
end
|
63
86
|
|
64
87
|
it 'should handle part headers with dashes' do
|
@@ -69,7 +92,19 @@ Hello there
|
|
69
92
|
EOS
|
70
93
|
node.num.should == "2"
|
71
94
|
node.heading.title.should == 'The Part Heading'
|
72
|
-
to_xml(node).should ==
|
95
|
+
to_xml(node).should == '<part id="part-2">
|
96
|
+
<num>2</num>
|
97
|
+
<heading>The Part Heading</heading>
|
98
|
+
<section id="section-1">
|
99
|
+
<num>1.</num>
|
100
|
+
<heading>Section</heading>
|
101
|
+
<subsection id="section-1.subsection-0">
|
102
|
+
<content>
|
103
|
+
<p>Hello there</p>
|
104
|
+
</content>
|
105
|
+
</subsection>
|
106
|
+
</section>
|
107
|
+
</part>'
|
73
108
|
end
|
74
109
|
|
75
110
|
it 'should handle part headers with colons' do
|
@@ -80,7 +115,19 @@ Hello there
|
|
80
115
|
EOS
|
81
116
|
node.num.should == "2"
|
82
117
|
node.heading.title.should == 'The Part Heading'
|
83
|
-
to_xml(node).should ==
|
118
|
+
to_xml(node).should == '<part id="part-2">
|
119
|
+
<num>2</num>
|
120
|
+
<heading>The Part Heading</heading>
|
121
|
+
<section id="section-1">
|
122
|
+
<num>1.</num>
|
123
|
+
<heading>Section</heading>
|
124
|
+
<subsection id="section-1.subsection-0">
|
125
|
+
<content>
|
126
|
+
<p>Hello there</p>
|
127
|
+
</content>
|
128
|
+
</subsection>
|
129
|
+
</section>
|
130
|
+
</part>'
|
84
131
|
end
|
85
132
|
|
86
133
|
it 'should handle parts and odd section numbers' do
|
@@ -122,8 +169,23 @@ EOS
|
|
122
169
|
(a) foo
|
123
170
|
(b) bar
|
124
171
|
EOS
|
125
|
-
node.statement.
|
172
|
+
node.statement.clauses.text_value.should == "naked statement (c) blah"
|
126
173
|
node.blocklist.elements.first.num.should == "(a)"
|
174
|
+
to_xml(node, "").should == '<subsection id="subsection-0">
|
175
|
+
<content>
|
176
|
+
<blockList id="subsection-0.list0">
|
177
|
+
<listIntroduction>naked statement (c) blah</listIntroduction>
|
178
|
+
<item id="subsection-0.list0.a">
|
179
|
+
<num>(a)</num>
|
180
|
+
<p>foo</p>
|
181
|
+
</item>
|
182
|
+
<item id="subsection-0.list0.b">
|
183
|
+
<num>(b)</num>
|
184
|
+
<p>bar</p>
|
185
|
+
</item>
|
186
|
+
</blockList>
|
187
|
+
</content>
|
188
|
+
</subsection>'
|
127
189
|
end
|
128
190
|
|
129
191
|
it 'should handle a blocklist' do
|
@@ -136,6 +198,30 @@ EOS
|
|
136
198
|
EOS
|
137
199
|
node.statement.num.should == "(2)"
|
138
200
|
node.statement.content.text_value.should == "title"
|
201
|
+
to_xml(node, "").should == '<subsection id="2">
|
202
|
+
<num>(2)</num>
|
203
|
+
<content>
|
204
|
+
<blockList id="2.list0">
|
205
|
+
<listIntroduction>title</listIntroduction>
|
206
|
+
<item id="2.list0.a">
|
207
|
+
<num>(a)</num>
|
208
|
+
<p>one</p>
|
209
|
+
</item>
|
210
|
+
<item id="2.list0.b">
|
211
|
+
<num>(b)</num>
|
212
|
+
<p>two</p>
|
213
|
+
</item>
|
214
|
+
<item id="2.list0.c">
|
215
|
+
<num>(c)</num>
|
216
|
+
<p>three</p>
|
217
|
+
</item>
|
218
|
+
<item id="2.list0.i">
|
219
|
+
<num>(i)</num>
|
220
|
+
<p>four</p>
|
221
|
+
</item>
|
222
|
+
</blockList>
|
223
|
+
</content>
|
224
|
+
</subsection>'
|
139
225
|
end
|
140
226
|
|
141
227
|
it 'should handle a subsection that dives straight into a list' do
|
@@ -149,6 +235,29 @@ EOS
|
|
149
235
|
node.statement.content.should be_nil
|
150
236
|
node.blocklist.elements.first.num.should == "(a)"
|
151
237
|
node.blocklist.elements.first.content.should == "one"
|
238
|
+
to_xml(node, "").should == '<subsection id="1">
|
239
|
+
<num>(1)</num>
|
240
|
+
<content>
|
241
|
+
<blockList id="1.list0">
|
242
|
+
<item id="1.list0.a">
|
243
|
+
<num>(a)</num>
|
244
|
+
<p>one</p>
|
245
|
+
</item>
|
246
|
+
<item id="1.list0.b">
|
247
|
+
<num>(b)</num>
|
248
|
+
<p>two</p>
|
249
|
+
</item>
|
250
|
+
<item id="1.list0.c">
|
251
|
+
<num>(c)</num>
|
252
|
+
<p>three</p>
|
253
|
+
</item>
|
254
|
+
<item id="1.list0.i">
|
255
|
+
<num>(i)</num>
|
256
|
+
<p>four</p>
|
257
|
+
</item>
|
258
|
+
</blockList>
|
259
|
+
</content>
|
260
|
+
</subsection>'
|
152
261
|
end
|
153
262
|
|
154
263
|
it 'should handle a blocklist that dives straight into another list' do
|
@@ -166,6 +275,29 @@ EOS
|
|
166
275
|
node.blocklist.elements[1].content.should be_nil
|
167
276
|
node.blocklist.elements[2].num.should == "(i)"
|
168
277
|
node.blocklist.elements[2].content.should == "single"
|
278
|
+
to_xml(node, "").should == '<subsection id="1">
|
279
|
+
<num>(1)</num>
|
280
|
+
<content>
|
281
|
+
<blockList id="1.list0">
|
282
|
+
<listIntroduction>here\'s my really cool list,</listIntroduction>
|
283
|
+
<item id="1.list0.a">
|
284
|
+
<num>(a)</num>
|
285
|
+
<p>one</p>
|
286
|
+
</item>
|
287
|
+
<item id="1.list0.b">
|
288
|
+
<num>(b)</num>
|
289
|
+
</item>
|
290
|
+
<item id="1.list0.i">
|
291
|
+
<num>(i)</num>
|
292
|
+
<p>single</p>
|
293
|
+
</item>
|
294
|
+
<item id="1.list0.ii">
|
295
|
+
<num>(ii)</num>
|
296
|
+
<p>double</p>
|
297
|
+
</item>
|
298
|
+
</blockList>
|
299
|
+
</content>
|
300
|
+
</subsection>'
|
169
301
|
end
|
170
302
|
|
171
303
|
context 'dotted numbers' do
|
@@ -199,17 +331,51 @@ EOS
|
|
199
331
|
# Remarks
|
200
332
|
|
201
333
|
describe 'remark' do
|
202
|
-
it 'should handle
|
203
|
-
|
334
|
+
it 'should handle a plain remark' do
|
335
|
+
node = parse :subsection, <<EOS
|
204
336
|
[[Section 2 amended by Act 23 of 2004]]
|
205
337
|
EOS
|
338
|
+
to_xml(node, "").should == '<subsection id="subsection-0">
|
339
|
+
<content>
|
340
|
+
<p>
|
341
|
+
<remark status="editorial">[Section 2 amended by Act 23 of 2004]</remark>
|
342
|
+
</p>
|
343
|
+
</content>
|
344
|
+
</subsection>'
|
206
345
|
end
|
207
346
|
|
208
|
-
it 'should handle a
|
209
|
-
node = parse :
|
210
|
-
[[Section 2 amended by Act 23 of 2004]]
|
347
|
+
it 'should handle an inline remark at the end of a sentence' do
|
348
|
+
node = parse :subsection, <<EOS
|
349
|
+
This statement has an inline remark. [[Section 2 amended by Act 23 of 2004]]
|
350
|
+
EOS
|
351
|
+
to_xml(node, "").should == '<subsection id="subsection-0">
|
352
|
+
<content>
|
353
|
+
<p>This statement has an inline remark. <remark status="editorial">[Section 2 amended by Act 23 of 2004]</remark></p>
|
354
|
+
</content>
|
355
|
+
</subsection>'
|
356
|
+
end
|
357
|
+
|
358
|
+
it 'should handle an inline remark mid-way through' do
|
359
|
+
node = parse :subsection, <<EOS
|
360
|
+
(1) This statement has an inline remark. [[Section 2 amended by Act 23 of 2004]] And now some more.
|
211
361
|
EOS
|
212
|
-
node.
|
362
|
+
to_xml(node, "").should == '<subsection id="1">
|
363
|
+
<num>(1)</num>
|
364
|
+
<content>
|
365
|
+
<p>This statement has an inline remark. <remark status="editorial">[Section 2 amended by Act 23 of 2004]</remark> And now some more.</p>
|
366
|
+
</content>
|
367
|
+
</subsection>'
|
368
|
+
end
|
369
|
+
|
370
|
+
it 'should handle many inline remarks' do
|
371
|
+
node = parse :subsection, <<EOS
|
372
|
+
This statement has an inline remark. [[Section 2 amended by Act 23 of 2004]]. And now some more. [[Another remark]] [[and another]]
|
373
|
+
EOS
|
374
|
+
to_xml(node, "").should == '<subsection id="subsection-0">
|
375
|
+
<content>
|
376
|
+
<p>This statement has an inline remark. <remark status="editorial">[Section 2 amended by Act 23 of 2004]</remark>. And now some more. <remark status="editorial">[Another remark]</remark> <remark status="editorial">[and another]</remark></p>
|
377
|
+
</content>
|
378
|
+
</subsection>'
|
213
379
|
end
|
214
380
|
|
215
381
|
it 'should handle a remark in a section' do
|
@@ -219,7 +385,7 @@ EOS
|
|
219
385
|
|
220
386
|
[[Section 1 amended by Act 23 of 2004]]
|
221
387
|
EOS
|
222
|
-
to_xml(node
|
388
|
+
to_xml(node).should == '<section id="section-1">
|
223
389
|
<num>1.</num>
|
224
390
|
<heading>Section title</heading>
|
225
391
|
<subsection id="section-1.subsection-0">
|
@@ -234,8 +400,7 @@ EOS
|
|
234
400
|
</p>
|
235
401
|
</content>
|
236
402
|
</subsection>
|
237
|
-
</section>
|
238
|
-
'
|
403
|
+
</section>'
|
239
404
|
end
|
240
405
|
end
|
241
406
|
|
@@ -354,7 +519,7 @@ EOS
|
|
354
519
|
section = node.elements[1].elements[0].elements[1].elements[0].elements[1].elements[1]
|
355
520
|
section.section_title.title.should == ""
|
356
521
|
section.section_title.num.should == "2"
|
357
|
-
section.subsections.elements[0].statement.
|
522
|
+
section.subsections.elements[0].statement.clauses.text_value.should == "Notwithstanding the provision of any other By-law or legislation no person shall—"
|
358
523
|
end
|
359
524
|
|
360
525
|
it 'should handle sections without titles and with subsections' do
|
@@ -381,7 +546,7 @@ EOS
|
|
381
546
|
section = node.elements[1].elements[0].elements[1].elements[0].elements[1].elements[0]
|
382
547
|
section.section_title.title.should == ""
|
383
548
|
section.section_title.num.should == "10"
|
384
|
-
section.subsections.elements[0].statement.
|
549
|
+
section.subsections.elements[0].statement.clauses.text_value.should == "The owner of any premises which is let or sublet to more than one tenant, shall maintain at all times in a clean and sanitary condition every part of such premises as may be used in common by more than one tenant."
|
385
550
|
end
|
386
551
|
end
|
387
552
|
|
@@ -443,7 +608,7 @@ Baz
|
|
443
608
|
Boom
|
444
609
|
EOS
|
445
610
|
|
446
|
-
s = to_xml(node
|
611
|
+
s = to_xml(node)
|
447
612
|
today = Time.now.strftime('%Y-%m-%d')
|
448
613
|
s.should == <<EOS
|
449
614
|
<components>
|
@@ -525,6 +690,7 @@ EOS
|
|
525
690
|
</component>
|
526
691
|
</components>
|
527
692
|
EOS
|
693
|
+
.strip
|
528
694
|
|
529
695
|
end
|
530
696
|
|
@@ -536,7 +702,7 @@ Other than as is set out hereinbelow, no signs other than locality bound signs,
|
|
536
702
|
2. Bar
|
537
703
|
EOS
|
538
704
|
|
539
|
-
s = to_xml(node
|
705
|
+
s = to_xml(node)
|
540
706
|
today = Time.now.strftime('%Y-%m-%d')
|
541
707
|
s.should == <<EOS
|
542
708
|
<components>
|
@@ -580,6 +746,7 @@ EOS
|
|
580
746
|
</component>
|
581
747
|
</components>
|
582
748
|
EOS
|
749
|
+
.strip
|
583
750
|
end
|
584
751
|
end
|
585
752
|
|
@@ -596,7 +763,7 @@ EOS
|
|
596
763
|
EOS
|
597
764
|
|
598
765
|
node.text_value.should == "{|\n| r1c1\n| r1c2\n|-\n| r2c1\n| r2c2\n|}\n"
|
599
|
-
to_xml(node,
|
766
|
+
to_xml(node, "prefix.").should == '<table id="prefix.table0"><tr><td><p>r1c1</p></td>
|
600
767
|
<td><p>r1c2</p></td></tr>
|
601
768
|
<tr><td><p>r2c1</p></td>
|
602
769
|
<td><p>r2c2</p></td></tr></table>'
|
@@ -618,10 +785,23 @@ Heres a table:
|
|
618
785
|
EOS
|
619
786
|
|
620
787
|
xml = to_xml(node)
|
621
|
-
xml.should == '<section id="section-10"
|
788
|
+
xml.should == '<section id="section-10">
|
789
|
+
<num>10.</num>
|
790
|
+
<heading>A section title</heading>
|
791
|
+
<subsection id="section-10.subsection-0">
|
792
|
+
<content>
|
793
|
+
<p>Heres a table:</p>
|
794
|
+
</content>
|
795
|
+
</subsection>
|
796
|
+
<subsection id="section-10.subsection-1">
|
797
|
+
<content>
|
798
|
+
<table id="section-10.subsection-1.table0"><tr><td><p>r1c1</p></td>
|
622
799
|
<td><p>r1c2</p></td></tr>
|
623
800
|
<tr><td><p>r2c1</p></td>
|
624
|
-
<td><p>r2c2</p></td></tr></table
|
801
|
+
<td><p>r2c2</p></td></tr></table>
|
802
|
+
</content>
|
803
|
+
</subsection>
|
804
|
+
</section>'
|
625
805
|
end
|
626
806
|
|
627
807
|
it 'should parse a table in a schedule' do
|
@@ -639,12 +819,67 @@ Heres a table:
|
|
639
819
|
|}
|
640
820
|
EOS
|
641
821
|
|
642
|
-
xml = to_xml(node,
|
822
|
+
xml = to_xml(node, "")
|
643
823
|
today = Time.now.strftime('%Y-%m-%d')
|
644
|
-
xml.should == '<doc name="schedule1"
|
824
|
+
xml.should == '<doc name="schedule1">
|
825
|
+
<meta>
|
826
|
+
<identification source="#slaw">
|
827
|
+
<FRBRWork>
|
828
|
+
<FRBRthis value="/za/act/1980/01/schedule1"/>
|
829
|
+
<FRBRuri value="/za/act/1980/01"/>
|
830
|
+
<FRBRalias value="Schedule 1"/>
|
831
|
+
<FRBRdate date="1980-01-01" name="Generation"/>
|
832
|
+
<FRBRauthor href="#council" as="#author"/>
|
833
|
+
<FRBRcountry value="za"/>
|
834
|
+
</FRBRWork>
|
835
|
+
<FRBRExpression>
|
836
|
+
<FRBRthis value="/za/act/1980/01/eng@/schedule1"/>
|
837
|
+
<FRBRuri value="/za/act/1980/01/eng@"/>
|
838
|
+
<FRBRdate date="1980-01-01" name="Generation"/>
|
839
|
+
<FRBRauthor href="#council" as="#author"/>
|
840
|
+
<FRBRlanguage language="eng"/>
|
841
|
+
</FRBRExpression>
|
842
|
+
<FRBRManifestation>
|
843
|
+
<FRBRthis value="/za/act/1980/01/eng@/schedule1"/>
|
844
|
+
<FRBRuri value="/za/act/1980/01/eng@"/>
|
845
|
+
<FRBRdate date="' + today + '" name="Generation"/>
|
846
|
+
<FRBRauthor href="#slaw" as="#author"/>
|
847
|
+
</FRBRManifestation>
|
848
|
+
</identification>
|
849
|
+
</meta>
|
850
|
+
<mainBody>
|
851
|
+
<article id="schedule-1">
|
852
|
+
<content>
|
853
|
+
<p>Heres a table:</p>
|
854
|
+
<table id="schedule-1.table0"><tr><td><p>r1c1</p></td>
|
645
855
|
<td><p>r1c2</p></td></tr>
|
646
856
|
<tr><td><p>r2c1</p></td>
|
647
|
-
<td><p>r2c2</p></td></tr></table
|
857
|
+
<td><p>r2c2</p></td></tr></table>
|
858
|
+
</content>
|
859
|
+
</article>
|
860
|
+
</mainBody>
|
861
|
+
</doc>'
|
862
|
+
end
|
863
|
+
end
|
864
|
+
|
865
|
+
#-------------------------------------------------------------------------------
|
866
|
+
# clauses
|
867
|
+
|
868
|
+
context 'clauses' do
|
869
|
+
it 'should handle a simple clause' do
|
870
|
+
node = parse :clauses, "simple text"
|
871
|
+
node.text_value.should == "simple text"
|
872
|
+
end
|
873
|
+
|
874
|
+
it 'should handle a clause with a remark' do
|
875
|
+
node = parse :clauses, "simple [[remark]]. text"
|
876
|
+
node.text_value.should == "simple [[remark]]. text"
|
877
|
+
node.elements[1].elements.first.is_a?(Slaw::ZA::Act::Remark).should be_true
|
878
|
+
|
879
|
+
node = parse :clauses, "simple [[remark]][[another]] text"
|
880
|
+
node.text_value.should == "simple [[remark]][[another]] text"
|
881
|
+
node.elements[1].elements.first.is_a?(Slaw::ZA::Act::Remark).should be_true
|
882
|
+
node.elements[2].elements.first.is_a?(Slaw::ZA::Act::Remark).should be_true
|
648
883
|
end
|
649
884
|
end
|
650
885
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slaw
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Greg Kempe
|
@@ -80,20 +80,6 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '1.5'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: builder
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: 3.2.2
|
90
|
-
type: :runtime
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: 3.2.2
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
84
|
name: log4r
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|