blacklist 1.0.2
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.
- data/README.textile +25 -0
- data/config/blacklists/en.yml +329 -0
- data/config/blacklists/fr.yml +329 -0
- data/lib/black_list.rb +133 -0
- data/spec/black_list_spec.rb +203 -0
- metadata +67 -0
data/README.textile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
h1. BlackList: dead simple content filtering
|
2
|
+
|
3
|
+
This library is just a simple implementation of a blacklist to filter content. It comes
|
4
|
+
with a set of default words for filtering in config/black_list.yml that were obtained from
|
5
|
+
"http://www.noswearing.com":http://www.noswearing.com. You can add or remove from the list
|
6
|
+
as necessary. It supports two types of filters currently--exact matches and greedy matches.
|
7
|
+
Exact matches will only match if the word is found on its own. Greedy matches will find
|
8
|
+
words nested within other words. It will also work out of the box as a Ruby on Rails plugin.
|
9
|
+
Just drop it in vendor/plugins and it'll work.
|
10
|
+
|
11
|
+
Usage is as follows:
|
12
|
+
|
13
|
+
BlackList.block?("Stupid ass simple.") => true
|
14
|
+
BlackList.block?("Squeaky clean.") => false
|
15
|
+
BlackList.block?("Assassins!") => false
|
16
|
+
|
17
|
+
You can also just search for particular sorts of matches:
|
18
|
+
|
19
|
+
BlackList.greedy?("Stupid ass simple.") => false
|
20
|
+
BlackList.exact?("Stupid ass simple.") => true
|
21
|
+
|
22
|
+
It also supports highlighting flagged words:
|
23
|
+
|
24
|
+
BlackList.highlight("Stupid ass simple.") => "<code><p>Stupid <strong>ass</strong> simple.</p></code>"
|
25
|
+
BlackList.highlight("Squeaky clean.") => "<code><p>Squeaky clean.</p></code>"
|
@@ -0,0 +1,329 @@
|
|
1
|
+
# List obtained from http://www.noswearing.com/
|
2
|
+
---
|
3
|
+
# Exact Matches (only matches a word if it's an exact match)
|
4
|
+
- - anus
|
5
|
+
- arse
|
6
|
+
- arsehole
|
7
|
+
- ass
|
8
|
+
- ass-hat
|
9
|
+
- ass-pirate
|
10
|
+
- assbag
|
11
|
+
- assbandit
|
12
|
+
- assbanger
|
13
|
+
- assbite
|
14
|
+
- assclown
|
15
|
+
- asscock
|
16
|
+
- asscracker
|
17
|
+
- asses
|
18
|
+
- assface
|
19
|
+
- assfuck
|
20
|
+
- assfucker
|
21
|
+
- assgoblin
|
22
|
+
- asshat
|
23
|
+
- asshead
|
24
|
+
- asshole
|
25
|
+
- asshopper
|
26
|
+
- assjacker
|
27
|
+
- asslick
|
28
|
+
- asslicker
|
29
|
+
- assmonkey
|
30
|
+
- assmunch
|
31
|
+
- assmuncher
|
32
|
+
- assnigger
|
33
|
+
- asspirate
|
34
|
+
- assshit
|
35
|
+
- assshole
|
36
|
+
- asssucker
|
37
|
+
- asswad
|
38
|
+
- asswipe
|
39
|
+
- bampot
|
40
|
+
- bastard
|
41
|
+
- beaner
|
42
|
+
- bitch
|
43
|
+
- bitchass
|
44
|
+
- bitches
|
45
|
+
- bitchtits
|
46
|
+
- bitchy
|
47
|
+
- blow job
|
48
|
+
- blowjob
|
49
|
+
- bollocks
|
50
|
+
- bollox
|
51
|
+
- boner
|
52
|
+
- brotherfucker
|
53
|
+
- bullshit
|
54
|
+
- bumblefuck
|
55
|
+
- butt plug
|
56
|
+
- butt-pirate
|
57
|
+
- buttfucka
|
58
|
+
- buttfucker
|
59
|
+
- camel toe
|
60
|
+
- carpetmuncher
|
61
|
+
- chinc
|
62
|
+
- chink
|
63
|
+
- choad
|
64
|
+
- chode
|
65
|
+
- clit
|
66
|
+
- clitface
|
67
|
+
- clitfuck
|
68
|
+
- clusterfuck
|
69
|
+
- cock
|
70
|
+
- cockass
|
71
|
+
- cockbite
|
72
|
+
- cockburger
|
73
|
+
- cockface
|
74
|
+
- cockfucker
|
75
|
+
- cockhead
|
76
|
+
- cockjockey
|
77
|
+
- cockknoker
|
78
|
+
- cockmaster
|
79
|
+
- cockmongler
|
80
|
+
- cockmongruel
|
81
|
+
- cockmonkey
|
82
|
+
- cockmuncher
|
83
|
+
- cocknose
|
84
|
+
- cocknugget
|
85
|
+
- cockshit
|
86
|
+
- cocksmith
|
87
|
+
- cocksmoker
|
88
|
+
- cocksucker
|
89
|
+
- coochie
|
90
|
+
- coochy
|
91
|
+
- coon
|
92
|
+
- cooter
|
93
|
+
- cracker
|
94
|
+
- cum
|
95
|
+
- cumbubble
|
96
|
+
- cumdumpster
|
97
|
+
- cumguzzler
|
98
|
+
- cumjockey
|
99
|
+
- cumslut
|
100
|
+
- cumtart
|
101
|
+
- cunnie
|
102
|
+
- cunnilingus
|
103
|
+
- cunt
|
104
|
+
- cuntface
|
105
|
+
- cunthole
|
106
|
+
- cuntlicker
|
107
|
+
- cuntrag
|
108
|
+
- cuntslut
|
109
|
+
- dago
|
110
|
+
- damn
|
111
|
+
- deggo
|
112
|
+
- dick
|
113
|
+
- dickbag
|
114
|
+
- dickbeaters
|
115
|
+
- dickface
|
116
|
+
- dickfuck
|
117
|
+
- dickfucker
|
118
|
+
- dickhead
|
119
|
+
- dickhole
|
120
|
+
- dickjuice
|
121
|
+
- dickmilk
|
122
|
+
- dickmonger
|
123
|
+
- dicks
|
124
|
+
- dickslap
|
125
|
+
- dicksucker
|
126
|
+
- dickwad
|
127
|
+
- dickweasel
|
128
|
+
- dickweed
|
129
|
+
- dickwod
|
130
|
+
- dike
|
131
|
+
- dildo
|
132
|
+
- dipshit
|
133
|
+
- doochbag
|
134
|
+
- dookie
|
135
|
+
- douche
|
136
|
+
- douche-fag
|
137
|
+
- douchebag
|
138
|
+
- douchewaffle
|
139
|
+
- dumass
|
140
|
+
- dumb ass
|
141
|
+
- dumbass
|
142
|
+
- dumbfuck
|
143
|
+
- dumbshit
|
144
|
+
- dumshit
|
145
|
+
- dyke
|
146
|
+
- fag
|
147
|
+
- fagbag
|
148
|
+
- fagfucker
|
149
|
+
- faggit
|
150
|
+
- faggot
|
151
|
+
- faggotcock
|
152
|
+
- fagtard
|
153
|
+
- fatass
|
154
|
+
- fellatio
|
155
|
+
- feltch
|
156
|
+
- flamer
|
157
|
+
- fuck
|
158
|
+
- fuckass
|
159
|
+
- fuckbag
|
160
|
+
- fuckboy
|
161
|
+
- fuckbrain
|
162
|
+
- fuckbutt
|
163
|
+
- fucked
|
164
|
+
- fucker
|
165
|
+
- fuckersucker
|
166
|
+
- fuckface
|
167
|
+
- fuckhead
|
168
|
+
- fuckhole
|
169
|
+
- fuckin
|
170
|
+
- fucking
|
171
|
+
- fucknut
|
172
|
+
- fucknutt
|
173
|
+
- fuckoff
|
174
|
+
- fucks
|
175
|
+
- fuckstick
|
176
|
+
- fucktard
|
177
|
+
- fuckup
|
178
|
+
- fuckwad
|
179
|
+
- fuckwit
|
180
|
+
- fuckwitt
|
181
|
+
- fudgepacker
|
182
|
+
- gay
|
183
|
+
- gayass
|
184
|
+
- gaybob
|
185
|
+
- gaydo
|
186
|
+
- gayfuck
|
187
|
+
- gayfuckist
|
188
|
+
- gaylord
|
189
|
+
- gaytard
|
190
|
+
- gaywad
|
191
|
+
- goddamn
|
192
|
+
- goddamnit
|
193
|
+
- gooch
|
194
|
+
- gook
|
195
|
+
- gringo
|
196
|
+
- guido
|
197
|
+
- handjob
|
198
|
+
- hard on
|
199
|
+
- heeb
|
200
|
+
- hell
|
201
|
+
- ho
|
202
|
+
- hoe
|
203
|
+
- homo
|
204
|
+
- homodumbshit
|
205
|
+
- honkey
|
206
|
+
- humping
|
207
|
+
- jackass
|
208
|
+
- jap
|
209
|
+
- jerk off
|
210
|
+
- jigaboo
|
211
|
+
- jizz
|
212
|
+
- jungle bunny
|
213
|
+
- junglebunny
|
214
|
+
- kike
|
215
|
+
- kooch
|
216
|
+
- kootch
|
217
|
+
- kunt
|
218
|
+
- kyke
|
219
|
+
- lesbian
|
220
|
+
- lesbo
|
221
|
+
- lezzie
|
222
|
+
- mcfagget
|
223
|
+
- mick
|
224
|
+
- minge
|
225
|
+
- mothafucka
|
226
|
+
- motherfucker
|
227
|
+
- motherfucking
|
228
|
+
- muff
|
229
|
+
- muffdiver
|
230
|
+
- munging
|
231
|
+
- negro
|
232
|
+
- nigga
|
233
|
+
- nigger
|
234
|
+
- niggers
|
235
|
+
- niglet
|
236
|
+
- nut sack
|
237
|
+
- nutsack
|
238
|
+
- paki
|
239
|
+
- panooch
|
240
|
+
- pecker
|
241
|
+
- peckerhead
|
242
|
+
- penis
|
243
|
+
- penisfucker
|
244
|
+
- penispuffer
|
245
|
+
- piss
|
246
|
+
- pissed
|
247
|
+
- pissed off
|
248
|
+
- pissflaps
|
249
|
+
- polesmoker
|
250
|
+
- pollock
|
251
|
+
- poon
|
252
|
+
- poonani
|
253
|
+
- poonany
|
254
|
+
- poontang
|
255
|
+
- porch monkey
|
256
|
+
- porchmonkey
|
257
|
+
- prick
|
258
|
+
- punanny
|
259
|
+
- punta
|
260
|
+
- pussies
|
261
|
+
- pussy
|
262
|
+
- pussylicking
|
263
|
+
- puto
|
264
|
+
- queef
|
265
|
+
- queer
|
266
|
+
- queerbait
|
267
|
+
- queerhole
|
268
|
+
- renob
|
269
|
+
- rimjob
|
270
|
+
- ruski
|
271
|
+
- sand nigger
|
272
|
+
- sandnigger
|
273
|
+
- schlong
|
274
|
+
- scrote
|
275
|
+
- shit
|
276
|
+
- shitass
|
277
|
+
- shitbag
|
278
|
+
- shitbagger
|
279
|
+
- shitbrains
|
280
|
+
- shitbreath
|
281
|
+
- shitcunt
|
282
|
+
- shitdick
|
283
|
+
- shitface
|
284
|
+
- shitfaced
|
285
|
+
- shithead
|
286
|
+
- shithole
|
287
|
+
- shithouse
|
288
|
+
- shitspitter
|
289
|
+
- shitstain
|
290
|
+
- shitter
|
291
|
+
- shittiest
|
292
|
+
- shitting
|
293
|
+
- shitty
|
294
|
+
- shiz
|
295
|
+
- shiznit
|
296
|
+
- skank
|
297
|
+
- skeet
|
298
|
+
- skullfuck
|
299
|
+
- slut
|
300
|
+
- slutbag
|
301
|
+
- smeg
|
302
|
+
- snatch
|
303
|
+
- spic
|
304
|
+
- spick
|
305
|
+
- splooge
|
306
|
+
- tard
|
307
|
+
- testicle
|
308
|
+
- thundercunt
|
309
|
+
- tit
|
310
|
+
- titfuck
|
311
|
+
- tits
|
312
|
+
- tittyfuck
|
313
|
+
- twat
|
314
|
+
- twatlips
|
315
|
+
- twats
|
316
|
+
- twatwaffle
|
317
|
+
- unclefucker
|
318
|
+
- va-j-j
|
319
|
+
- vag
|
320
|
+
- vagina
|
321
|
+
- vjayjay
|
322
|
+
- wank
|
323
|
+
- wetback
|
324
|
+
- whore
|
325
|
+
- whorebag
|
326
|
+
- whoreface
|
327
|
+
- wop
|
328
|
+
# Greedy Matches (matches if the word occurs anywhere--including inside other words)
|
329
|
+
- - fuck
|
@@ -0,0 +1,329 @@
|
|
1
|
+
# List obtained from http://www.noswearing.com/
|
2
|
+
---
|
3
|
+
# Exact Matches (only matches a word if it's an exact match)
|
4
|
+
- - anus
|
5
|
+
- arse
|
6
|
+
- arsehole
|
7
|
+
- ass
|
8
|
+
- ass-hat
|
9
|
+
- ass-pirate
|
10
|
+
- assbag
|
11
|
+
- assbandit
|
12
|
+
- assbanger
|
13
|
+
- assbite
|
14
|
+
- assclown
|
15
|
+
- asscock
|
16
|
+
- asscracker
|
17
|
+
- asses
|
18
|
+
- assface
|
19
|
+
- assfuck
|
20
|
+
- assfucker
|
21
|
+
- assgoblin
|
22
|
+
- asshat
|
23
|
+
- asshead
|
24
|
+
- asshole
|
25
|
+
- asshopper
|
26
|
+
- assjacker
|
27
|
+
- asslick
|
28
|
+
- asslicker
|
29
|
+
- assmonkey
|
30
|
+
- assmunch
|
31
|
+
- assmuncher
|
32
|
+
- assnigger
|
33
|
+
- asspirate
|
34
|
+
- assshit
|
35
|
+
- assshole
|
36
|
+
- asssucker
|
37
|
+
- asswad
|
38
|
+
- asswipe
|
39
|
+
- bampot
|
40
|
+
- bastard
|
41
|
+
- beaner
|
42
|
+
- bitch
|
43
|
+
- bitchass
|
44
|
+
- bitches
|
45
|
+
- bitchtits
|
46
|
+
- bitchy
|
47
|
+
- blow job
|
48
|
+
- blowjob
|
49
|
+
- bollocks
|
50
|
+
- bollox
|
51
|
+
- boner
|
52
|
+
- brotherfucker
|
53
|
+
- bullshit
|
54
|
+
- bumblefuck
|
55
|
+
- butt plug
|
56
|
+
- butt-pirate
|
57
|
+
- buttfucka
|
58
|
+
- buttfucker
|
59
|
+
- camel toe
|
60
|
+
- carpetmuncher
|
61
|
+
- chinc
|
62
|
+
- chink
|
63
|
+
- choad
|
64
|
+
- chode
|
65
|
+
- clit
|
66
|
+
- clitface
|
67
|
+
- clitfuck
|
68
|
+
- clusterfuck
|
69
|
+
- cock
|
70
|
+
- cockass
|
71
|
+
- cockbite
|
72
|
+
- cockburger
|
73
|
+
- cockface
|
74
|
+
- cockfucker
|
75
|
+
- cockhead
|
76
|
+
- cockjockey
|
77
|
+
- cockknoker
|
78
|
+
- cockmaster
|
79
|
+
- cockmongler
|
80
|
+
- cockmongruel
|
81
|
+
- cockmonkey
|
82
|
+
- cockmuncher
|
83
|
+
- cocknose
|
84
|
+
- cocknugget
|
85
|
+
- cockshit
|
86
|
+
- cocksmith
|
87
|
+
- cocksmoker
|
88
|
+
- cocksucker
|
89
|
+
- coochie
|
90
|
+
- coochy
|
91
|
+
- coon
|
92
|
+
- cooter
|
93
|
+
- cracker
|
94
|
+
- cum
|
95
|
+
- cumbubble
|
96
|
+
- cumdumpster
|
97
|
+
- cumguzzler
|
98
|
+
- cumjockey
|
99
|
+
- cumslut
|
100
|
+
- cumtart
|
101
|
+
- cunnie
|
102
|
+
- cunnilingus
|
103
|
+
- cunt
|
104
|
+
- cuntface
|
105
|
+
- cunthole
|
106
|
+
- cuntlicker
|
107
|
+
- cuntrag
|
108
|
+
- cuntslut
|
109
|
+
- dago
|
110
|
+
- damn
|
111
|
+
- deggo
|
112
|
+
- dick
|
113
|
+
- dickbag
|
114
|
+
- dickbeaters
|
115
|
+
- dickface
|
116
|
+
- dickfuck
|
117
|
+
- dickfucker
|
118
|
+
- dickhead
|
119
|
+
- dickhole
|
120
|
+
- dickjuice
|
121
|
+
- dickmilk
|
122
|
+
- dickmonger
|
123
|
+
- dicks
|
124
|
+
- dickslap
|
125
|
+
- dicksucker
|
126
|
+
- dickwad
|
127
|
+
- dickweasel
|
128
|
+
- dickweed
|
129
|
+
- dickwod
|
130
|
+
- dike
|
131
|
+
- dildo
|
132
|
+
- dipshit
|
133
|
+
- doochbag
|
134
|
+
- dookie
|
135
|
+
- douche
|
136
|
+
- douche-fag
|
137
|
+
- douchebag
|
138
|
+
- douchewaffle
|
139
|
+
- dumass
|
140
|
+
- dumb ass
|
141
|
+
- dumbass
|
142
|
+
- dumbfuck
|
143
|
+
- dumbshit
|
144
|
+
- dumshit
|
145
|
+
- dyke
|
146
|
+
- fag
|
147
|
+
- fagbag
|
148
|
+
- fagfucker
|
149
|
+
- faggit
|
150
|
+
- faggot
|
151
|
+
- faggotcock
|
152
|
+
- fagtard
|
153
|
+
- fatass
|
154
|
+
- fellatio
|
155
|
+
- feltch
|
156
|
+
- flamer
|
157
|
+
- fuck
|
158
|
+
- fuckass
|
159
|
+
- fuckbag
|
160
|
+
- fuckboy
|
161
|
+
- fuckbrain
|
162
|
+
- fuckbutt
|
163
|
+
- fucked
|
164
|
+
- fucker
|
165
|
+
- fuckersucker
|
166
|
+
- fuckface
|
167
|
+
- fuckhead
|
168
|
+
- fuckhole
|
169
|
+
- fuckin
|
170
|
+
- fucking
|
171
|
+
- fucknut
|
172
|
+
- fucknutt
|
173
|
+
- fuckoff
|
174
|
+
- fucks
|
175
|
+
- fuckstick
|
176
|
+
- fucktard
|
177
|
+
- fuckup
|
178
|
+
- fuckwad
|
179
|
+
- fuckwit
|
180
|
+
- fuckwitt
|
181
|
+
- fudgepacker
|
182
|
+
- gay
|
183
|
+
- gayass
|
184
|
+
- gaybob
|
185
|
+
- gaydo
|
186
|
+
- gayfuck
|
187
|
+
- gayfuckist
|
188
|
+
- gaylord
|
189
|
+
- gaytard
|
190
|
+
- gaywad
|
191
|
+
- goddamn
|
192
|
+
- goddamnit
|
193
|
+
- gooch
|
194
|
+
- gook
|
195
|
+
- gringo
|
196
|
+
- guido
|
197
|
+
- handjob
|
198
|
+
- hard on
|
199
|
+
- heeb
|
200
|
+
- hell
|
201
|
+
- ho
|
202
|
+
- hoe
|
203
|
+
- homo
|
204
|
+
- homodumbshit
|
205
|
+
- honkey
|
206
|
+
- humping
|
207
|
+
- jackass
|
208
|
+
- jap
|
209
|
+
- jerk off
|
210
|
+
- jigaboo
|
211
|
+
- jizz
|
212
|
+
- jungle bunny
|
213
|
+
- junglebunny
|
214
|
+
- kike
|
215
|
+
- kooch
|
216
|
+
- kootch
|
217
|
+
- kunt
|
218
|
+
- kyke
|
219
|
+
- lesbian
|
220
|
+
- lesbo
|
221
|
+
- lezzie
|
222
|
+
- mcfagget
|
223
|
+
- mick
|
224
|
+
- minge
|
225
|
+
- mothafucka
|
226
|
+
- motherfucker
|
227
|
+
- motherfucking
|
228
|
+
- muff
|
229
|
+
- muffdiver
|
230
|
+
- munging
|
231
|
+
- negro
|
232
|
+
- nigga
|
233
|
+
- nigger
|
234
|
+
- niggers
|
235
|
+
- niglet
|
236
|
+
- nut sack
|
237
|
+
- nutsack
|
238
|
+
- paki
|
239
|
+
- panooch
|
240
|
+
- pecker
|
241
|
+
- peckerhead
|
242
|
+
- penis
|
243
|
+
- penisfucker
|
244
|
+
- penispuffer
|
245
|
+
- piss
|
246
|
+
- pissed
|
247
|
+
- pissed off
|
248
|
+
- pissflaps
|
249
|
+
- polesmoker
|
250
|
+
- pollock
|
251
|
+
- poon
|
252
|
+
- poonani
|
253
|
+
- poonany
|
254
|
+
- poontang
|
255
|
+
- porch monkey
|
256
|
+
- porchmonkey
|
257
|
+
- prick
|
258
|
+
- punanny
|
259
|
+
- punta
|
260
|
+
- pussies
|
261
|
+
- pussy
|
262
|
+
- pussylicking
|
263
|
+
- puto
|
264
|
+
- queef
|
265
|
+
- queer
|
266
|
+
- queerbait
|
267
|
+
- queerhole
|
268
|
+
- renob
|
269
|
+
- rimjob
|
270
|
+
- ruski
|
271
|
+
- sand nigger
|
272
|
+
- sandnigger
|
273
|
+
- schlong
|
274
|
+
- scrote
|
275
|
+
- shit
|
276
|
+
- shitass
|
277
|
+
- shitbag
|
278
|
+
- shitbagger
|
279
|
+
- shitbrains
|
280
|
+
- shitbreath
|
281
|
+
- shitcunt
|
282
|
+
- shitdick
|
283
|
+
- shitface
|
284
|
+
- shitfaced
|
285
|
+
- shithead
|
286
|
+
- shithole
|
287
|
+
- shithouse
|
288
|
+
- shitspitter
|
289
|
+
- shitstain
|
290
|
+
- shitter
|
291
|
+
- shittiest
|
292
|
+
- shitting
|
293
|
+
- shitty
|
294
|
+
- shiz
|
295
|
+
- shiznit
|
296
|
+
- skank
|
297
|
+
- skeet
|
298
|
+
- skullfuck
|
299
|
+
- slut
|
300
|
+
- slutbag
|
301
|
+
- smeg
|
302
|
+
- snatch
|
303
|
+
- spic
|
304
|
+
- spick
|
305
|
+
- splooge
|
306
|
+
- tard
|
307
|
+
- testicle
|
308
|
+
- thundercunt
|
309
|
+
- tit
|
310
|
+
- titfuck
|
311
|
+
- tits
|
312
|
+
- tittyfuck
|
313
|
+
- twat
|
314
|
+
- twatlips
|
315
|
+
- twats
|
316
|
+
- twatwaffle
|
317
|
+
- unclefucker
|
318
|
+
- va-j-j
|
319
|
+
- vag
|
320
|
+
- vagina
|
321
|
+
- vjayjay
|
322
|
+
- wank
|
323
|
+
- wetback
|
324
|
+
- whore
|
325
|
+
- whorebag
|
326
|
+
- whoreface
|
327
|
+
- wop
|
328
|
+
# Greedy Matches (matches if the word occurs anywhere--including inside other words)
|
329
|
+
- - fuck
|
data/lib/black_list.rb
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
#:title: BlackList RDoc Documentation
|
2
|
+
#
|
3
|
+
# = BlackList: dead simple content filtering
|
4
|
+
#
|
5
|
+
# This library is just a simple implementation of a blacklist to filter content.
|
6
|
+
# It comes with a set of default words for filtering in config/black_list.yml that
|
7
|
+
# were obtained from http://www.noswearing.com. You can add or remove from the list
|
8
|
+
# as necessary. It supports two types of filters currently--exact matches and greedy
|
9
|
+
# matches.Exact matches will only match if the word is found on its own. Greedy
|
10
|
+
# matches will find words nested within other words. It will also work out of the
|
11
|
+
# box as a Ruby on Rails plugin. Just drop it in vendor/plugins and it'll work.
|
12
|
+
#
|
13
|
+
# Usage is as follows:
|
14
|
+
#
|
15
|
+
# BlackList.block?("Stupid ass simple.") => true
|
16
|
+
# BlackList.block?("Squeaky clean.") => false
|
17
|
+
# BlackList.block?("Assassins!") => false
|
18
|
+
#
|
19
|
+
# You can also just search for particular sorts of matches:
|
20
|
+
#
|
21
|
+
# BlackList.greedy?("Stupid ass simple.") => false
|
22
|
+
# BlackList.exact?("Stupid ass simple.") => true
|
23
|
+
#
|
24
|
+
# It also supports highlighting flagged words:
|
25
|
+
#
|
26
|
+
# BlackList.highlight("Stupid ass simple.") => "<code><p>Stupid <strong>ass</strong> simple.</p></code>"
|
27
|
+
# BlackList.highlight("Squeaky clean.") => "<code><p>Squeaky clean.</p></code>"
|
28
|
+
|
29
|
+
require 'yaml'
|
30
|
+
require 'rubygems'
|
31
|
+
require 'RedCloth'
|
32
|
+
require 'singleton'
|
33
|
+
|
34
|
+
class BlackList
|
35
|
+
include Singleton
|
36
|
+
attr_accessor :exact, :greedy
|
37
|
+
|
38
|
+
# Redirects all method calls made directly on BlackList to
|
39
|
+
# BlackList.instance. For example:
|
40
|
+
#
|
41
|
+
# BlackList.greedy?("foo") => BlackList.instance.greedy?("foo")
|
42
|
+
def self.method_missing(method, *args) #:nodoc:
|
43
|
+
self.instance.send(method, *args) unless method == :instance
|
44
|
+
end
|
45
|
+
|
46
|
+
# Loads blacklist words from black_list.yml and removes any
|
47
|
+
# nested greedy words. This is always called implicitly due
|
48
|
+
# to the fact that BlackList is a Singleton. As such, there
|
49
|
+
# is only ever one instance.
|
50
|
+
def initialize #:nodoc:
|
51
|
+
load_words!
|
52
|
+
trim_greedy_words!
|
53
|
+
end
|
54
|
+
|
55
|
+
# Check the supplied text to see whether it contains a blacklisted
|
56
|
+
# word and should be blocked.
|
57
|
+
def block?(text)
|
58
|
+
greedy?(text) or exact?(text)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Check the supplied text to see whether it contains an exact
|
62
|
+
# blacklisted word.
|
63
|
+
def exact?(text)
|
64
|
+
check(text, :exact, @exact)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Check the supplied text to see whether it contains a greedy
|
68
|
+
# blacklisted word.
|
69
|
+
def greedy?(text)
|
70
|
+
check(text, :greedy, @greedy)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Get the supplied text in HTML format with any blacklisted
|
74
|
+
# words bolded. Text is passed through a Textile markup
|
75
|
+
# processor (RedCloth).
|
76
|
+
def highlight(text)
|
77
|
+
return text if text !~ /\S/
|
78
|
+
|
79
|
+
text = highlight_words!(text, :exact, @exact)
|
80
|
+
text = highlight_words!(text, :greedy, @greedy)
|
81
|
+
|
82
|
+
RedCloth.new(text).to_html
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
# Removes words that are supersets of other @greedy words.
|
87
|
+
# For example, "assassin" would be removed if it was a
|
88
|
+
# @greedy word and another @greedy word, "ass" existed.
|
89
|
+
def trim_greedy_words!
|
90
|
+
@greedy.each do |word|
|
91
|
+
@greedy.delete_if{ |other_word| other_word.match(word) && word != other_word }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# Return text with Textile markup for bolding all blacklisted
|
96
|
+
# words of the designated match kind.
|
97
|
+
def highlight_words!(text, kind, words)
|
98
|
+
words.each do |word|
|
99
|
+
if kind == :greedy
|
100
|
+
text.gsub!(/(#{word})+/i, '*\1*')
|
101
|
+
else
|
102
|
+
text.gsub!(/\b(#{word})\b/i, '*\1*')
|
103
|
+
end
|
104
|
+
end unless words.nil?
|
105
|
+
text
|
106
|
+
end
|
107
|
+
|
108
|
+
# Check the supplied text for any of the supplied words
|
109
|
+
# using the designated match kind.
|
110
|
+
def check(text, kind, words) #:doc:
|
111
|
+
return false if words.nil?
|
112
|
+
words.each do |word|
|
113
|
+
return true if (kind == :greedy ? greedy_match?(text, word) : exact_match?(text, word))
|
114
|
+
end
|
115
|
+
false
|
116
|
+
end
|
117
|
+
|
118
|
+
# Check for exact matches of word in the supplied text.
|
119
|
+
def exact_match?(text, word) #:doc:
|
120
|
+
text =~ /\b#{word}\b/i
|
121
|
+
end
|
122
|
+
|
123
|
+
# Check for greedy matches of word in the supplied text.
|
124
|
+
def greedy_match?(text, word) #:doc:
|
125
|
+
text =~ /(#{word})+/i
|
126
|
+
end
|
127
|
+
|
128
|
+
# Load all blacklisted words from black_list.yml and save
|
129
|
+
# then in @exact and @greedy.
|
130
|
+
def load_words!
|
131
|
+
@exact, @greedy = YAML::load(File.read(File.join(File.dirname(__FILE__), "../config/blacklists/#{I18n.locale}.yml")))
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,203 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../lib/black_list')
|
2
|
+
|
3
|
+
describe BlackList do
|
4
|
+
before(:all) do
|
5
|
+
@clean_phrase = "This is a clean phrase."
|
6
|
+
@greedy_phrase = "Oh, fuck!"
|
7
|
+
@exact_phrase = "Let's kick some ass!"
|
8
|
+
@nested_greedy_phrase = "I have had it with these motherfucking snakes on this motherfucking plane!"
|
9
|
+
@nested_exact_phrase = "Watch out for the assassin!"
|
10
|
+
@capcase_exact_phrase = "Let's kick some AsS!"
|
11
|
+
@capcase_greedy_phrase = "Oh, FuCk!"
|
12
|
+
@multiple_phrase = "Oh, fuck! I have had it with these motherfucking snakes on this motherfucking plane!"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should have an array of words in @greedy" do
|
16
|
+
BlackList.greedy.should be_kind_of(Array)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should have an array of words in @exact" do
|
20
|
+
BlackList.exact.should be_kind_of(Array)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should set @greedy with supplied values" do
|
24
|
+
lambda { BlackList.greedy = ["foo"] }.should change(BlackList, :greedy).from(nil).to(["foo"])
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should set @exact with supplied values" do
|
28
|
+
lambda { BlackList.exact = ["foo"] }.should change(BlackList, :exact).from(nil).to(["foo"])
|
29
|
+
end
|
30
|
+
|
31
|
+
describe ".load_words!" do
|
32
|
+
before(:each) do
|
33
|
+
BlackList.greedy = nil
|
34
|
+
BlackList.exact = nil
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should load exact blacklist words" do
|
38
|
+
lambda { BlackList.send(:load_words!) }.should change(BlackList, :exact)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should load greedy blacklist words" do
|
42
|
+
lambda { BlackList.send(:load_words!) }.should change(BlackList, :greedy)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe ".block?" do
|
47
|
+
it "should not block if no words are found" do
|
48
|
+
BlackList.block?(@clean_phrase).should be_false
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should find exact matches" do
|
52
|
+
BlackList.block?(@exact_phrase).should be_true
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should find greedy matches" do
|
56
|
+
BlackList.block?(@greedy_phrase).should be_true
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe ".exact?" do
|
61
|
+
it "should only find words in the EXACT list" do
|
62
|
+
BlackList.exact?(BlackList.greedy.join(" ")).should be_false
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should find exact matches" do
|
66
|
+
BlackList.exact?(@exact_phrase).should be_true
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should not find nested words" do
|
70
|
+
BlackList.exact?(@assassin_phrase).should be_false
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should be case insensitive" do
|
74
|
+
BlackList.exact?(@capcase_exact_phrase).should be_true
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe ".greedy?" do
|
79
|
+
it "should find exact words" do
|
80
|
+
BlackList.greedy?(@greedy_phrase).should be_true
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should find nested words" do
|
84
|
+
BlackList.greedy?(@nested_greedy_phrase).should be_true
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should be case insensitive" do
|
88
|
+
BlackList.greedy?(@capcase_greedy_phrase).should be_true
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
describe ".highlight" do
|
93
|
+
it "should return HTML" do
|
94
|
+
BlackList.highlight(@clean_phrase).should =~ /<p>.*?<\/p>/
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should return a single set of <strong> tags when only one word is flagged" do
|
98
|
+
BlackList.highlight(@greedy_phrase).should =~ /((.*?)(<strong>.*?<\/strong>)){1}/
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should return a set of <strong> tags for each blacklisted word" do
|
102
|
+
BlackList.highlight(@multiple_phrase).should =~ /((.*?)(<strong>.*?<\/strong>)){3}/
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should not return <strong> tags in a clean phrase" do
|
106
|
+
BlackList.highlight(@clean_phrase).should_not =~ /((.*?)(<strong>.*?<\/strong>)){1}/
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should not endlessly replace greedy words when a superset greedy word exists" do
|
110
|
+
@nested_greedy_phrase = "A test where fag is mentioned along with faggot."
|
111
|
+
BlackList.highlight(@nested_greedy_phrase).should =~ /((.*?)(<strong>.*?<\/strong>)){2}/
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe ".highlight_words!" do
|
116
|
+
it "should not alter text if the supplied array is nil when kind is :exact" do
|
117
|
+
BlackList.highlight_words!("This should be highlighted.", :exact, nil).should_not =~ /((.*?)(\*.*?\*)){1}/
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should not alter text if the supplied array is nil when kind is :greedy" do
|
121
|
+
BlackList.highlight_words!("This should be highlighted.", :greedy, nil).should_not =~ /((.*?)(\*.*?\*)){1}/
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should not alter text if the supplied array is empty when kind is :exact" do
|
125
|
+
BlackList.highlight_words!("This should be highlighted.", :exact, []).should_not =~ /((.*?)(\*.*?\*)){1}/
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should not alter text if the supplied array is empty when kind is :greedy" do
|
129
|
+
BlackList.highlight_words!("This should be highlighted.", :greedy, []).should_not =~ /((.*?)(\*.*?\*)){1}/
|
130
|
+
end
|
131
|
+
|
132
|
+
it "should use supplied array when kind is :exact" do
|
133
|
+
BlackList.highlight_words!("This should this be highlighted.", :exact, ["this"]).should =~ /((.*?)(\*.*?\*)){1}/
|
134
|
+
end
|
135
|
+
|
136
|
+
it "should use supplied array when kind is :greedy" do
|
137
|
+
BlackList.highlight_words!("This should be highlighted.", :greedy, ["highlight"]).should =~ /((.*?)(\*.*?\*)){1}/
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
describe ".check" do
|
142
|
+
it "should return false if supplied words equal nil when kind is :greedy" do
|
143
|
+
BlackList.send(:check, "This is a greedy test.", :greedy, nil).should be_false
|
144
|
+
end
|
145
|
+
|
146
|
+
it "should return false if supplied words equal nil when kind is :exact" do
|
147
|
+
BlackList.send(:check, "This is a greedy test.", :exact, nil).should be_false
|
148
|
+
end
|
149
|
+
|
150
|
+
it "should find greedy words when kind is :greedy" do
|
151
|
+
BlackList.send(:check, "This is a greedy test.", :greedy, ["greed"]).should be_true
|
152
|
+
end
|
153
|
+
|
154
|
+
it "should find exact words when kind is :greedy" do
|
155
|
+
BlackList.send(:check, "This is a greedy test.", :greedy, ["greedy"]).should be_true
|
156
|
+
end
|
157
|
+
|
158
|
+
it "should find exact words when kind is :exact" do
|
159
|
+
BlackList.send(:check, "This is a greedy test.", :exact, ["greedy"]).should be_true
|
160
|
+
end
|
161
|
+
|
162
|
+
it "should not find greedy words when kind is :exact" do
|
163
|
+
BlackList.send(:check, "This is a greedy test.", :exact, ["greed"]).should be_false
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
describe ".exact_match?" do
|
168
|
+
it "should not be nil for exact matches" do
|
169
|
+
BlackList.send(:exact_match?, "This is a greedy test.", "greedy").should_not be_nil
|
170
|
+
end
|
171
|
+
|
172
|
+
it "should be nil for greedy matches" do
|
173
|
+
BlackList.send(:exact_match?, "This is a greedy test.", "greed").should be_nil
|
174
|
+
end
|
175
|
+
|
176
|
+
it "should be nil for no matches" do
|
177
|
+
BlackList.send(:exact_match?, "This is a test.", "greedy").should be_nil
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
describe ".greedy_match?" do
|
182
|
+
it "should not be nil for greedy matches" do
|
183
|
+
BlackList.send(:greedy_match?, "This is a greedy test.", "greed").should_not be_nil
|
184
|
+
end
|
185
|
+
|
186
|
+
it "should not be nil for exact matches" do
|
187
|
+
BlackList.send(:greedy_match?, "This is a greedy test.", "greedy").should_not be_nil
|
188
|
+
end
|
189
|
+
|
190
|
+
it "should be nil for no matches" do
|
191
|
+
BlackList.send(:greedy_match?, "This is a test.", "greedy").should be_nil
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
describe ".trim_greedy_words!" do
|
196
|
+
it "should remove words that are supersets of other greedy words" do
|
197
|
+
BlackList.greedy = ["foo", "foobar", "foobarbaz"]
|
198
|
+
BlackList.send(:trim_greedy_words!)
|
199
|
+
BlackList.greedy.first.should == "foo"
|
200
|
+
BlackList.greedy.size.should == 1
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
metadata
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: blacklist
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Joel Watson
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-09-10 00:00:00 -04:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: RedCloth
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
description: BlackList is a Ruby library offering simple content filtering via blacklisted words.
|
26
|
+
email: github@watsonian.otherinbox.com
|
27
|
+
executables: []
|
28
|
+
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files: []
|
32
|
+
|
33
|
+
files:
|
34
|
+
- README.textile
|
35
|
+
- lib/black_list.rb
|
36
|
+
- config/blacklists/en.yml
|
37
|
+
- config/blacklists/fr.yml
|
38
|
+
has_rdoc: true
|
39
|
+
homepage: http://github.com/watsonian/blacklist
|
40
|
+
licenses: []
|
41
|
+
|
42
|
+
post_install_message:
|
43
|
+
rdoc_options: []
|
44
|
+
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: "0"
|
52
|
+
version:
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: "0"
|
58
|
+
version:
|
59
|
+
requirements: []
|
60
|
+
|
61
|
+
rubyforge_project:
|
62
|
+
rubygems_version: 1.3.5
|
63
|
+
signing_key:
|
64
|
+
specification_version: 3
|
65
|
+
summary: A simple content filtering system
|
66
|
+
test_files:
|
67
|
+
- spec/black_list_spec.rb
|