slaw 0.17.2 → 1.0.0.alpha.1

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.
@@ -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