slaw 2.2.0 → 3.0.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 +10 -0
- data/bin/slaw +5 -0
- data/lib/slaw/grammars/inlines.treetop +24 -6
- data/lib/slaw/grammars/inlines_nodes.rb +36 -14
- data/lib/slaw/grammars/schedules.treetop +2 -2
- data/lib/slaw/grammars/schedules_nodes.rb +3 -3
- data/lib/slaw/grammars/tables.treetop +1 -1
- data/lib/slaw/grammars/tables_nodes.rb +2 -2
- data/lib/slaw/grammars/za/act.treetop +39 -14
- data/lib/slaw/grammars/za/act_nodes.rb +56 -3
- data/lib/slaw/grammars/za/act_text.xsl +32 -5
- data/lib/slaw/version.rb +1 -1
- data/spec/generator_spec.rb +22 -0
- data/spec/za/act_block_spec.rb +167 -50
- data/spec/za/act_inline_spec.rb +171 -31
- data/spec/za/act_schedules_spec.rb +16 -10
- data/spec/za/act_table_spec.rb +12 -6
- metadata +2 -7
- data/lib/slaw/grammars/pl/act.treetop +0 -240
- data/lib/slaw/grammars/pl/act_nodes.rb +0 -441
- data/lib/slaw/grammars/pl/act_text.xsl +0 -271
- data/spec/pl/act_block_spec.rb +0 -677
@@ -1,271 +0,0 @@
|
|
1
|
-
<?xml version="1.0"?>
|
2
|
-
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
|
3
|
-
xmlns:a="http://www.akomantoso.org/2.0"
|
4
|
-
exclude-result-prefixes="a">
|
5
|
-
|
6
|
-
<xsl:output method="text" indent="no" omit-xml-declaration="yes" />
|
7
|
-
<xsl:strip-space elements="*"/>
|
8
|
-
|
9
|
-
<!-- adds a backslash to the start of the value param, if necessary -->
|
10
|
-
<xsl:template name="escape">
|
11
|
-
<xsl:param name="value"/>
|
12
|
-
|
13
|
-
<xsl:variable name="prefix" select="translate(substring($value, 1, 10), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" />
|
14
|
-
<xsl:variable name="numprefix" select="translate(translate(substring($prefix, 1, 3), '1234567890', 'NNNNNNNNNN'), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'NNNNNNNNNNNNNNNNNNNNNNNNNN')" />
|
15
|
-
|
16
|
-
<!-- p tags must escape initial content that looks like a block element marker.
|
17
|
-
Note that the two hyphens are different characters. -->
|
18
|
-
<xsl:if test="$prefix = 'BODY' or
|
19
|
-
$prefix = 'PREAMBLE' or
|
20
|
-
$prefix = 'PREFACE' or
|
21
|
-
starts-with($prefix, 'ROZDZIA') or
|
22
|
-
starts-with($prefix, 'DZIA') or
|
23
|
-
starts-with($prefix, 'ODDZIA') or
|
24
|
-
starts-with($prefix, 'ART.') or
|
25
|
-
starts-with($prefix, '§') or
|
26
|
-
starts-with($prefix, 'SCHEDULE ') or
|
27
|
-
starts-with($prefix, '{|') or
|
28
|
-
starts-with($numprefix, 'N)') or
|
29
|
-
starts-with($numprefix, 'NN)') or
|
30
|
-
starts-with($numprefix, 'N.') or
|
31
|
-
starts-with($numprefix, 'NN.') or
|
32
|
-
starts-with($numprefix, '-') or
|
33
|
-
starts-with($numprefix, '–')">
|
34
|
-
<xsl:text>\</xsl:text>
|
35
|
-
</xsl:if>
|
36
|
-
<xsl:value-of select="$value"/>
|
37
|
-
</xsl:template>
|
38
|
-
|
39
|
-
<xsl:template match="a:act">
|
40
|
-
<xsl:apply-templates select="a:coverPage" />
|
41
|
-
<xsl:apply-templates select="a:preface" />
|
42
|
-
<xsl:apply-templates select="a:preamble" />
|
43
|
-
<xsl:apply-templates select="a:body" />
|
44
|
-
<xsl:apply-templates select="a:conclusions" />
|
45
|
-
</xsl:template>
|
46
|
-
|
47
|
-
<xsl:template match="a:preface">
|
48
|
-
<xsl:text>PREFACE</xsl:text>
|
49
|
-
<xsl:text>
|
50
|
-
|
51
|
-
</xsl:text>
|
52
|
-
<xsl:apply-templates />
|
53
|
-
</xsl:template>
|
54
|
-
|
55
|
-
<xsl:template match="a:preamble">
|
56
|
-
<xsl:text>PREAMBLE</xsl:text>
|
57
|
-
<xsl:text>
|
58
|
-
|
59
|
-
</xsl:text>
|
60
|
-
<xsl:apply-templates />
|
61
|
-
</xsl:template>
|
62
|
-
|
63
|
-
<xsl:template match="a:division">
|
64
|
-
<xsl:text>Dział </xsl:text>
|
65
|
-
<xsl:value-of select="./a:num" />
|
66
|
-
<xsl:text> - </xsl:text>
|
67
|
-
<xsl:value-of select="./a:heading" />
|
68
|
-
<xsl:text>
|
69
|
-
|
70
|
-
</xsl:text>
|
71
|
-
<xsl:apply-templates select="./*[not(self::a:num) and not(self::a:heading)]" />
|
72
|
-
</xsl:template>
|
73
|
-
|
74
|
-
<xsl:template match="a:chapter">
|
75
|
-
<xsl:text>Rozdział </xsl:text>
|
76
|
-
<xsl:value-of select="./a:num" />
|
77
|
-
<xsl:text> - </xsl:text>
|
78
|
-
<xsl:value-of select="./a:heading" />
|
79
|
-
<xsl:text>
|
80
|
-
|
81
|
-
</xsl:text>
|
82
|
-
<xsl:apply-templates select="./*[not(self::a:num) and not(self::a:heading)]" />
|
83
|
-
</xsl:template>
|
84
|
-
|
85
|
-
<xsl:template match="a:article">
|
86
|
-
<xsl:text>Art. </xsl:text>
|
87
|
-
<xsl:value-of select="a:num" />
|
88
|
-
<xsl:text>
|
89
|
-
|
90
|
-
</xsl:text>
|
91
|
-
<xsl:apply-templates select="./*[not(self::a:num)]" />
|
92
|
-
</xsl:template>
|
93
|
-
|
94
|
-
<xsl:template match="a:section">
|
95
|
-
<xsl:text>§ </xsl:text>
|
96
|
-
<xsl:value-of select="a:num" />
|
97
|
-
<xsl:text>
|
98
|
-
|
99
|
-
</xsl:text>
|
100
|
-
<xsl:apply-templates select="./*[not(self::a:num)]" />
|
101
|
-
</xsl:template>
|
102
|
-
|
103
|
-
<xsl:template match="a:paragraph">
|
104
|
-
<xsl:if test="a:num != ''">
|
105
|
-
<xsl:value-of select="a:num" />
|
106
|
-
<xsl:text> </xsl:text>
|
107
|
-
</xsl:if>
|
108
|
-
<xsl:apply-templates select="./*[not(self::a:num) and not(self::a:heading)]" />
|
109
|
-
</xsl:template>
|
110
|
-
|
111
|
-
<xsl:template match="a:indent">
|
112
|
-
<xsl:value-of select="a:num" />
|
113
|
-
<xsl:text>- </xsl:text>
|
114
|
-
<xsl:apply-templates select="./*[not(self::a:num)]" />
|
115
|
-
</xsl:template>
|
116
|
-
|
117
|
-
<!-- these are block elements and have a newline at the end -->
|
118
|
-
<xsl:template match="a:heading">
|
119
|
-
<xsl:apply-templates />
|
120
|
-
<xsl:text>
|
121
|
-
|
122
|
-
</xsl:text>
|
123
|
-
</xsl:template>
|
124
|
-
|
125
|
-
<xsl:template match="a:p">
|
126
|
-
<xsl:apply-templates/>
|
127
|
-
<!-- p tags must end with a newline -->
|
128
|
-
<xsl:text>
|
129
|
-
|
130
|
-
</xsl:text>
|
131
|
-
</xsl:template>
|
132
|
-
|
133
|
-
<!-- numbered lists -->
|
134
|
-
<xsl:template match="a:item | a:alinea | a:point">
|
135
|
-
<xsl:value-of select="./a:num" />
|
136
|
-
<xsl:text> </xsl:text>
|
137
|
-
<xsl:apply-templates select="./*[not(self::a:num)]" />
|
138
|
-
</xsl:template>
|
139
|
-
|
140
|
-
<xsl:template match="a:list">
|
141
|
-
<xsl:if test="a:intro != ''">
|
142
|
-
<xsl:value-of select="a:intro" />
|
143
|
-
<xsl:text>
|
144
|
-
|
145
|
-
</xsl:text>
|
146
|
-
</xsl:if>
|
147
|
-
<xsl:apply-templates select="./*[not(self::a:intro)]" />
|
148
|
-
</xsl:template>
|
149
|
-
|
150
|
-
<!-- first text nodes of these elems must be escaped if they have special chars -->
|
151
|
-
<xsl:template match="a:p[not(ancestor::a:table)]/text()[1] | a:intro/text()[1]">
|
152
|
-
<xsl:call-template name="escape">
|
153
|
-
<xsl:with-param name="value" select="." />
|
154
|
-
</xsl:call-template>
|
155
|
-
</xsl:template>
|
156
|
-
|
157
|
-
<!-- components/schedules -->
|
158
|
-
<xsl:template match="a:doc">
|
159
|
-
<xsl:text>Schedule - </xsl:text>
|
160
|
-
<xsl:value-of select="a:meta/a:identification/a:FRBRWork/a:FRBRalias/@value" />
|
161
|
-
|
162
|
-
<xsl:if test="a:mainBody/a:article/a:heading">
|
163
|
-
<xsl:text>
|
164
|
-
</xsl:text>
|
165
|
-
<xsl:value-of select="a:mainBody/a:article/a:heading" />
|
166
|
-
</xsl:if>
|
167
|
-
|
168
|
-
<xsl:text>
|
169
|
-
|
170
|
-
</xsl:text>
|
171
|
-
<xsl:apply-templates select="a:mainBody" />
|
172
|
-
</xsl:template>
|
173
|
-
|
174
|
-
<xsl:template match="a:mainBody/a:article/a:heading">
|
175
|
-
<!-- no-op, this is handled by the schedules template above -->
|
176
|
-
</xsl:template>
|
177
|
-
|
178
|
-
<!-- tables -->
|
179
|
-
<xsl:template match="a:table">
|
180
|
-
<xsl:text>{| </xsl:text>
|
181
|
-
|
182
|
-
<!-- attributes -->
|
183
|
-
<xsl:for-each select="@*[local-name()!='id']">
|
184
|
-
<xsl:value-of select="local-name(.)" />
|
185
|
-
<xsl:text>="</xsl:text>
|
186
|
-
<xsl:value-of select="." />
|
187
|
-
<xsl:text>" </xsl:text>
|
188
|
-
</xsl:for-each>
|
189
|
-
<xsl:text>
|
190
|
-
|-</xsl:text>
|
191
|
-
|
192
|
-
<xsl:apply-templates />
|
193
|
-
<xsl:text>
|
194
|
-
|}
|
195
|
-
|
196
|
-
</xsl:text>
|
197
|
-
</xsl:template>
|
198
|
-
|
199
|
-
<xsl:template match="a:tr">
|
200
|
-
<xsl:apply-templates />
|
201
|
-
<xsl:text>
|
202
|
-
|-</xsl:text>
|
203
|
-
</xsl:template>
|
204
|
-
|
205
|
-
<xsl:template match="a:th|a:td">
|
206
|
-
<xsl:choose>
|
207
|
-
<xsl:when test="local-name(.) = 'th'">
|
208
|
-
<xsl:text>
|
209
|
-
! </xsl:text>
|
210
|
-
</xsl:when>
|
211
|
-
<xsl:when test="local-name(.) = 'td'">
|
212
|
-
<xsl:text>
|
213
|
-
| </xsl:text>
|
214
|
-
</xsl:when>
|
215
|
-
</xsl:choose>
|
216
|
-
|
217
|
-
<!-- attributes -->
|
218
|
-
<xsl:if test="@*">
|
219
|
-
<xsl:for-each select="@*">
|
220
|
-
<xsl:value-of select="local-name(.)" />
|
221
|
-
<xsl:text>="</xsl:text>
|
222
|
-
<xsl:value-of select="." />
|
223
|
-
<xsl:text>" </xsl:text>
|
224
|
-
</xsl:for-each>
|
225
|
-
<xsl:text>| </xsl:text>
|
226
|
-
</xsl:if>
|
227
|
-
|
228
|
-
<xsl:apply-templates />
|
229
|
-
</xsl:template>
|
230
|
-
|
231
|
-
<!-- don't end p tags with newlines in tables -->
|
232
|
-
<xsl:template match="a:table//a:p">
|
233
|
-
<xsl:apply-templates />
|
234
|
-
</xsl:template>
|
235
|
-
|
236
|
-
<!-- END tables -->
|
237
|
-
|
238
|
-
<xsl:template match="a:remark">
|
239
|
-
<xsl:text>[</xsl:text>
|
240
|
-
<xsl:apply-templates />
|
241
|
-
<xsl:text>]</xsl:text>
|
242
|
-
</xsl:template>
|
243
|
-
|
244
|
-
<xsl:template match="a:ref">
|
245
|
-
<xsl:text>[</xsl:text>
|
246
|
-
<xsl:apply-templates />
|
247
|
-
<xsl:text>](</xsl:text>
|
248
|
-
<xsl:value-of select="@href" />
|
249
|
-
<xsl:text>)</xsl:text>
|
250
|
-
</xsl:template>
|
251
|
-
|
252
|
-
<xsl:template match="a:img">
|
253
|
-
<xsl:text></xsl:text>
|
258
|
-
</xsl:template>
|
259
|
-
|
260
|
-
<xsl:template match="a:eol">
|
261
|
-
<xsl:text>
|
262
|
-
</xsl:text>
|
263
|
-
</xsl:template>
|
264
|
-
|
265
|
-
|
266
|
-
<!-- for most nodes, just dump their text content -->
|
267
|
-
<xsl:template match="*">
|
268
|
-
<xsl:text/><xsl:apply-templates /><xsl:text/>
|
269
|
-
</xsl:template>
|
270
|
-
|
271
|
-
</xsl:stylesheet>
|
data/spec/pl/act_block_spec.rb
DELETED
@@ -1,677 +0,0 @@
|
|
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.
|
45
|
-
1. Każdą samodzielną myśl ujmuje się w odrębny artykuł.
|
46
|
-
2. Artykuł powinien być w miarę możliwości jednozdaniowy.
|
47
|
-
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 (§).
|
48
|
-
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ł.
|
49
|
-
|
50
|
-
§ 56.
|
51
|
-
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.
|
52
|
-
2. W obrębie punktów można dokonać dalszego wyliczenia, wprowadzając litery.
|
53
|
-
EOS
|
54
|
-
|
55
|
-
to_xml(node).should == '<body>
|
56
|
-
<division id="division-I">
|
57
|
-
<num>I</num>
|
58
|
-
<subparagraph id="division-I.subparagraph-0">
|
59
|
-
<content>
|
60
|
-
<p>Projekt ustawy</p>
|
61
|
-
</content>
|
62
|
-
</subparagraph>
|
63
|
-
<chapter id="chapter-7">
|
64
|
-
<num>7</num>
|
65
|
-
<heading>Oznaczanie przepisów ustawy i ich systematyzacja</heading>
|
66
|
-
<section id="section-54">
|
67
|
-
<num>54.</num>
|
68
|
-
<content>
|
69
|
-
<p>Podstawową jednostką redakcyjną ustawy jest artykuł.</p>
|
70
|
-
</content>
|
71
|
-
</section>
|
72
|
-
<section id="section-55">
|
73
|
-
<num>55.</num>
|
74
|
-
<paragraph id="section-55.paragraph-1">
|
75
|
-
<num>1.</num>
|
76
|
-
<content>
|
77
|
-
<p>Każdą samodzielną myśl ujmuje się w odrębny artykuł.</p>
|
78
|
-
</content>
|
79
|
-
</paragraph>
|
80
|
-
<paragraph id="section-55.paragraph-2">
|
81
|
-
<num>2.</num>
|
82
|
-
<content>
|
83
|
-
<p>Artykuł powinien być w miarę możliwości jednozdaniowy.</p>
|
84
|
-
</content>
|
85
|
-
</paragraph>
|
86
|
-
<paragraph id="section-55.paragraph-3">
|
87
|
-
<num>3.</num>
|
88
|
-
<content>
|
89
|
-
<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>
|
90
|
-
</content>
|
91
|
-
</paragraph>
|
92
|
-
<paragraph id="section-55.paragraph-4">
|
93
|
-
<num>4.</num>
|
94
|
-
<content>
|
95
|
-
<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>
|
96
|
-
</content>
|
97
|
-
</paragraph>
|
98
|
-
</section>
|
99
|
-
<section id="section-56">
|
100
|
-
<num>56.</num>
|
101
|
-
<paragraph id="section-56.paragraph-1">
|
102
|
-
<num>1.</num>
|
103
|
-
<content>
|
104
|
-
<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>
|
105
|
-
</content>
|
106
|
-
</paragraph>
|
107
|
-
<paragraph id="section-56.paragraph-2">
|
108
|
-
<num>2.</num>
|
109
|
-
<content>
|
110
|
-
<p>W obrębie punktów można dokonać dalszego wyliczenia, wprowadzając litery.</p>
|
111
|
-
</content>
|
112
|
-
</paragraph>
|
113
|
-
</section>
|
114
|
-
</chapter>
|
115
|
-
</division>
|
116
|
-
</body>'
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
#-------------------------------------------------------------------------------
|
121
|
-
# Articles
|
122
|
-
|
123
|
-
describe 'articles' do
|
124
|
-
it 'should handle articles' do
|
125
|
-
node = parse :article, <<EOS
|
126
|
-
Art. 1. Ustawa reguluje opodatkowanie podatkiem dochodowym dochodów osób fizycznych
|
127
|
-
EOS
|
128
|
-
to_xml(node).should == '<article id="article-1">
|
129
|
-
<num>1.</num>
|
130
|
-
<content>
|
131
|
-
<p>Ustawa reguluje opodatkowanie podatkiem dochodowym dochodów osób fizycznych</p>
|
132
|
-
</content>
|
133
|
-
</article>'
|
134
|
-
end
|
135
|
-
|
136
|
-
it 'should handle articles with blank lines' do
|
137
|
-
node = parse :article, <<EOS
|
138
|
-
Art. 1.
|
139
|
-
|
140
|
-
Ustawa reguluje opodatkowanie podatkiem dochodowym dochodów osób fizycznych
|
141
|
-
EOS
|
142
|
-
to_xml(node).should == '<article id="article-1">
|
143
|
-
<num>1.</num>
|
144
|
-
<content>
|
145
|
-
<p>Ustawa reguluje opodatkowanie podatkiem dochodowym dochodów osób fizycznych</p>
|
146
|
-
</content>
|
147
|
-
</article>'
|
148
|
-
end
|
149
|
-
|
150
|
-
it 'should handle consecutive articles' do
|
151
|
-
node = parse :body, <<EOS
|
152
|
-
Art. 1. Ustawa reguluje opodatkowanie podatkiem dochodowym dochodów osób fizycznych
|
153
|
-
Art. 2. Something else
|
154
|
-
EOS
|
155
|
-
to_xml(node).should == '<body>
|
156
|
-
<article id="article-1">
|
157
|
-
<num>1.</num>
|
158
|
-
<content>
|
159
|
-
<p>Ustawa reguluje opodatkowanie podatkiem dochodowym dochodów osób fizycznych</p>
|
160
|
-
</content>
|
161
|
-
</article>
|
162
|
-
<article id="article-2">
|
163
|
-
<num>2.</num>
|
164
|
-
<content>
|
165
|
-
<p>Something else</p>
|
166
|
-
</content>
|
167
|
-
</article>
|
168
|
-
</body>'
|
169
|
-
end
|
170
|
-
|
171
|
-
it 'should handle nested content' do
|
172
|
-
node = parse :article, <<EOS
|
173
|
-
Art. 2.
|
174
|
-
1. Przepisów ustawy nie stosuje się do:
|
175
|
-
1) przychodów z działalności rolniczej, z wyjątkiem przychodów z działów specjalnych produkcji rolnej;
|
176
|
-
2) przychodów z gospodarki leśnej w rozumieniu ustawy o lasach;
|
177
|
-
EOS
|
178
|
-
to_xml(node).should == '<article id="article-2">
|
179
|
-
<num>2.</num>
|
180
|
-
<paragraph id="article-2.paragraph-1">
|
181
|
-
<num>1.</num>
|
182
|
-
<intro>
|
183
|
-
<p>Przepisów ustawy nie stosuje się do:</p>
|
184
|
-
</intro>
|
185
|
-
<point id="article-2.paragraph-1.point-1">
|
186
|
-
<num>1)</num>
|
187
|
-
<content>
|
188
|
-
<p>przychodów z działalności rolniczej, z wyjątkiem przychodów z działów specjalnych produkcji rolnej;</p>
|
189
|
-
</content>
|
190
|
-
</point>
|
191
|
-
<point id="article-2.paragraph-1.point-2">
|
192
|
-
<num>2)</num>
|
193
|
-
<content>
|
194
|
-
<p>przychodów z gospodarki leśnej w rozumieniu ustawy o lasach;</p>
|
195
|
-
</content>
|
196
|
-
</point>
|
197
|
-
</paragraph>
|
198
|
-
</article>'
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
#-------------------------------------------------------------------------------
|
203
|
-
# Divisions
|
204
|
-
|
205
|
-
describe 'divisions' do
|
206
|
-
it 'should handle divisions' do
|
207
|
-
node = parse :division, <<EOS
|
208
|
-
DZIAŁ I
|
209
|
-
Projekt ustawy
|
210
|
-
|
211
|
-
Rozdział 7. Oznaczanie przepisów ustawy i ich systematyzacja
|
212
|
-
|
213
|
-
§ 54. Podstawową jednostką redakcyjną ustawy jest artykuł.
|
214
|
-
EOS
|
215
|
-
to_xml(node).should == '<division id="division-I">
|
216
|
-
<num>I</num>
|
217
|
-
<heading>Projekt ustawy</heading>
|
218
|
-
<chapter id="chapter-7">
|
219
|
-
<num>7</num>
|
220
|
-
<heading>Oznaczanie przepisów ustawy i ich systematyzacja</heading>
|
221
|
-
<section id="section-54">
|
222
|
-
<num>54.</num>
|
223
|
-
<content>
|
224
|
-
<p>Podstawową jednostką redakcyjną ustawy jest artykuł.</p>
|
225
|
-
</content>
|
226
|
-
</section>
|
227
|
-
</chapter>
|
228
|
-
</division>'
|
229
|
-
end
|
230
|
-
end
|
231
|
-
|
232
|
-
#-------------------------------------------------------------------------------
|
233
|
-
# Subdivisions
|
234
|
-
|
235
|
-
describe 'subdivisions' do
|
236
|
-
it 'should handle subdivisions' do
|
237
|
-
node = parse :subdivision, <<EOS
|
238
|
-
ODDZIAŁ I
|
239
|
-
Projekt ustawy
|
240
|
-
|
241
|
-
§ 54. Podstawową jednostką redakcyjną ustawy jest artykuł.
|
242
|
-
EOS
|
243
|
-
to_xml(node).should == '<subdivision id="subdivision-I">
|
244
|
-
<num>I</num>
|
245
|
-
<heading>Projekt ustawy</heading>
|
246
|
-
<section id="section-54">
|
247
|
-
<num>54.</num>
|
248
|
-
<content>
|
249
|
-
<p>Podstawową jednostką redakcyjną ustawy jest artykuł.</p>
|
250
|
-
</content>
|
251
|
-
</section>
|
252
|
-
</subdivision>'
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
|
-
#-------------------------------------------------------------------------------
|
257
|
-
# Paragraph
|
258
|
-
|
259
|
-
describe 'paragraph' do
|
260
|
-
it 'should handle simple para' do
|
261
|
-
node = parse :paragraph, <<EOS
|
262
|
-
1. Każdą samodzielną myśl ujmuje się w odrębny artykuł.
|
263
|
-
EOS
|
264
|
-
|
265
|
-
to_xml(node).should == '<paragraph id="paragraph-1">
|
266
|
-
<num>1.</num>
|
267
|
-
<content>
|
268
|
-
<p>Każdą samodzielną myśl ujmuje się w odrębny artykuł.</p>
|
269
|
-
</content>
|
270
|
-
</paragraph>'
|
271
|
-
end
|
272
|
-
|
273
|
-
it 'should handle an empty para' do
|
274
|
-
node = parse :paragraph, <<EOS
|
275
|
-
1.
|
276
|
-
EOS
|
277
|
-
|
278
|
-
to_xml(node).should == '<paragraph id="paragraph-1">
|
279
|
-
<num>1.</num>
|
280
|
-
<content>
|
281
|
-
<p/>
|
282
|
-
</content>
|
283
|
-
</paragraph>'
|
284
|
-
end
|
285
|
-
|
286
|
-
it 'should handle a para with whitespace' do
|
287
|
-
node = parse :paragraph, <<EOS
|
288
|
-
1.
|
289
|
-
|
290
|
-
foo bar
|
291
|
-
EOS
|
292
|
-
|
293
|
-
to_xml(node).should == '<paragraph id="paragraph-1">
|
294
|
-
<num>1.</num>
|
295
|
-
<content>
|
296
|
-
<p>foo bar</p>
|
297
|
-
</content>
|
298
|
-
</paragraph>'
|
299
|
-
end
|
300
|
-
|
301
|
-
it 'should handle paragraphs with points' do
|
302
|
-
node = parse :paragraph, <<EOS
|
303
|
-
2. W ustawie należy unikać posługiwania się:
|
304
|
-
1) określeniami specjalistycznymi, o ile ich użycie nie jest powodowane zapewnieniem należytej precyzji tekstu;
|
305
|
-
2) określeniami lub zapożyczeniami obcojęzycznymi, chyba że nie mają dokładnego odpowiednika w języku polskim;
|
306
|
-
3) nowo tworzonymi pojęciami lub strukturami językowymi, chyba że w dotychczasowym słownictwie polskim brak jest odpowiedniego określenia.
|
307
|
-
EOS
|
308
|
-
|
309
|
-
to_xml(node).should == '<paragraph id="paragraph-2">
|
310
|
-
<num>2.</num>
|
311
|
-
<intro>
|
312
|
-
<p>W ustawie należy unikać posługiwania się:</p>
|
313
|
-
</intro>
|
314
|
-
<point id="paragraph-2.point-1">
|
315
|
-
<num>1)</num>
|
316
|
-
<content>
|
317
|
-
<p>określeniami specjalistycznymi, o ile ich użycie nie jest powodowane zapewnieniem należytej precyzji tekstu;</p>
|
318
|
-
</content>
|
319
|
-
</point>
|
320
|
-
<point id="paragraph-2.point-2">
|
321
|
-
<num>2)</num>
|
322
|
-
<content>
|
323
|
-
<p>określeniami lub zapożyczeniami obcojęzycznymi, chyba że nie mają dokładnego odpowiednika w języku polskim;</p>
|
324
|
-
</content>
|
325
|
-
</point>
|
326
|
-
<point id="paragraph-2.point-3">
|
327
|
-
<num>3)</num>
|
328
|
-
<content>
|
329
|
-
<p>nowo tworzonymi pojęciami lub strukturami językowymi, chyba że w dotychczasowym słownictwie polskim brak jest odpowiedniego określenia.</p>
|
330
|
-
</content>
|
331
|
-
</point>
|
332
|
-
</paragraph>'
|
333
|
-
end
|
334
|
-
|
335
|
-
it 'should not get confused by points with articles' do
|
336
|
-
node = parse :paragraph, <<EOS
|
337
|
-
2. W ustawie należy unikać posługiwania się:
|
338
|
-
1) art. 1
|
339
|
-
2) art. 2
|
340
|
-
EOS
|
341
|
-
|
342
|
-
to_xml(node).should == '<paragraph id="paragraph-2">
|
343
|
-
<num>2.</num>
|
344
|
-
<intro>
|
345
|
-
<p>W ustawie należy unikać posługiwania się:</p>
|
346
|
-
</intro>
|
347
|
-
<point id="paragraph-2.point-1">
|
348
|
-
<num>1)</num>
|
349
|
-
<content>
|
350
|
-
<p>art. 1</p>
|
351
|
-
</content>
|
352
|
-
</point>
|
353
|
-
<point id="paragraph-2.point-2">
|
354
|
-
<num>2)</num>
|
355
|
-
<content>
|
356
|
-
<p>art. 2</p>
|
357
|
-
</content>
|
358
|
-
</point>
|
359
|
-
</paragraph>'
|
360
|
-
end
|
361
|
-
end
|
362
|
-
|
363
|
-
#-------------------------------------------------------------------------------
|
364
|
-
# Section
|
365
|
-
|
366
|
-
describe 'section' do
|
367
|
-
it 'should handle section with un-numbered para' do
|
368
|
-
node = parse :section, <<EOS
|
369
|
-
§ 5.
|
370
|
-
|
371
|
-
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à.
|
372
|
-
EOS
|
373
|
-
|
374
|
-
to_xml(node).should == '<section id="section-5">
|
375
|
-
<num>5.</num>
|
376
|
-
<content>
|
377
|
-
<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>
|
378
|
-
</content>
|
379
|
-
</section>'
|
380
|
-
end
|
381
|
-
|
382
|
-
it 'should handle section with numbered para on the same line' do
|
383
|
-
node = parse :section, <<EOS
|
384
|
-
§ 54. Podstawową jednostką redakcyjną ustawy jest artykuł.
|
385
|
-
EOS
|
386
|
-
|
387
|
-
to_xml(node).should == '<section id="section-54">
|
388
|
-
<num>54.</num>
|
389
|
-
<content>
|
390
|
-
<p>Podstawową jednostką redakcyjną ustawy jest artykuł.</p>
|
391
|
-
</content>
|
392
|
-
</section>'
|
393
|
-
end
|
394
|
-
|
395
|
-
it 'should handle section with numbered paras' do
|
396
|
-
node = parse :section, <<EOS
|
397
|
-
§ 55.
|
398
|
-
1. Każdą samodzielną myśl ujmuje się w odrębny artykuł.
|
399
|
-
2. Artykuł powinien być w miarę możliwości jednozdaniowy.
|
400
|
-
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 (§).
|
401
|
-
EOS
|
402
|
-
|
403
|
-
to_xml(node).should == '<section id="section-55">
|
404
|
-
<num>55.</num>
|
405
|
-
<paragraph id="section-55.paragraph-1">
|
406
|
-
<num>1.</num>
|
407
|
-
<content>
|
408
|
-
<p>Każdą samodzielną myśl ujmuje się w odrębny artykuł.</p>
|
409
|
-
</content>
|
410
|
-
</paragraph>
|
411
|
-
<paragraph id="section-55.paragraph-2">
|
412
|
-
<num>2.</num>
|
413
|
-
<content>
|
414
|
-
<p>Artykuł powinien być w miarę możliwości jednozdaniowy.</p>
|
415
|
-
</content>
|
416
|
-
</paragraph>
|
417
|
-
<paragraph id="section-55.paragraph-3">
|
418
|
-
<num>3.</num>
|
419
|
-
<content>
|
420
|
-
<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>
|
421
|
-
</content>
|
422
|
-
</paragraph>
|
423
|
-
</section>'
|
424
|
-
end
|
425
|
-
|
426
|
-
it 'should not confuse section content with block elements' do
|
427
|
-
node = parse :section, <<EOS
|
428
|
-
§ 55. 1. Każdą samodzielną myśl ujmuje się w odrębny artykuł.
|
429
|
-
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 (§).
|
430
|
-
EOS
|
431
|
-
|
432
|
-
to_xml(node).should == '<section id="section-55">
|
433
|
-
<num>55.</num>
|
434
|
-
<intro>
|
435
|
-
<p>1. Każdą samodzielną myśl ujmuje się w odrębny artykuł.</p>
|
436
|
-
</intro>
|
437
|
-
<paragraph id="section-55.paragraph-3">
|
438
|
-
<num>3.</num>
|
439
|
-
<content>
|
440
|
-
<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>
|
441
|
-
</content>
|
442
|
-
</paragraph>
|
443
|
-
</section>'
|
444
|
-
end
|
445
|
-
|
446
|
-
it 'should handle section with intro, para and points' do
|
447
|
-
node = parse :section, <<EOS
|
448
|
-
§ 54. Podstawową jednostką redakcyjną ustawy jest artykuł.
|
449
|
-
|
450
|
-
Something here
|
451
|
-
|
452
|
-
1) a point
|
453
|
-
2) second point
|
454
|
-
EOS
|
455
|
-
|
456
|
-
to_xml(node).should == '<section id="section-54">
|
457
|
-
<num>54.</num>
|
458
|
-
<intro>
|
459
|
-
<p>Podstawową jednostką redakcyjną ustawy jest artykuł.</p>
|
460
|
-
</intro>
|
461
|
-
<subparagraph id="section-54.subparagraph-0">
|
462
|
-
<content>
|
463
|
-
<p>Something here</p>
|
464
|
-
</content>
|
465
|
-
</subparagraph>
|
466
|
-
<point id="section-54.point-1">
|
467
|
-
<num>1)</num>
|
468
|
-
<content>
|
469
|
-
<p>a point</p>
|
470
|
-
</content>
|
471
|
-
</point>
|
472
|
-
<point id="section-54.point-2">
|
473
|
-
<num>2)</num>
|
474
|
-
<content>
|
475
|
-
<p>second point</p>
|
476
|
-
</content>
|
477
|
-
</point>
|
478
|
-
</section>'
|
479
|
-
end
|
480
|
-
|
481
|
-
it 'should not get confused by sections with articles' do
|
482
|
-
node = parse :section, <<EOS
|
483
|
-
§ 54. Art 1. is changed...
|
484
|
-
EOS
|
485
|
-
|
486
|
-
to_xml(node).should == '<section id="section-54">
|
487
|
-
<num>54.</num>
|
488
|
-
<content>
|
489
|
-
<p>Art 1. is changed...</p>
|
490
|
-
</content>
|
491
|
-
</section>'
|
492
|
-
end
|
493
|
-
end
|
494
|
-
|
495
|
-
#-------------------------------------------------------------------------------
|
496
|
-
# Point
|
497
|
-
|
498
|
-
describe 'point' do
|
499
|
-
it 'should handle basic point' do
|
500
|
-
node = parse :point, <<EOS
|
501
|
-
1) szczegółowy tryb i terminy rozpatrywania wniosków o udzielenie finansowego wsparcia;
|
502
|
-
EOS
|
503
|
-
|
504
|
-
to_xml(node, 'prefix.', 0).should == '<point id="prefix.point-1">
|
505
|
-
<num>1)</num>
|
506
|
-
<content>
|
507
|
-
<p>szczegółowy tryb i terminy rozpatrywania wniosków o udzielenie finansowego wsparcia;</p>
|
508
|
-
</content>
|
509
|
-
</point>'
|
510
|
-
end
|
511
|
-
|
512
|
-
it 'should handle points with litera' do
|
513
|
-
node = parse :point, <<EOS
|
514
|
-
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:
|
515
|
-
|
516
|
-
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
|
517
|
-
|
518
|
-
b) numer księgi wieczystej;
|
519
|
-
EOS
|
520
|
-
|
521
|
-
to_xml(node, 'prefix.', 0).should == '<point id="prefix.point-1">
|
522
|
-
<num>1)</num>
|
523
|
-
<intro>
|
524
|
-
<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>
|
525
|
-
</intro>
|
526
|
-
<alinea id="prefix.point-1.alinea-a">
|
527
|
-
<num>a)</num>
|
528
|
-
<content>
|
529
|
-
<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>
|
530
|
-
</content>
|
531
|
-
</alinea>
|
532
|
-
<alinea id="prefix.point-1.alinea-b">
|
533
|
-
<num>b)</num>
|
534
|
-
<content>
|
535
|
-
<p>numer księgi wieczystej;</p>
|
536
|
-
</content>
|
537
|
-
</alinea>
|
538
|
-
</point>'
|
539
|
-
end
|
540
|
-
end
|
541
|
-
|
542
|
-
#-------------------------------------------------------------------------------
|
543
|
-
# Litera
|
544
|
-
|
545
|
-
describe 'litera' do
|
546
|
-
|
547
|
-
it 'should handle litera with indents' do
|
548
|
-
node = parse :litera, <<EOS
|
549
|
-
b) liczby:
|
550
|
-
- tworzonych lokali wchodzących w skład mieszkaniowego zasobu gminy,
|
551
|
-
- mieszkań chronionych,
|
552
|
-
- lokali mieszkalnych powstających z udziałem gminy albo związku międzygminnego w wyniku realizacji przedsięwzięć, o których mowa w art. 5 ust. 1 i art. 5a ust. 1 ustawy,
|
553
|
-
- tymczasowych pomieszczeń,
|
554
|
-
- miejsc w noclegowniach, schroniskach dla bezdomnych i ogrzewalniach,
|
555
|
-
EOS
|
556
|
-
to_xml(node, 'prefix.', 0).should == '<alinea id="prefix.alinea-b">
|
557
|
-
<num>b)</num>
|
558
|
-
<intro>
|
559
|
-
<p>liczby:</p>
|
560
|
-
</intro>
|
561
|
-
<list id="prefix.alinea-b.list-0">
|
562
|
-
<indent id="prefix.alinea-b.list-0.indent-0">
|
563
|
-
<content>
|
564
|
-
<p>tworzonych lokali wchodzących w skład mieszkaniowego zasobu gminy,</p>
|
565
|
-
</content>
|
566
|
-
</indent>
|
567
|
-
<indent id="prefix.alinea-b.list-0.indent-1">
|
568
|
-
<content>
|
569
|
-
<p>mieszkań chronionych,</p>
|
570
|
-
</content>
|
571
|
-
</indent>
|
572
|
-
<indent id="prefix.alinea-b.list-0.indent-2">
|
573
|
-
<content>
|
574
|
-
<p>lokali mieszkalnych powstających z udziałem gminy albo związku międzygminnego w wyniku realizacji przedsięwzięć, o których mowa w art. 5 ust. 1 i art. 5a ust. 1 ustawy,</p>
|
575
|
-
</content>
|
576
|
-
</indent>
|
577
|
-
<indent id="prefix.alinea-b.list-0.indent-3">
|
578
|
-
<content>
|
579
|
-
<p>tymczasowych pomieszczeń,</p>
|
580
|
-
</content>
|
581
|
-
</indent>
|
582
|
-
<indent id="prefix.alinea-b.list-0.indent-4">
|
583
|
-
<content>
|
584
|
-
<p>miejsc w noclegowniach, schroniskach dla bezdomnych i ogrzewalniach,</p>
|
585
|
-
</content>
|
586
|
-
</indent>
|
587
|
-
</list>
|
588
|
-
</alinea>'
|
589
|
-
end
|
590
|
-
end
|
591
|
-
|
592
|
-
#-------------------------------------------------------------------------------
|
593
|
-
# Indent
|
594
|
-
|
595
|
-
describe 'indent' do
|
596
|
-
it 'should handle basic indent' do
|
597
|
-
node = parse :indents, <<EOS
|
598
|
-
- tworzonych lokali wchodzących w skład mieszkaniowego zasobu gminy,
|
599
|
-
EOS
|
600
|
-
|
601
|
-
to_xml(node, 'prefix.', 0).should == '<list id="prefix.list-0">
|
602
|
-
<indent id="prefix.list-0.indent-0">
|
603
|
-
<content>
|
604
|
-
<p>tworzonych lokali wchodzących w skład mieszkaniowego zasobu gminy,</p>
|
605
|
-
</content>
|
606
|
-
</indent>
|
607
|
-
</list>'
|
608
|
-
end
|
609
|
-
|
610
|
-
it 'should handle indents with different dash characters' do
|
611
|
-
node = parse :indents, <<EOS
|
612
|
-
– foo
|
613
|
-
- bar
|
614
|
-
EOS
|
615
|
-
|
616
|
-
to_xml(node, 'prefix.', 0).should == '<list id="prefix.list-0">
|
617
|
-
<indent id="prefix.list-0.indent-0">
|
618
|
-
<content>
|
619
|
-
<p>foo</p>
|
620
|
-
</content>
|
621
|
-
</indent>
|
622
|
-
<indent id="prefix.list-0.indent-1">
|
623
|
-
<content>
|
624
|
-
<p>bar</p>
|
625
|
-
</content>
|
626
|
-
</indent>
|
627
|
-
</list>'
|
628
|
-
end
|
629
|
-
|
630
|
-
it 'should handle empty indents' do
|
631
|
-
node = parse :indents, <<EOS
|
632
|
-
-
|
633
|
-
-
|
634
|
-
EOS
|
635
|
-
|
636
|
-
to_xml(node, 'prefix.', 0).should == '<list id="prefix.list-0">
|
637
|
-
<indent id="prefix.list-0.indent-0">
|
638
|
-
<content>
|
639
|
-
<p/>
|
640
|
-
</content>
|
641
|
-
</indent>
|
642
|
-
<indent id="prefix.list-0.indent-1">
|
643
|
-
<content>
|
644
|
-
<p/>
|
645
|
-
</content>
|
646
|
-
</indent>
|
647
|
-
</list>'
|
648
|
-
end
|
649
|
-
|
650
|
-
it 'should handle multiple indent items' do
|
651
|
-
node = parse :indents, <<EOS
|
652
|
-
- tworzonych lokali wchodzących w skład mieszkaniowego zasobu gminy,
|
653
|
-
- mieszkań chronionych,
|
654
|
-
- lokali mieszkalnych powstających z udziałem gminy albo związku międzygminnego w wyniku realizacji przedsięwzięć, o których mowa w art. 5 ust. 1 i art. 5a ust. 1 ustawy,
|
655
|
-
EOS
|
656
|
-
|
657
|
-
to_xml(node, 'prefix.', 0).should == '<list id="prefix.list-0">
|
658
|
-
<indent id="prefix.list-0.indent-0">
|
659
|
-
<content>
|
660
|
-
<p>tworzonych lokali wchodzących w skład mieszkaniowego zasobu gminy,</p>
|
661
|
-
</content>
|
662
|
-
</indent>
|
663
|
-
<indent id="prefix.list-0.indent-1">
|
664
|
-
<content>
|
665
|
-
<p>mieszkań chronionych,</p>
|
666
|
-
</content>
|
667
|
-
</indent>
|
668
|
-
<indent id="prefix.list-0.indent-2">
|
669
|
-
<content>
|
670
|
-
<p>lokali mieszkalnych powstających z udziałem gminy albo związku międzygminnego w wyniku realizacji przedsięwzięć, o których mowa w art. 5 ust. 1 i art. 5a ust. 1 ustawy,</p>
|
671
|
-
</content>
|
672
|
-
</indent>
|
673
|
-
</list>'
|
674
|
-
end
|
675
|
-
end
|
676
|
-
|
677
|
-
end
|