slaw 0.17.2 → 1.0.0.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,3 @@
1
1
  module Slaw
2
- VERSION = "0.17.2"
2
+ VERSION = "1.0.0.alpha.1"
3
3
  end
@@ -4,6 +4,8 @@ require 'spec_helper'
4
4
  require 'slaw'
5
5
 
6
6
  describe Slaw::ActGenerator do
7
+ subject { Slaw::ActGenerator.new('za') }
8
+
7
9
  describe 'guess_section_number_after_title' do
8
10
  context 'section number after title' do
9
11
  it 'should work' do
@@ -715,54 +715,6 @@ XML
715
715
  end
716
716
  end
717
717
 
718
- describe '#guess_at_definitions' do
719
- it 'should find definitions in p elements' do
720
- doc = xml2doc(section(<<XML
721
- <heading>Definitions</heading>
722
- <subsection id="section-1.subsection-1">
723
- <content>
724
- <p>“authorised official” means any official of the Council who has been authorised by it to administer, implement and enforce the provisions of these By-laws;</p>
725
- </content>
726
- </subsection>
727
- <subsection id="section-1.subsection-2">
728
- <content>
729
- <blockList id="section-1.subsection-2.list2">
730
- <listIntroduction>
731
- “Council” means – </listIntroduction>
732
- <item id="section-1.subsection-2.list2.a">
733
- <num>(a)</num>
734
- <p>the Metropolitan Municipality of the City of Johannesburg established by Provincial Notice No. 6766 of 2000 dated 1 October 2000, as amended, exercising its legislative and executive authority through its municipal Council; or</p>
735
- </item>
736
- </blockList>
737
- </content>
738
- </subsection>
739
- XML
740
- ))
741
-
742
- subject.guess_at_definitions(doc)
743
- doc.to_s.should == section(<<XML
744
- <heading>Definitions</heading>
745
- <subsection id="section-1.subsection-1" refersTo="#term-authorised_official">
746
- <content>
747
- <p>"<def refersTo="#term-authorised_official">authorised official</def>" means any official of the Council who has been authorised by it to administer, implement and enforce the provisions of these By-laws;</p>
748
- </content>
749
- </subsection>
750
- <subsection id="section-1.subsection-2">
751
- <content>
752
- <blockList id="section-1.subsection-2.list2" refersTo="#term-Council">
753
- <listIntroduction>"<def refersTo="#term-Council">Council</def>" means – </listIntroduction>
754
- <item id="section-1.subsection-2.list2.a">
755
- <num>(a)</num>
756
- <p>the Metropolitan Municipality of the City of Johannesburg established by Provincial Notice No. 6766 of 2000 dated 1 October 2000, as amended, exercising its legislative and executive authority through its municipal Council; or</p>
757
- </item>
758
- </blockList>
759
- </content>
760
- </subsection>
761
- XML
762
- )
763
- end
764
- end
765
-
766
718
  describe '#normalise_headings' do
767
719
  it 'should normalise ALL CAPS headings' do
768
720
  doc = xml2doc(section(<<XML
@@ -0,0 +1,449 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'slaw'
4
+
5
+ describe Slaw::ActGenerator do
6
+ subject { Slaw::ActGenerator.new('pl') }
7
+
8
+ def parse(rule, s)
9
+ subject.builder.text_to_syntax_tree(s, {root: rule})
10
+ end
11
+
12
+ def should_parse(rule, s)
13
+ s << "\n" unless s.end_with?("\n")
14
+ tree = subject.builder.text_to_syntax_tree(s, {root: rule})
15
+
16
+ if not tree
17
+ raise Exception.new(subject.failure_reason || "Couldn't match to grammar") if tree.nil?
18
+ else
19
+ # count an assertion
20
+ tree.should_not be_nil
21
+ end
22
+ end
23
+
24
+ def to_xml(node, *args)
25
+ b = ::Nokogiri::XML::Builder.new
26
+ node.to_xml(b, *args)
27
+ b.doc.root.to_xml(encoding: 'UTF-8')
28
+ end
29
+
30
+ #-------------------------------------------------------------------------------
31
+ # Basics
32
+
33
+ describe 'full test' do
34
+ it 'should handle a full hierarchy' do
35
+ node = parse :body, <<EOS
36
+ DZIAŁ I
37
+
38
+ Projekt ustawy
39
+
40
+ Rozdział 7. Oznaczanie przepisów ustawy i ich systematyzacja
41
+
42
+ § 54. Podstawową jednostką redakcyjną ustawy jest artykuł.
43
+
44
+ § 55. 1. Każdą samodzielną myśl ujmuje się w odrębny artykuł.
45
+ 2. Artykuł powinien być w miarę możliwości jednozdaniowy.
46
+ 3. Jeżeli samodzielną myśl wyraża zespół zdań, dokonuje się podziału artykułu na ustępy. W ustawie określanej jako "kodeks" ustępy oznacza się paragrafami (§).
47
+ 4. Podział artykułu na ustępy wprowadza się także w przypadku, gdy między zdaniami wyrażającymi samodzielne myśli występują powiązania treściowe, ale treść żadnego z nich nie jest na tyle istotna, aby wydzielić ją w odrębny artykuł.
48
+
49
+ § 56. 1. W obrębie artykułu (ustępu) zawierającego wyliczenie wyróżnia się dwie części: wprowadzenie do wyliczenia oraz punkty. Wyliczenie może kończyć się częścią wspólną, odnoszącą się do wszystkich punktów. Po części wspólnej nie dodaje się kolejnej samodzielnej myśli; w razie potrzeby formułuje się ją w kolejnym ustępie.
50
+ 2. W obrębie punktów można dokonać dalszego wyliczenia, wprowadzając litery.
51
+ EOS
52
+
53
+ to_xml(node).should == '<body>
54
+ <division id="division-I">
55
+ <num>I</num>
56
+ <paragraph id="division-I.paragraph-0">
57
+ <content>
58
+ <p>Projekt ustawy</p>
59
+ </content>
60
+ </paragraph>
61
+ <chapter id="chapter-7">
62
+ <num>7</num>
63
+ <heading>Oznaczanie przepisów ustawy i ich systematyzacja</heading>
64
+ <section id="section-54">
65
+ <num>54.</num>
66
+ <content>
67
+ <p>Podstawową jednostką redakcyjną ustawy jest artykuł.</p>
68
+ </content>
69
+ </section>
70
+ <section id="section-55">
71
+ <num>55.</num>
72
+ <paragraph id="section-55.paragraph-1">
73
+ <num>1.</num>
74
+ <content>
75
+ <p>Każdą samodzielną myśl ujmuje się w odrębny artykuł.</p>
76
+ </content>
77
+ </paragraph>
78
+ <paragraph id="section-55.paragraph-2">
79
+ <num>2.</num>
80
+ <content>
81
+ <p>Artykuł powinien być w miarę możliwości jednozdaniowy.</p>
82
+ </content>
83
+ </paragraph>
84
+ <paragraph id="section-55.paragraph-3">
85
+ <num>3.</num>
86
+ <content>
87
+ <p>Jeżeli samodzielną myśl wyraża zespół zdań, dokonuje się podziału artykułu na ustępy. W ustawie określanej jako "kodeks" ustępy oznacza się paragrafami (§).</p>
88
+ </content>
89
+ </paragraph>
90
+ <paragraph id="section-55.paragraph-4">
91
+ <num>4.</num>
92
+ <content>
93
+ <p>Podział artykułu na ustępy wprowadza się także w przypadku, gdy między zdaniami wyrażającymi samodzielne myśli występują powiązania treściowe, ale treść żadnego z nich nie jest na tyle istotna, aby wydzielić ją w odrębny artykuł.</p>
94
+ </content>
95
+ </paragraph>
96
+ </section>
97
+ <section id="section-56">
98
+ <num>56.</num>
99
+ <paragraph id="section-56.paragraph-1">
100
+ <num>1.</num>
101
+ <content>
102
+ <p>W obrębie artykułu (ustępu) zawierającego wyliczenie wyróżnia się dwie części: wprowadzenie do wyliczenia oraz punkty. Wyliczenie może kończyć się częścią wspólną, odnoszącą się do wszystkich punktów. Po części wspólnej nie dodaje się kolejnej samodzielnej myśli; w razie potrzeby formułuje się ją w kolejnym ustępie.</p>
103
+ </content>
104
+ </paragraph>
105
+ <paragraph id="section-56.paragraph-2">
106
+ <num>2.</num>
107
+ <content>
108
+ <p>W obrębie punktów można dokonać dalszego wyliczenia, wprowadzając litery.</p>
109
+ </content>
110
+ </paragraph>
111
+ </section>
112
+ </chapter>
113
+ </division>
114
+ </body>'
115
+ end
116
+ end
117
+
118
+ #-------------------------------------------------------------------------------
119
+ # Articles
120
+
121
+ describe 'articles' do
122
+ it 'should handle articles' do
123
+ node = parse :article, <<EOS
124
+ Art. 1. Ustawa reguluje opodatkowanie podatkiem dochodowym dochodów osób fizycznych
125
+ EOS
126
+ to_xml(node).should == '<article id="article-1">
127
+ <num>1.</num>
128
+ <content>
129
+ <p>Ustawa reguluje opodatkowanie podatkiem dochodowym dochodów osób fizycznych</p>
130
+ </content>
131
+ </article>'
132
+ end
133
+
134
+ it 'should handle consecutive articles' do
135
+ node = parse :body, <<EOS
136
+ Art. 1. Ustawa reguluje opodatkowanie podatkiem dochodowym dochodów osób fizycznych
137
+ Art. 2. Something else
138
+ EOS
139
+ to_xml(node).should == '<body>
140
+ <article id="article-1">
141
+ <num>1.</num>
142
+ <content>
143
+ <p>Ustawa reguluje opodatkowanie podatkiem dochodowym dochodów osób fizycznych</p>
144
+ </content>
145
+ </article>
146
+ <article id="article-2">
147
+ <num>2.</num>
148
+ <content>
149
+ <p>Something else</p>
150
+ </content>
151
+ </article>
152
+ </body>'
153
+ end
154
+
155
+ it 'should handle nested content' do
156
+ node = parse :article, <<EOS
157
+ Art. 2. 1. Przepisów ustawy nie stosuje się do:
158
+ 1) przychodów z działalności rolniczej, z wyjątkiem przychodów z działów specjalnych produkcji rolnej;
159
+ 2) przychodów z gospodarki leśnej w rozumieniu ustawy o lasach;
160
+ EOS
161
+ to_xml(node).should == '<article id="article-2">
162
+ <num>2.</num>
163
+ <paragraph id="article-2.paragraph-1">
164
+ <num>1.</num>
165
+ <intro>
166
+ <p>Przepisów ustawy nie stosuje się do:</p>
167
+ </intro>
168
+ <point id="article-2.paragraph-1.point-1">
169
+ <num>1)</num>
170
+ <content>
171
+ <p>przychodów z działalności rolniczej, z wyjątkiem przychodów z działów specjalnych produkcji rolnej;</p>
172
+ </content>
173
+ </point>
174
+ <point id="article-2.paragraph-1.point-2">
175
+ <num>2)</num>
176
+ <content>
177
+ <p>przychodów z gospodarki leśnej w rozumieniu ustawy o lasach;</p>
178
+ </content>
179
+ </point>
180
+ </paragraph>
181
+ </article>'
182
+ end
183
+ end
184
+
185
+ #-------------------------------------------------------------------------------
186
+ # Divisions
187
+
188
+ describe 'divisions' do
189
+ it 'should handle divisions' do
190
+ node = parse :division, <<EOS
191
+ DZIAŁ I
192
+ Projekt ustawy
193
+
194
+ Rozdział 7. Oznaczanie przepisów ustawy i ich systematyzacja
195
+
196
+ § 54. Podstawową jednostką redakcyjną ustawy jest artykuł.
197
+ EOS
198
+ to_xml(node).should == '<division id="division-I">
199
+ <num>I</num>
200
+ <heading>Projekt ustawy</heading>
201
+ <chapter id="chapter-7">
202
+ <num>7</num>
203
+ <heading>Oznaczanie przepisów ustawy i ich systematyzacja</heading>
204
+ <section id="section-54">
205
+ <num>54.</num>
206
+ <content>
207
+ <p>Podstawową jednostką redakcyjną ustawy jest artykuł.</p>
208
+ </content>
209
+ </section>
210
+ </chapter>
211
+ </division>'
212
+ end
213
+ end
214
+
215
+ #-------------------------------------------------------------------------------
216
+ # Subdivisions
217
+
218
+ describe 'subdivisions' do
219
+ it 'should handle subdivisions' do
220
+ node = parse :subdivision, <<EOS
221
+ ODDZIAŁ I
222
+ Projekt ustawy
223
+
224
+ § 54. Podstawową jednostką redakcyjną ustawy jest artykuł.
225
+ EOS
226
+ to_xml(node).should == '<subdivision id="subdivision-I">
227
+ <num>I</num>
228
+ <heading>Projekt ustawy</heading>
229
+ <section id="section-54">
230
+ <num>54.</num>
231
+ <content>
232
+ <p>Podstawową jednostką redakcyjną ustawy jest artykuł.</p>
233
+ </content>
234
+ </section>
235
+ </subdivision>'
236
+ end
237
+ end
238
+
239
+ #-------------------------------------------------------------------------------
240
+ # Paragraph
241
+
242
+ describe 'paragraph' do
243
+ it 'should handle simple para' do
244
+ node = parse :paragraph, <<EOS
245
+ 1. Każdą samodzielną myśl ujmuje się w odrębny artykuł.
246
+ EOS
247
+
248
+ to_xml(node).should == '<paragraph id="paragraph-1">
249
+ <num>1.</num>
250
+ <content>
251
+ <p>Każdą samodzielną myśl ujmuje się w odrębny artykuł.</p>
252
+ </content>
253
+ </paragraph>'
254
+ end
255
+
256
+ it 'should handle an empty para' do
257
+ node = parse :paragraph, <<EOS
258
+ 1.
259
+ EOS
260
+
261
+ to_xml(node).should == '<paragraph id="paragraph-1">
262
+ <num>1.</num>
263
+ <content>
264
+ <p/>
265
+ </content>
266
+ </paragraph>'
267
+ end
268
+
269
+ it 'should handle paragraphs with points' do
270
+ node = parse :paragraph, <<EOS
271
+ 2. W ustawie należy unikać posługiwania się:
272
+ 1) określeniami specjalistycznymi, o ile ich użycie nie jest powodowane zapewnieniem należytej precyzji tekstu;
273
+ 2) określeniami lub zapożyczeniami obcojęzycznymi, chyba że nie mają dokładnego odpowiednika w języku polskim;
274
+ 3) nowo tworzonymi pojęciami lub strukturami językowymi, chyba że w dotychczasowym słownictwie polskim brak jest odpowiedniego określenia.
275
+ EOS
276
+
277
+ to_xml(node).should == '<paragraph id="paragraph-2">
278
+ <num>2.</num>
279
+ <intro>
280
+ <p>W ustawie należy unikać posługiwania się:</p>
281
+ </intro>
282
+ <point id="paragraph-2.point-1">
283
+ <num>1)</num>
284
+ <content>
285
+ <p>określeniami specjalistycznymi, o ile ich użycie nie jest powodowane zapewnieniem należytej precyzji tekstu;</p>
286
+ </content>
287
+ </point>
288
+ <point id="paragraph-2.point-2">
289
+ <num>2)</num>
290
+ <content>
291
+ <p>określeniami lub zapożyczeniami obcojęzycznymi, chyba że nie mają dokładnego odpowiednika w języku polskim;</p>
292
+ </content>
293
+ </point>
294
+ <point id="paragraph-2.point-3">
295
+ <num>3)</num>
296
+ <content>
297
+ <p>nowo tworzonymi pojęciami lub strukturami językowymi, chyba że w dotychczasowym słownictwie polskim brak jest odpowiedniego określenia.</p>
298
+ </content>
299
+ </point>
300
+ </paragraph>'
301
+ end
302
+ end
303
+
304
+ #-------------------------------------------------------------------------------
305
+ # Section
306
+
307
+ describe 'section' do
308
+ it 'should handle section with un-numbered para' do
309
+ node = parse :section, <<EOS
310
+ § 5.
311
+
312
+ Przepisy ustawy redaguje si´ zwi´êle i syntetycznie, unikajàc nadmiernej szczegó∏owoÊci, a zarazem w sposób, w jaki opisuje si´ typowe sytuacje wyst´pujàce w dziedzinie spraw regulowanych tà ustawà.
313
+ EOS
314
+
315
+ to_xml(node).should == '<section id="section-5">
316
+ <num>5.</num>
317
+ <content>
318
+ <p>Przepisy ustawy redaguje si´ zwi´êle i syntetycznie, unikajàc nadmiernej szczegó∏owoÊci, a zarazem w sposób, w jaki opisuje si´ typowe sytuacje wyst´pujàce w dziedzinie spraw regulowanych tà ustawà.</p>
319
+ </content>
320
+ </section>'
321
+ end
322
+
323
+ it 'should handle section with numbered para on the same line' do
324
+ node = parse :section, <<EOS
325
+ § 54. Podstawową jednostką redakcyjną ustawy jest artykuł.
326
+ EOS
327
+
328
+ to_xml(node).should == '<section id="section-54">
329
+ <num>54.</num>
330
+ <content>
331
+ <p>Podstawową jednostką redakcyjną ustawy jest artykuł.</p>
332
+ </content>
333
+ </section>'
334
+ end
335
+
336
+ it 'should handle section with numbered paras' do
337
+ node = parse :section, <<EOS
338
+ § 55. 1. Każdą samodzielną myśl ujmuje się w odrębny artykuł.
339
+ 2. Artykuł powinien być w miarę możliwości jednozdaniowy.
340
+ 3. Jeżeli samodzielną myśl wyraża zespół zdań, dokonuje się podziału artykułu na ustępy. W ustawie określanej jako "kodeks" ustępy oznacza się paragrafami (§).
341
+ EOS
342
+
343
+ to_xml(node).should == '<section id="section-55">
344
+ <num>55.</num>
345
+ <paragraph id="section-55.paragraph-1">
346
+ <num>1.</num>
347
+ <content>
348
+ <p>Każdą samodzielną myśl ujmuje się w odrębny artykuł.</p>
349
+ </content>
350
+ </paragraph>
351
+ <paragraph id="section-55.paragraph-2">
352
+ <num>2.</num>
353
+ <content>
354
+ <p>Artykuł powinien być w miarę możliwości jednozdaniowy.</p>
355
+ </content>
356
+ </paragraph>
357
+ <paragraph id="section-55.paragraph-3">
358
+ <num>3.</num>
359
+ <content>
360
+ <p>Jeżeli samodzielną myśl wyraża zespół zdań, dokonuje się podziału artykułu na ustępy. W ustawie określanej jako "kodeks" ustępy oznacza się paragrafami (§).</p>
361
+ </content>
362
+ </paragraph>
363
+ </section>'
364
+ end
365
+
366
+ it 'should handle section with intro, para and points' do
367
+ node = parse :section, <<EOS
368
+ § 54. Podstawową jednostką redakcyjną ustawy jest artykuł.
369
+
370
+ Something here
371
+
372
+ 1) a point
373
+ 2) second point
374
+ EOS
375
+
376
+ to_xml(node).should == '<section id="section-54">
377
+ <num>54.</num>
378
+ <intro>
379
+ <p>Podstawową jednostką redakcyjną ustawy jest artykuł.</p>
380
+ </intro>
381
+ <paragraph id="section-54.paragraph-0">
382
+ <content>
383
+ <p>Something here</p>
384
+ </content>
385
+ </paragraph>
386
+ <point id="section-54.point-1">
387
+ <num>1)</num>
388
+ <content>
389
+ <p>a point</p>
390
+ </content>
391
+ </point>
392
+ <point id="section-54.point-2">
393
+ <num>2)</num>
394
+ <content>
395
+ <p>second point</p>
396
+ </content>
397
+ </point>
398
+ </section>'
399
+ end
400
+ end
401
+
402
+ #-------------------------------------------------------------------------------
403
+ # Point
404
+
405
+ describe 'point' do
406
+ it 'should handle basic point' do
407
+ node = parse :point, <<EOS
408
+ 1) szczegółowy tryb i terminy rozpatrywania wniosków o udzielenie finansowego wsparcia;
409
+ EOS
410
+
411
+ to_xml(node, 'prefix.', 0).should == '<point id="prefix.point-1">
412
+ <num>1)</num>
413
+ <content>
414
+ <p>szczegółowy tryb i terminy rozpatrywania wniosków o udzielenie finansowego wsparcia;</p>
415
+ </content>
416
+ </point>'
417
+ end
418
+
419
+ it 'should handle points with litera' do
420
+ node = parse :point, <<EOS
421
+ 1) dokumenty potwierdzające prawo własności albo prawo użytkowania wieczystego nieruchomości, której dotyczy przedsięwzięcie albo na której położony jest budynek, którego budowę, remont lub przebudowę zamierza się przepro- wadzić w ramach realizacji przedsięwzięcia, w tym:
422
+
423
+ a) oryginał albo potwierdzoną za zgodność z oryginałem kopię wypisu i wyrysu z rejestru gruntów wszystkich dzia- łek ewidencyjnych, na których realizowane jest przedsięwzięcie, wydanego nie wcześniej niż 3 miesiące przed dniem złożenia wniosku, oraz
424
+
425
+ b) numer księgi wieczystej;
426
+ EOS
427
+
428
+ to_xml(node, 'prefix.', 0).should == '<point id="prefix.point-1">
429
+ <num>1)</num>
430
+ <intro>
431
+ <p>dokumenty potwierdzające prawo własności albo prawo użytkowania wieczystego nieruchomości, której dotyczy przedsięwzięcie albo na której położony jest budynek, którego budowę, remont lub przebudowę zamierza się przepro- wadzić w ramach realizacji przedsięwzięcia, w tym:</p>
432
+ </intro>
433
+ <list id="prefix.point-1.list-a">
434
+ <num>a)</num>
435
+ <content>
436
+ <p>oryginał albo potwierdzoną za zgodność z oryginałem kopię wypisu i wyrysu z rejestru gruntów wszystkich dzia- łek ewidencyjnych, na których realizowane jest przedsięwzięcie, wydanego nie wcześniej niż 3 miesiące przed dniem złożenia wniosku, oraz</p>
437
+ </content>
438
+ </list>
439
+ <list id="prefix.point-1.list-b">
440
+ <num>b)</num>
441
+ <content>
442
+ <p>numer księgi wieczystej;</p>
443
+ </content>
444
+ </list>
445
+ </point>'
446
+ end
447
+ end
448
+
449
+ end