slaw 0.6.3 → 0.6.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aa99a0d10c55f90c3cc64dc38caf91b986b94ab1
4
- data.tar.gz: afd8583f42680e2caa287d5ebc993b616e4eeac8
3
+ metadata.gz: c18d054d1825b20bfc2dcf608a445e2d4b3a0c6a
4
+ data.tar.gz: 73cc58395c8f2d8dda8117d592f7c9faf48e57b2
5
5
  SHA512:
6
- metadata.gz: 617cfdd201458cf85da6ea524e8e97ee955473825e1064fc86684adfcd9418faca2c9a4626c8c0654e3ecdcd2705199ab154c7cd1bd8a018380e8654ccaae842
7
- data.tar.gz: 6c987cb5f14663c1e5ad5fa73af06554afc2b1cd4a6ea2732592ab5b7180aa3834799e449f68c315ed1e0d1396f5b4b7b5371bd31e682011924e56b29308adc7
6
+ metadata.gz: b91f7c896b92dcd42cf81bb23118921db55653695c9f65093a917f9e3d0fc3b849f11f9ce1e6b494cd85df5ac8ba84d871bd6c472c001fffa3f4c41c1fecdcbd
7
+ data.tar.gz: 317aba38148c36f8753009ff417e8bca9550e101a0ef4e5f18e923170ddf4a7f121b312eadf98b9b8b33d626f703c7b65696e0bae5cad4f3adbc6efa03b1ce2e
data/lib/slaw/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Slaw
2
- VERSION = "0.6.3"
2
+ VERSION = "0.6.4"
3
3
  end
@@ -38,7 +38,7 @@ module Slaw
38
38
  end
39
39
 
40
40
  rule subsection
41
- statement:(numbered_statement / naked_statement)
41
+ statement:(numbered_statement / table / naked_statement)
42
42
  blocklist:blocklist? <Subsection>
43
43
  end
44
44
 
@@ -48,7 +48,7 @@ module Slaw
48
48
 
49
49
  rule schedule
50
50
  schedule_heading
51
- statements:schedule_statement* <Schedule>
51
+ statements:(table / schedule_statement)* <Schedule>
52
52
  end
53
53
 
54
54
  ##########
@@ -120,6 +120,23 @@ module Slaw
120
120
 
121
121
  rule schedule_statement
122
122
  space? (!schedule_heading) content eol
123
+ <ScheduleStatement>
124
+ end
125
+
126
+ ##########
127
+ # tables
128
+
129
+ rule table
130
+ space? table_start eol? (!table_end content eol)* table_end eol
131
+ <Table>
132
+ end
133
+
134
+ rule table_start
135
+ space? '{|'
136
+ end
137
+
138
+ rule table_end
139
+ space? '|}'
123
140
  end
124
141
 
125
142
  ##########
@@ -1,3 +1,5 @@
1
+ require 'wikicloth'
2
+
1
3
  module Slaw
2
4
  module ZA
3
5
  module Act
@@ -252,7 +254,7 @@ module Slaw
252
254
  end
253
255
  else
254
256
  # raw content
255
- b.p(statement.content.text_value) if statement.content
257
+ statement.to_xml(b, idprefix)
256
258
  end
257
259
  }
258
260
  }
@@ -275,9 +277,16 @@ module Slaw
275
277
  elements[3].content
276
278
  end
277
279
  end
280
+
281
+ def to_xml(b, idprefix)
282
+ b.p(content.text_value) if content
283
+ end
278
284
  end
279
285
 
280
286
  class NakedStatement < Treetop::Runtime::SyntaxNode
287
+ def to_xml(b, idprefix)
288
+ b.p(content.text_value) if content
289
+ end
281
290
  end
282
291
 
283
292
  class Blocklist < Treetop::Runtime::SyntaxNode
@@ -313,6 +322,31 @@ module Slaw
313
322
  end
314
323
  end
315
324
 
325
+ class Table < Treetop::Runtime::SyntaxNode
326
+ def to_xml(b, idprefix)
327
+ # parse the table using wikicloth
328
+ html = WikiCloth::Parser.new({data: self.text_value}).to_html
329
+
330
+ # we need to strip any surrounding p tags and add
331
+ # an id to the table
332
+ html = Nokogiri::HTML(html)
333
+ table = html.css("table").first
334
+ table['id'] = "#{idprefix}table0"
335
+
336
+ # wrap td and th content in p tags
337
+ table.css("td, th").each do |cell|
338
+ p = Nokogiri::XML::Node.new("p", html)
339
+ p.children = cell.children
340
+ p.parent = cell
341
+ end
342
+
343
+ table.xpath('//text()[1]').each{ |t| t.content = t.content.lstrip }
344
+ table.xpath('//text()[last()]').each{ |t| t.content = t.content.rstrip }
345
+
346
+ b << table.to_html
347
+ end
348
+ end
349
+
316
350
  class ScheduleContainer < Treetop::Runtime::SyntaxNode
317
351
  def to_xml(b)
318
352
  return if schedules.elements.empty?
@@ -389,13 +423,19 @@ module Slaw
389
423
  b.article(id: id) { |b|
390
424
  b.heading(heading) if heading
391
425
  b.content { |b|
392
- statements.elements.each { |e| b.p(e.content.text_value) }
426
+ statements.elements.each { |e| e.to_xml(b, id + '.') }
393
427
  }
394
428
  }
395
429
  }
396
430
  }
397
431
  end
398
432
  end
433
+
434
+ class ScheduleStatement < Treetop::Runtime::SyntaxNode
435
+ def to_xml(b, idprefix)
436
+ b.p(content.text_value) if content
437
+ end
438
+ end
399
439
  end
400
440
  end
401
441
  end
data/slaw.gemspec CHANGED
@@ -29,4 +29,5 @@ Gem::Specification.new do |spec|
29
29
  spec.add_runtime_dependency "thor", "~> 0.19.1"
30
30
  spec.add_runtime_dependency "mimemagic", "~> 0.2.1"
31
31
  spec.add_runtime_dependency 'yomu', '~> 0.2.2'
32
+ spec.add_runtime_dependency 'wikicloth', '~> 0.8.3'
32
33
  end
data/spec/za/act_spec.rb CHANGED
@@ -21,10 +21,10 @@ describe Slaw::ActGenerator do
21
21
  end
22
22
  end
23
23
 
24
- def to_xml(node)
24
+ def to_xml(node, *args)
25
25
  s = ""
26
26
  b = Builder::XmlMarkup.new(target: s)
27
- node.to_xml(b)
27
+ node.to_xml(b, *args)
28
28
  s
29
29
  end
30
30
 
@@ -548,4 +548,68 @@ EOS
548
548
  EOS
549
549
  end
550
550
  end
551
+
552
+ describe 'tables' do
553
+ it 'should parse basic tables' do
554
+ node = parse :table, <<EOS
555
+ {|
556
+ | r1c1
557
+ | r1c2
558
+ |-
559
+ | r2c1
560
+ | r2c2
561
+ |}
562
+ EOS
563
+
564
+ node.text_value.should == "{|\n| r1c1\n| r1c2\n|-\n| r2c1\n| r2c2\n|}\n"
565
+ to_xml(node, "prefix.").should == '<table id="prefix.table0"><tr><td><p>r1c1</p></td>
566
+ <td><p>r1c2</p></td></tr>
567
+ <tr><td><p>r2c1</p></td>
568
+ <td><p>r2c2</p></td></tr></table>'
569
+ end
570
+
571
+ it 'should parse a table in a section' do
572
+ node = parse :section, <<EOS
573
+ 10. A section title
574
+
575
+ Heres a table:
576
+
577
+ {|
578
+ | r1c1
579
+ | r1c2
580
+ |-
581
+ | r2c1
582
+ | r2c2
583
+ |}
584
+ EOS
585
+
586
+ xml = to_xml(node)
587
+ xml.should == '<section id="section-10"><num>10.</num><heading>A section title</heading><subsection id="section-10.subsection-0"><content><p>Heres a table:</p></content></subsection><subsection id="section-10.subsection-1"><content><table id="section-10.subsection-1.table0"><tr><td><p>r1c1</p></td>
588
+ <td><p>r1c2</p></td></tr>
589
+ <tr><td><p>r2c1</p></td>
590
+ <td><p>r2c2</p></td></tr></table></content></subsection></section>'
591
+ end
592
+
593
+ it 'should parse a table in a schedule' do
594
+ node = parse :schedule, <<EOS
595
+ Schedule 1
596
+
597
+ Heres a table:
598
+
599
+ {|
600
+ | r1c1
601
+ | r1c2
602
+ |-
603
+ | r2c1
604
+ | r2c2
605
+ |}
606
+ EOS
607
+
608
+ xml = to_xml(node, "")
609
+ xml.should == '<doc name="schedule1"><meta><identification source="#slaw"><FRBRWork><FRBRthis value="/za/act/1980/01/schedule1"/><FRBRuri value="/za/act/1980/01"/><FRBRalias value="Schedule 1"/><FRBRdate date="1980-01-01" name="Generation"/><FRBRauthor href="#council" as="#author"/><FRBRcountry value="za"/></FRBRWork><FRBRExpression><FRBRthis value="/za/act/1980/01/eng@/schedule1"/><FRBRuri value="/za/act/1980/01/eng@"/><FRBRdate date="1980-01-01" name="Generation"/><FRBRauthor href="#council" as="#author"/><FRBRlanguage language="eng"/></FRBRExpression><FRBRManifestation><FRBRthis value="/za/act/1980/01/eng@/schedule1"/><FRBRuri value="/za/act/1980/01/eng@"/><FRBRdate date="2015-05-13" name="Generation"/><FRBRauthor href="#slaw" as="#author"/></FRBRManifestation></identification></meta><mainBody><article id="schedule-1"><content><p>Heres a table:</p><table id="schedule-1.table0"><tr><td><p>r1c1</p></td>
610
+ <td><p>r1c2</p></td></tr>
611
+ <tr><td><p>r2c1</p></td>
612
+ <td><p>r2c2</p></td></tr></table></content></article></mainBody></doc>'
613
+ end
614
+ end
551
615
  end
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.6.3
4
+ version: 0.6.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Greg Kempe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-05 00:00:00.000000000 Z
11
+ date: 2015-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -150,6 +150,20 @@ dependencies:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: 0.2.2
153
+ - !ruby/object:Gem::Dependency
154
+ name: wikicloth
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: 0.8.3
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: 0.8.3
153
167
  description: Slaw is a lightweight library for rendering and generating Akoma Ntoso
154
168
  acts from plain text and PDF documents.
155
169
  email: