slaw 1.0.0.alpha.3 → 1.0.0.alpha.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -0
- data/bin/slaw +0 -4
- data/lib/slaw/parse/cleanser.rb +0 -136
- data/lib/slaw/version.rb +1 -1
- data/spec/parse/cleanser_spec.rb +0 -129
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2fbb349a6f18f3b78feda6a8242e3688db6f65b
|
4
|
+
data.tar.gz: 6dc113e8c0194a813b5a0837fc6bb5dabdfe7570
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3941935634b014c79358c16784acfb32ac16f6fd083b4a9f31a029fb90d0f19eff4ca4eca29e71e54348a9458617c53a661b0537d2b4922157dba6fdd64f7ff
|
7
|
+
data.tar.gz: f76579ebb6a935e1c46a3ef4ba5eaafe3761673408fc35006c5036d677650aeaa534335095bff3ca139bb8e09a5df8bf384dc4071f432d5c5053a933391e76bf
|
data/README.md
CHANGED
@@ -223,6 +223,7 @@ Akoma Ntoso `component` elements at the end of the XML document, with a name of
|
|
223
223
|
* Improved support for other legal traditions / grammars.
|
224
224
|
* Add Polish legal tradition grammar.
|
225
225
|
* Slaw no longer does too much introspection of a parsed document, since that can be so tradition-dependent.
|
226
|
+
* Move reformatting out of Slaw since it's tradition-dependent.
|
226
227
|
* Remove definition linking, Slaw no longer supports it.
|
227
228
|
|
228
229
|
### 0.17.2
|
data/bin/slaw
CHANGED
@@ -20,7 +20,6 @@ class SlawCLI < Thor
|
|
20
20
|
option :fragment, type: :string, desc: "Akoma Ntoso element name that the imported text represents. Support depends on the grammar."
|
21
21
|
option :id_prefix, type: :string, desc: "Prefix to be used when generating ID elements when parsing a fragment."
|
22
22
|
option :section_number_position, enum: ['before-title', 'after-title', 'guess'], desc: "Where do section titles come in relation to the section number? Default: before-title"
|
23
|
-
option :reformat, type: :boolean, desc: "Reformat common formatting issues to make grammar matching better. Default: true for PDF files, false otherwise"
|
24
23
|
option :crop, type: :string, desc: "Crop box for PDF files, as 'left,top,width,height'."
|
25
24
|
option :grammar, type: :string, desc: "Grammar name (usually a two-letter country code). Default is za."
|
26
25
|
def parse(name)
|
@@ -39,7 +38,6 @@ class SlawCLI < Thor
|
|
39
38
|
case options[:input]
|
40
39
|
when 'pdf'
|
41
40
|
text = extractor.extract_from_pdf(name)
|
42
|
-
options[:reformat] = true if options[:reformat].nil?
|
43
41
|
when 'text'
|
44
42
|
text = extractor.extract_from_text(name)
|
45
43
|
else
|
@@ -48,8 +46,6 @@ class SlawCLI < Thor
|
|
48
46
|
|
49
47
|
generator = Slaw::ActGenerator.new(options[:grammar] || 'za')
|
50
48
|
|
51
|
-
text = generator.reformat(text) if options[:reformat]
|
52
|
-
|
53
49
|
if options[:fragment]
|
54
50
|
generator.document_class = Slaw::Fragment
|
55
51
|
|
data/lib/slaw/parse/cleanser.rb
CHANGED
@@ -14,23 +14,11 @@ module Slaw
|
|
14
14
|
def cleanup(s)
|
15
15
|
s = scrub(s)
|
16
16
|
s = correct_newlines(s)
|
17
|
-
s = fix_quotes(s)
|
18
17
|
s = expand_tabs(s)
|
19
18
|
s = chomp(s)
|
20
19
|
s = enforce_newline(s)
|
21
20
|
end
|
22
21
|
|
23
|
-
# Run deeper introspections and reformat the text, such as
|
24
|
-
# unwrapping/re-wrapping lines. These may not be safe to run
|
25
|
-
# multiple times.
|
26
|
-
def reformat(s)
|
27
|
-
s = remove_boilerplate(s)
|
28
|
-
s = unbreak_lines(s)
|
29
|
-
s = break_lines(s)
|
30
|
-
s = strip_toc(s)
|
31
|
-
s = enforce_newline(s)
|
32
|
-
end
|
33
|
-
|
34
22
|
# ------------------------------------------------------------------------
|
35
23
|
|
36
24
|
def remove_empty_lines(s)
|
@@ -51,36 +39,12 @@ module Slaw
|
|
51
39
|
.gsub(/–/, '-')
|
52
40
|
end
|
53
41
|
|
54
|
-
# change weird quotes to normal ones
|
55
|
-
def fix_quotes(s)
|
56
|
-
s.gsub(/‘‘|’’|''/, '"')
|
57
|
-
end
|
58
|
-
|
59
42
|
# tabs to spaces
|
60
43
|
def expand_tabs(s)
|
61
44
|
s.gsub(/\t/, ' ')\
|
62
45
|
.gsub("\u00A0", ' ') # non-breaking space
|
63
46
|
end
|
64
47
|
|
65
|
-
# Try to remove boilerplate lines found in many files, such as page numbers.
|
66
|
-
def remove_boilerplate(s)
|
67
|
-
# nuke any line to do with Sabinet and the government printer
|
68
|
-
s.gsub(/^.*Sabinet.*Government Printer.*$/i, '')\
|
69
|
-
.gsub(/^.*Provincial Gazette \d+.*$/i, '')\
|
70
|
-
.gsub(/^.*Provinsiale Koerant \d+.*$/i, '')\
|
71
|
-
.gsub(/^.*PROVINCIAL GAZETTE.*$/, '')\
|
72
|
-
.gsub(/^.*PROVINSIALE KOERANT.*$/, '')\
|
73
|
-
.gsub(/^\s*\d+\s*$/, '')\
|
74
|
-
.gsub(/^.*This gazette is also available.*$/, '')\
|
75
|
-
# get rid of date lines
|
76
|
-
.gsub(/^\d{1,2}\s+\w+\s+\d{4}$/, '')\
|
77
|
-
# get rid of page number lines
|
78
|
-
.gsub(/^\s*page \d+( of \d+)?\s*\n/i, '')\
|
79
|
-
.gsub(/^\s*\d*\s*No\. \d+$/, '')\
|
80
|
-
# get rid of lines with lots of ____ or ---- chars, they're usually pagebreaks
|
81
|
-
.gsub(/^.*[_-]{5}.*$/, '')
|
82
|
-
end
|
83
|
-
|
84
48
|
# Get rid of whitespace at the end of lines and at the start and end of the
|
85
49
|
# entire string.
|
86
50
|
def chomp(s)
|
@@ -95,106 +59,6 @@ module Slaw
|
|
95
59
|
# ensure string ends with a newline
|
96
60
|
s.end_with?("\n") ? s : (s + "\n")
|
97
61
|
end
|
98
|
-
|
99
|
-
# Make educated guesses about lines that should
|
100
|
-
# have been broken but haven't, and break them.
|
101
|
-
#
|
102
|
-
# This is very dependent on a locale's legislation grammar, there are
|
103
|
-
# lots of rules of thumb that make this work.
|
104
|
-
def break_lines(s)
|
105
|
-
# often we find a section title munged onto the same line as its first statement
|
106
|
-
# eg:
|
107
|
-
# foo bar. New section title 62. (1) For the purpose
|
108
|
-
s = s.gsub(/\. ([^.]+) (\d+\. ?\(1\) )/, ".\n" + '\1' + "\n" + '\2')
|
109
|
-
|
110
|
-
# New section title 62. (1) For the purpose
|
111
|
-
s = s.gsub(/(\w) (\d+\. ?\(1\) )/, '\1' + "\n" + '\2')
|
112
|
-
|
113
|
-
# (1) foo; (2) bar
|
114
|
-
# (1) foo. (2) bar
|
115
|
-
s = s.gsub(/(\w{3,}[;.]) (\([0-9a-z]+\))/, "\\1\n\\2")
|
116
|
-
|
117
|
-
# (1) foo; and (2) bar
|
118
|
-
# (1) foo; or (2) bar
|
119
|
-
s = s.gsub(/; (and|or) \(/, "; \\1\n(")
|
120
|
-
|
121
|
-
# The officer-in-Charge may – (a) remove all withered natural... \n(b)
|
122
|
-
# We do this last, because by now we should have reconised that (b) should already
|
123
|
-
# be on a new line.
|
124
|
-
s = s.gsub(/ (\(a\) .+?\n\(b\))/, "\n\\1")
|
125
|
-
|
126
|
-
# "foo" means ...; "bar" means
|
127
|
-
s = s.gsub(/; (["”“][^"”“]+?["”“] means)/, ";\n\\1")
|
128
|
-
|
129
|
-
# CHAPTER 4 PARKING METER PARKING GROUNDS Place of parking
|
130
|
-
s = s.gsub(/([A-Z0-9 ]{5,}) ([A-Z][a-z ]{5,})/, "\\1\n\\2")
|
131
|
-
|
132
|
-
s
|
133
|
-
end
|
134
|
-
|
135
|
-
# Find likely candidates for unnecessarily broken lines
|
136
|
-
# and unbreaks them.
|
137
|
-
def unbreak_lines(s)
|
138
|
-
lines = s.split(/\n/)
|
139
|
-
output = []
|
140
|
-
|
141
|
-
# set of regex matcher pairs, one for the prev line, one for the current line
|
142
|
-
matchers = [
|
143
|
-
[/[a-z0-9]$/, /^\s*[a-z]/], # line ends with and starst with lowercase
|
144
|
-
[/;$/, /^\s*(and|or)/], # ends with ; then and/or on new line
|
145
|
-
]
|
146
|
-
|
147
|
-
prev = nil
|
148
|
-
lines.each_with_index do |line, i|
|
149
|
-
if i == 0
|
150
|
-
output << line
|
151
|
-
else
|
152
|
-
prev = output[-1]
|
153
|
-
unbreak = false
|
154
|
-
|
155
|
-
for prev_re, curr_re in matchers
|
156
|
-
if prev =~ prev_re and line =~ curr_re
|
157
|
-
unbreak = true
|
158
|
-
break
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
if unbreak
|
163
|
-
output[-1] = prev + ' ' + line
|
164
|
-
else
|
165
|
-
output << line
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
output.join("\n")
|
171
|
-
end
|
172
|
-
|
173
|
-
# Do our best to remove table of contents at the start,
|
174
|
-
# it really confuses the grammer.
|
175
|
-
def strip_toc(s)
|
176
|
-
# first, try to find 'TABLE OF CONTENTS' anywhere within the first 4K of text,
|
177
|
-
if toc_start = s[0..4096].match(/TABLE OF CONTENTS/i)
|
178
|
-
|
179
|
-
# grab the first non-blank line after that, it's our end-of-TOC marker
|
180
|
-
if eol = s.match(/^(.+?)$/, toc_start.end(0))
|
181
|
-
marker = eol[0]
|
182
|
-
|
183
|
-
# search for the first line that is a prefix of marker (or vv), and delete
|
184
|
-
# everything in between
|
185
|
-
posn = eol.end(0)
|
186
|
-
while m = s.match(/^(.+?)$/, posn)
|
187
|
-
if marker.start_with?(m[0]) or m[0].start_with?(marker)
|
188
|
-
return s[0...toc_start.begin(0)] + s[m.begin(0)..-1]
|
189
|
-
end
|
190
|
-
|
191
|
-
posn = m.end(0)
|
192
|
-
end
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
|
-
s
|
197
|
-
end
|
198
62
|
end
|
199
63
|
end
|
200
64
|
end
|
data/lib/slaw/version.rb
CHANGED
data/spec/parse/cleanser_spec.rb
CHANGED
@@ -16,133 +16,4 @@ describe Slaw::Parse::Cleanser do
|
|
16
16
|
subject.expand_tabs("foo \u00A0bar").should == "foo bar"
|
17
17
|
end
|
18
18
|
end
|
19
|
-
|
20
|
-
describe '#unbreak_lines' do
|
21
|
-
it 'should unbreak simple lines' do
|
22
|
-
subject.unbreak_lines("""
|
23
|
-
8.2.3 an additional fee or tariff, which is
|
24
|
-
to be determined by the City in its
|
25
|
-
sole discretion, in respect of additional
|
26
|
-
costs incurred or services.
|
27
|
-
8.3 In the event that a person qualifies for
|
28
|
-
a permit, but has motivated in writing
|
29
|
-
the inability to pay the fee contemplated.""").should == """
|
30
|
-
8.2.3 an additional fee or tariff, which is to be determined by the City in its sole discretion, in respect of additional costs incurred or services.
|
31
|
-
8.3 In the event that a person qualifies for a permit, but has motivated in writing the inability to pay the fee contemplated."""
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'should not unbreak section headers' do
|
35
|
-
subject.unbreak_lines("""
|
36
|
-
8.4.3 must be a South African citizen, failing which, must be in possession of
|
37
|
-
a valid work permit which includes, but is not limited to, a refugee
|
38
|
-
permit; and
|
39
|
-
8.4.4 must not employ and actively utilise the services of more than 20
|
40
|
-
(twenty) persons.""").should == """
|
41
|
-
8.4.3 must be a South African citizen, failing which, must be in possession of a valid work permit which includes, but is not limited to, a refugee permit; and
|
42
|
-
8.4.4 must not employ and actively utilise the services of more than 20
|
43
|
-
(twenty) persons."""
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe '#break_lines' do
|
48
|
-
it 'should break nested lists' do
|
49
|
-
subject.break_lines('stored, if known; (b) the number of trolleys').should == "stored, if known;\n(b) the number of trolleys"
|
50
|
-
|
51
|
-
subject.break_lines("(5) The officer-in-Charge may – (a) remove all withered natural flowers, faded or damaged artificial flowers and any receptacle placed on a grave; or\n(b) 30 days after publishing a general").should == "(5) The officer-in-Charge may –\n(a) remove all withered natural flowers, faded or damaged artificial flowers and any receptacle placed on a grave; or\n(b) 30 days after publishing a general"
|
52
|
-
|
53
|
-
subject.break_lines("(2) No person may – (a) plant, cut or remove plants, shrubs or flowers on a grave without the permission of the officer-in-charge; (b) plant, cut or remove plants, shrubs or flowers on the berm section; or").should == "(2) No person may –\n(a) plant, cut or remove plants, shrubs or flowers on a grave without the permission of the officer-in-charge;\n(b) plant, cut or remove plants, shrubs or flowers on the berm section; or"
|
54
|
-
|
55
|
-
subject.break_lines('(b) its successor in title; or (c) a structure or person exercising a delegated power or carrying out an instruction, where any power in these By-laws, has been delegated or sub-delegated or an instruction given as contemplated in, section 59 of the Local Government: Municipal Systems Act, 2000 (Act No. 32 of 2000); or (d) a service provider fulfilling a responsibility under these By-laws, assigned to it in terms of section 81(2) of the Local Government: Municipal Systems Act, 2000, or any other law, as the case may be;').should == "(b) its successor in title; or\n(c) a structure or person exercising a delegated power or carrying out an instruction, where any power in these By-laws, has been delegated or sub-delegated or an instruction given as contemplated in, section 59 of the Local Government: Municipal Systems Act, 2000 (Act No. 32 of 2000); or\n(d) a service provider fulfilling a responsibility under these By-laws, assigned to it in terms of section 81(2) of the Local Government: Municipal Systems Act, 2000, or any other law, as the case may be;"
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'should break at likely subsections' do
|
59
|
-
subject.break_lines('(c) place a metal cot on any grave. (3) A person may only erect, place or leave, an object or decoration on a grave during the first 30 days following the burial. (4) Natural or artificial flowers contained in receptacles may be placed on a grave at any time, but in a grave within a berm section or with a headstone, such flowers may only be placed in the socket provided. (5) The officer-in-Charge may – (a) remove all withered natural flowers, faded or damaged artificial flowers and any receptacle placed on a grave; or').should == "(c) place a metal cot on any grave.\n(3) A person may only erect, place or leave, an object or decoration on a grave during the first 30 days following the burial.\n(4) Natural or artificial flowers contained in receptacles may be placed on a grave at any time, but in a grave within a berm section or with a headstone, such flowers may only be placed in the socket provided.\n(5) The officer-in-Charge may – (a) remove all withered natural flowers, faded or damaged artificial flowers and any receptacle placed on a grave; or"
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'should break lines at likely section titles' do
|
63
|
-
subject.break_lines('foo bar. New section title 62. (1) For the purpose').should == "foo bar.\nNew section title\n62. (1) For the purpose"
|
64
|
-
subject.break_lines('foo bar. New section title 62.(1) For the purpose').should == "foo bar.\nNew section title\n62.(1) For the purpose"
|
65
|
-
subject.break_lines('New section title 62. (1) For the purpose').should == "New section title\n62. (1) For the purpose"
|
66
|
-
subject.break_lines('New section title 62.(1) For the purpose').should == "New section title\n62.(1) For the purpose"
|
67
|
-
end
|
68
|
-
|
69
|
-
it 'should clean up wrapped definition lines after pdf' do
|
70
|
-
subject.break_lines('“agricultural holding” means a portion of land not less than 0.8 hectares in extent used solely or mainly for the purpose of agriculture, horticulture or for breeding or keeping domesticated animals, poultry or bees; “approved” means as approved by the Council; “bund wall” means a containment wall surrounding an above ground storage tank, constructed of an impervious material and designed to contain 110% of the contents of the tank; “certificate of fitness” means a certificate contemplated in section 20; “certificate of registration” means a certificate contemplated in section 35;').should == "“agricultural holding” means a portion of land not less than 0.8 hectares in extent used solely or mainly for the purpose of agriculture, horticulture or for breeding or keeping domesticated animals, poultry or bees;\n“approved” means as approved by the Council;\n“bund wall” means a containment wall surrounding an above ground storage tank, constructed of an impervious material and designed to contain 110% of the contents of the tank;\n“certificate of fitness” means a certificate contemplated in section 20;\n“certificate of registration” means a certificate contemplated in section 35;"
|
71
|
-
end
|
72
|
-
|
73
|
-
it 'should break at CAPCASE TO Normal Case' do
|
74
|
-
subject.break_lines('CHAPTER 3 PARKING METER PARKING GROUNDS Place of parking 7. No person may park or cause or permit to be parked any vehicle or allow a vehicle to be or remain in a parking meter parking ground otherwise than in a parking bay.').should == "CHAPTER 3 PARKING METER PARKING GROUNDS\nPlace of parking 7. No person may park or cause or permit to be parked any vehicle or allow a vehicle to be or remain in a parking meter parking ground otherwise than in a parking bay."
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
describe '#strip_toc' do
|
79
|
-
it 'should handle no toc' do
|
80
|
-
s = "City of Johannesburg Metropolitan Municipality
|
81
|
-
CULTURE AND RECREATION BY-LAWS ( )PUBLISHED IN PROVINCIAL GAZETTE EXTRAORDINARY NO 179 DATED 21 MAY 2004 UNDER NOTICE NUMBER 825
|
82
|
-
|
83
|
-
CITY OF JOHANNESBURG METROPOLITAN MUNICIPALITY
|
84
|
-
CULTURE AND RECREATION BY-LAWS
|
85
|
-
The Municipal Manager of the City of Johannesburg Metropolitan Municipality hereby, in terms of Section 13(a) of the Local Government: Municipal Systems Act, 2000 (Act No. 32 of 2000), publishes the Culture and RecreationBy-laws for the City of Johannesburg Metropolitan Municipality, as approved by its Council, as set out hereunder.
|
86
|
-
CITY OF JOHANNESBURG METROPOLITAN MUNICIPALITY
|
87
|
-
CULTURE AND RECREATION BY-LAWS
|
88
|
-
CHAPTER 1 LIBRARY AND INFORMATION SERVICES
|
89
|
-
Definitions and interpretation
|
90
|
-
1. (1) In this Chapter, unless the context otherwise indicates-"
|
91
|
-
subject.strip_toc(s).should == s
|
92
|
-
end
|
93
|
-
|
94
|
-
it 'should strip table of contents' do
|
95
|
-
subject.strip_toc("City of Johannesburg Metropolitan Municipality
|
96
|
-
CULTURE AND RECREATION BY-LAWS ( )PUBLISHED IN PROVINCIAL GAZETTE EXTRAORDINARY NO 179 DATED 21 MAY 2004 UNDER NOTICE NUMBER 825
|
97
|
-
|
98
|
-
CITY OF JOHANNESBURG METROPOLITAN MUNICIPALITY
|
99
|
-
CULTURE AND RECREATION BY-LAWS
|
100
|
-
The Municipal Manager of the City of Johannesburg Metropolitan Municipality hereby, in terms of Section 13(a) of the Local Government: Municipal Systems Act, 2000 (Act No. 32 of 2000), publishes the Culture and RecreationBy-laws for the City of Johannesburg Metropolitan Municipality, as approved by its Council, as set out hereunder.
|
101
|
-
CITY OF JOHANNESBURG METROPOLITAN MUNICIPALITY
|
102
|
-
CULTURE AND RECREATION BY-LAWS
|
103
|
-
TABLE OF CONTENTS
|
104
|
-
CHAPTER 1
|
105
|
-
LIBRARY AND INFORMATION SERVICES
|
106
|
-
1. Definitions and interpretation 2. Admission to library buildings 3. Membership 4. Loan of library material 5. Return of library material 6. Overdue library material 7. Reservation of library material 8. Lost and damaged library material 9. Handling of library material 10. Exposure of library material to notifiable and infectious diseases 11. Library material for special and reference purposes 12. Reproduction of library material and objects and use of facsimile facilities 13. Library hours 14. Hire and use of auditoria and lecture rooms or library space 15. Internet viewing stations 16. Hiring of multimedia library space 17. Performing arts library 18. Availability of By-laws and notices in a library 19. Conduct in the libraries
|
107
|
-
CHAPTER 2
|
108
|
-
ARTS AND CULTURE AND COMMUNITY CENTRE FACILITIES
|
109
|
-
|
110
|
-
Part 1: Hire and use of community arts & culture facilities
|
111
|
-
20. Definitions and interpretation 21. Rights and status of artists 22. Co-operation between Council departments 23. Application for hiring of premises 24. Prescribed fees 25. Payment of fees 26. Period of hire 27. Adjustment of period of hire 28. Joint hire 29. Sub-letting 30. Condition of premises 31. Duties of the hirer 32. Advertisements and decorations 33. Admissions and sale of tickets 34. Overcrowding 35. Sale of refreshments 36. Services 37. Cancellation due to destruction of premises 38. Cancellation due to non-compliance 39. Termination of period of hire 40 Fire hazards and Insurance 41. Storage facilities 42. Equipment 43. Right of entry 44. Inspection 45. Regulations 46. Nuisance
|
112
|
-
Part 2: Community centres
|
113
|
-
47. Group activities 48. Membership 49. Membership fees 50. Use of centres for religious or personal purposes 51. Dress code 52. Conduct of children 53. Application of certain sections of part 1 of Chapter 2 to centres 54. Application of certain sections of Part 2 of Chapter 3 to centres
|
114
|
-
|
115
|
-
CHAPTER 3
|
116
|
-
RECREATION AND SPORT
|
117
|
-
Part 1: Camping and caravan parks
|
118
|
-
55. Definitions and interpretation 56. Lighting of fires prohibited 57. Permits 58. Extension of permits 59. Limitation on the period of occupancy of a camping site 60. Allocation and Use of sites 61. Proper use of roads and pathways 62. Reservation of sites 63. Right of refusal to issue or renew permits 64. Obligations of permit holders 65. Cancellation of permits 66. Access and loitering by members of the public prohibited 67. Site to be left in a clean condition 68. Washing of clothes and utensils and preparation of foodstuffs 69. Trading without permission 70. Damage to Vegetation or Property 71. Instructions of camping officer to be complied with 72 Registration and use of firearms 73. Protection of wildlife 74. Special requirements regarding caravan parks and caravans
|
119
|
-
Part 2: Sport Facilities
|
120
|
-
75. Definitions and interpretation 76. Administration 77. Access conditions 78. Smoking 79. Alcoholic beverages 80. Duties of hirer 81. Dress code 82. Hiring of sport facilities 83. Reservation of sport facilities by the Council 84. Group activities 85. Public decency 86. Clothing and personal effects 87. Prescribed fees 88. Generally prohibited conduct 89. Animals 90. Infectious Diseases 91. Firearms and Traditional Weapons 92. Disturbance by sound systems 93. Sale of food and refreshments 94. Filming and photographs 95. Sport advisory forum
|
121
|
-
|
122
|
-
CHAPTER 4 MISCELLANEOUS 96. Definitions and interpretation 97. Animals in facilities 98. Liability for acts and omissions 99. Offences and penalties 100.
|
123
|
-
Repeal
|
124
|
-
SCHEDULE 1 BY-LAWS REPEALED
|
125
|
-
CHAPTER 1 LIBRARY AND INFORMATION SERVICES
|
126
|
-
Definitions and interpretation
|
127
|
-
1. (1) In this Chapter, unless the context otherwise indicates-").should == "City of Johannesburg Metropolitan Municipality
|
128
|
-
CULTURE AND RECREATION BY-LAWS ( )PUBLISHED IN PROVINCIAL GAZETTE EXTRAORDINARY NO 179 DATED 21 MAY 2004 UNDER NOTICE NUMBER 825
|
129
|
-
|
130
|
-
CITY OF JOHANNESBURG METROPOLITAN MUNICIPALITY
|
131
|
-
CULTURE AND RECREATION BY-LAWS
|
132
|
-
The Municipal Manager of the City of Johannesburg Metropolitan Municipality hereby, in terms of Section 13(a) of the Local Government: Municipal Systems Act, 2000 (Act No. 32 of 2000), publishes the Culture and RecreationBy-laws for the City of Johannesburg Metropolitan Municipality, as approved by its Council, as set out hereunder.
|
133
|
-
CITY OF JOHANNESBURG METROPOLITAN MUNICIPALITY
|
134
|
-
CULTURE AND RECREATION BY-LAWS
|
135
|
-
CHAPTER 1 LIBRARY AND INFORMATION SERVICES
|
136
|
-
Definitions and interpretation
|
137
|
-
1. (1) In this Chapter, unless the context otherwise indicates-"
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
describe '#remove_boilerplate' do
|
142
|
-
it 'should handle no toc' do
|
143
|
-
s = "(2)The provisions of section 12 (1) (a), (b), (d) and (g) and section 12(2), (3), (4) and (5), read with the necessary changes, apply to the taking into custody of cats.\nClaiming of impounded dogs and cats\n_____________________________________________________________________________________________ ___________ By-laws relating to Dogs and Cats for Promulgation\n14. (1) Any person may claim an impounded dog or cat if he or she –\n(a) satisfies the poundmaster that he or she is the owner or is otherwise entitled to the custody of the dog or cat concerned;"
|
144
|
-
|
145
|
-
subject.remove_boilerplate(s).should == "(2)The provisions of section 12 (1) (a), (b), (d) and (g) and section 12(2), (3), (4) and (5), read with the necessary changes, apply to the taking into custody of cats.\nClaiming of impounded dogs and cats\n\n14. (1) Any person may claim an impounded dog or cat if he or she –\n(a) satisfies the poundmaster that he or she is the owner or is otherwise entitled to the custody of the dog or cat concerned;"
|
146
|
-
end
|
147
|
-
end
|
148
19
|
end
|