Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion language_filter.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@ Gem::Specification.new do |spec|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ["lib"]

spec.add_development_dependency "bundler", "~> 1.3"
spec.add_development_dependency "bundler"
spec.add_development_dependency "rake"
end
52 changes: 25 additions & 27 deletions lib/language_filter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@

module LanguageFilter
class Filter
attr_accessor :matchlist, :exceptionlist, :replacement, :creative_letters
attr_reader :creative_matchlist
attr_accessor :creative_letters
attr_reader :creative_matchlist, :matchlist, :exceptionlist, :replacement

CREATIVE_BEG_REGEX = '(?<=\\s|\\A|_|\\-|\\.)'
CREATIVE_END_REGEX = '(?=\\b|\\s|\\z|_|\\-|\\.)'
Expand Down Expand Up @@ -142,7 +142,7 @@ def sanitize(text)
def validate_list_content(content)
case content
when Array then content.all? {|c| c.class == String} || raise(LanguageFilter::EmptyContentList.new("List content array is empty."))
when String then File.exists?(content) || raise(LanguageFilter::UnkownContentFile.new("List content file \"#{content}\" can't be found."))
when String then File.exist?(content) || raise(LanguageFilter::UnkownContentFile.new("List content file \"#{content}\" can't be found."))
when Pathname then content.exist? || raise(LanguageFilter::UnkownContentFile.new("List content file \"#{content}\" can't be found."))
when Symbol then
case content
Expand Down Expand Up @@ -181,33 +181,31 @@ def load_list(filepath)
def use_creative_letters(text)
new_text = ""
last_char = ""
first_char_done = false
text.each_char do |char|
if last_char != '\\'
# new_text += '[\\-_\\s\\*\\.\\,\\`\\:\\\']*' if last_char != "" and char =~ /[A-Za-z]/ and first_char_done
new_text += case char.downcase
when 'a' then first_char_done = true; '(?:(?:a|@|4|\\^|/\\\\|/\\-\\\\|aye?)+)'
when 'b' then first_char_done = true; '(?:(?:b|i3|l3|13|\\|3|/3|\\\\3|3|8|6|\\u00df|p\\>|\\|\\:|[^a-z]bee+[^a-z])+)'
when 'c','k' then first_char_done = true; '(?:(?:c|\\u00a9|\\u00a2|\\(|\\[|[^a-z]cee+[^a-z]|[^a-z]see+[^a-z]|k|x|[\\|\\[\\]\\)\\(li1\\!\\u00a1][\\<\\{\\(]|[^a-z][ck]ay+[^a-z])+)'
when 'd' then first_char_done = true; '(?:(?:d|\\)|\\|\\)|\\[\\)|\\?|\\|\\>|\\|o|[^a-z]dee+[^a-z])+)'
when 'e' then first_char_done = true; '(?:(?:e|3|\\&|\\u20ac|\\u00eb|\\[\\-)+)'
when 'f' then first_char_done = true; '(?:(?:f|ph|\\u0192|[\\|\\}\\{\\\\/\\(\\)\\[\\]1il\\!][\\=\\#]|[^a-z]ef+[^a-z])+)'
when 'g' then first_char_done = true; '(?:(?:g|6|9|\\&|c\\-|\\(_\\+|[^a-z]gee+[^a-z])+)'
when 'h' then first_char_done = true; '(?:(?:h|\\#|[\\|\\}\\{\\\\/\\(\\)\\[\\]]\\-?[\\|\\}\\{\\\\/\\(\\)\\[\\]])+)'
when 'i','l' then first_char_done = true; '(?:(?:i|l|1|\\!|\\u00a1|\\||\\]|\\[|\\\\|/|[^a-z]eye[^a-z]|\\u00a3|[\\|li1\\!\\u00a1\\[\\]\\(\\)\\{\\}]_|\\u00ac|[^a-z]el+[^a-z]))'
when 'j' then first_char_done = true; '(?:(?:j|\\]|\\u00bf|_\\||_/|\\</|\\(/|[^a-z]jay+[^a-z])+)'
when 'm' then first_char_done = true; '(?:(?:m|[\\|\\(\\)/](?:\\\\/|v|\\|)[\\|\\(\\)\\\\]|\\^\\^|[^a-z]em+[^a-z])+)'
when 'n' then first_char_done = true; '(?:(?:n|[\\|/\\[\\]\\<\\>]\\\\[\\|/\\[\\]\\<\\>]|/v|\\^/|[^a-z]en+[^a-z])+)'
when 'o' then first_char_done = true; '(?:(?:o|0|\\(\\)|\\[\\]|\\u00b0|[^a-z]oh+[^a-z])+)'
when 'p' then first_char_done = true; '(?:(?:p|\\u00b6|[\\|li1\\[\\]\\!\\u00a1/\\\\][\\*o\\u00b0\\"\\>7\\^]|[^a-z]pee+[^a-z])+)'
when 'q' then first_char_done = true; '(?:(?:q|9|(?:0|\\(\\)|\\[\\])_|\\(_\\,\\)|\\<\\||[^a-z][ck]ue*|qu?eue*[^a-z])+)'
when 'r' then first_char_done = true; '(?:(?:r|[/1\\|li]?[2\\^\\?z]|\\u00ae|[^a-z]ar+[^a-z])+)'
when 's','z' then first_char_done = true; '(?:(?:s|\\$|5|\\u00a7|[^a-z]es+[^a-z]|z|2|7_|\\~/_|\\>_|\\%|[^a-z]zee+[^a-z])+)'
when 't' then first_char_done = true; '(?:(?:t|7|\\+|\\u2020|\\-\\|\\-|\\\'\\]\\[\\\')+)'
when 'u','v' then first_char_done = true; '(?:(?:u|v|\\u00b5|[\\|\\(\\)\\[\\]\\{\\}]_[\\|\\(\\)\\[\\]\\{\\}]|\\L\\||\\/|[^a-z]you[^a-z]|[^a-z]yoo+[^a-z]|[^a-z]vee+[^a-z]))'
when 'w' then first_char_done = true; '(?:(?:w|vv|\\\\/\\\\/|\\\\\\|/|\\\\\\\\\\\'|\\\'//|\\\\\\^/|\\(n\\)|[^a-z]do?u+b+l+e*[^a-z]?(?:u+|you|yoo+)[^a-z])+)'
when 'x' then first_char_done = true; '(?:(?:x|\\>\\<|\\%|\\*|\\}\\{|\\)\\(|[^a-z]e[ck]+s+[^a-z]|[^a-z]ex+[^a-z])+)'
when 'y' then first_char_done = true; '(?:(?:y|\\u00a5|j|\\\'/|[^a-z]wh?(?:y+|ie+)[^a-z])+)'
when 'a' then '(?:(?:a|@|4|\\^|/\\\\|/\\-\\\\|aye?)+)'
when 'b' then '(?:(?:b|i3|l3|13|\\|3|/3|\\\\3|3|8|6|\\u00df|p\\>|\\|\\:|[^a-z]bee+[^a-z])+)'
when 'c','k' then '(?:(?:c|\\u00a9|\\u00a2|\\(|\\[|[^a-z]cee+[^a-z]|[^a-z]see+[^a-z]|k|x|[\\|\\[\\]\\)\\(li1\\!\\u00a1][\\<\\{\\(]|[^a-z][ck]ay+[^a-z])+)'
when 'd' then '(?:(?:d|\\)|\\|\\)|\\[\\)|\\?|\\|\\>|\\|o|[^a-z]dee+[^a-z])+)'
when 'e' then '(?:(?:e|3|\\&|\\u20ac|\\u00eb|\\[\\-)+)'
when 'f' then '(?:(?:f|ph|\\u0192|[\\|\\}\\{\\\\/\\(\\)\\[\\]1il\\!][\\=\\#]|[^a-z]ef+[^a-z])+)'
when 'g' then '(?:(?:g|6|9|\\&|c\\-|\\(_\\+|[^a-z]gee+[^a-z])+)'
when 'h' then '(?:(?:h|\\#|[\\|\\}\\{\\\\/\\(\\)\\[\\]]\\-?[\\|\\}\\{\\\\/\\(\\)\\[\\]])+)'
when 'i','l' then '(?:(?:i|l|1|\\!|\\u00a1|\\||\\]|\\[|\\\\|/|[^a-z]eye[^a-z]|\\u00a3|[\\|li1\\!\\u00a1\\[\\]\\(\\)\\{\\}]_|\\u00ac|[^a-z]el+[^a-z]))'
when 'j' then '(?:(?:j|\\]|\\u00bf|_\\||_/|\\</|\\(/|[^a-z]jay+[^a-z])+)'
when 'm' then '(?:(?:m|[\\|\\(\\)/](?:\\\\/|v|\\|)[\\|\\(\\)\\\\]|\\^\\^|[^a-z]em+[^a-z])+)'
when 'n' then '(?:(?:n|[\\|/\\[\\]\\<\\>]\\\\[\\|/\\[\\]\\<\\>]|/v|\\^/|[^a-z]en+[^a-z])+)'
when 'o' then '(?:(?:o|0|\\(\\)|\\[\\]|\\u00b0|[^a-z]oh+[^a-z])+)'
when 'p' then '(?:(?:p|\\u00b6|[\\|li1\\[\\]\\!\\u00a1/\\\\][\\*o\\u00b0\\"\\>7\\^]|[^a-z]pee+[^a-z])+)'
when 'q' then '(?:(?:q|9|(?:0|\\(\\)|\\[\\])_|\\(_\\,\\)|\\<\\||[^a-z][ck]ue*|qu?eue*[^a-z])+)'
when 'r' then '(?:(?:r|[/1\\|li]?[2\\^\\?z]|\\u00ae|[^a-z]ar+[^a-z])+)'
when 's','z' then '(?:(?:s|\\$|5|\\u00a7|[^a-z]es+[^a-z]|z|2|7_|\\~/_|\\>_|\\%|[^a-z]zee+[^a-z])+)'
when 't' then '(?:(?:t|7|\\+|\\u2020|\\-\\|\\-|\\\'\\]\\[\\\')+)'
when 'u','v' then '(?:(?:u|v|\\u00b5|[\\|\\(\\)\\[\\]\\{\\}]_[\\|\\(\\)\\[\\]\\{\\}]|\\L\\||\\/|[^a-z]you[^a-z]|[^a-z]yoo+[^a-z]|[^a-z]vee+[^a-z]))'
when 'w' then '(?:(?:w|vv|\\\\/\\\\/|\\\\\\|/|\\\\\\\\\\\'|\\\'//|\\\\\\^/|\\(n\\)|[^a-z]do?u+b+l+e*[^a-z]?(?:u+|you|yoo+)[^a-z])+)'
when 'x' then '(?:(?:x|\\>\\<|\\%|\\*|\\}\\{|\\)\\(|[^a-z]e[ck]+s+[^a-z]|[^a-z]ex+[^a-z])+)'
when 'y' then '(?:(?:y|\\u00a5|j|\\\'/|[^a-z]wh?(?:y+|ie+)[^a-z])+)'
else char
end
elsif char.downcase == 'w' then
Expand Down
24 changes: 12 additions & 12 deletions test/lib/language_filter/methods_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@

it "must be successfully created with correct defaults" do
filter = LanguageFilter::Filter.new
filter.must_be_kind_of LanguageFilter::Filter
_(filter).must_be_kind_of LanguageFilter::Filter
valid_non_empty_list? filter.matchlist
filter.exceptionlist.must_be_kind_of Array
filter.exceptionlist.must_be_empty
_(filter.exceptionlist).must_be_kind_of Array
_(filter.exceptionlist).must_be_empty
filter.exceptionlist.each {|list_item| list_item.must_be_kind_of String}
filter.creative_letters.must_be :==, false
_(filter.creative_letters).must_be :==, false
valid_non_empty_list? filter.creative_matchlist
end

Expand All @@ -18,14 +18,14 @@
# pre-packaged lists
[:hate,:profanity,:sex,:violence].each do |list|
filter = LanguageFilter::Filter.new matchlist: list
filter.must_be_kind_of LanguageFilter::Filter
_(filter).must_be_kind_of LanguageFilter::Filter
valid_non_empty_list? filter.matchlist
end
# array of strings
list = ['blah\\w*','test']
filter = LanguageFilter::Filter.new matchlist: list
valid_non_empty_list? filter.matchlist
filter.matchlist.must_be :==, list
_(filter.matchlist).must_be :==, list
# filepath
list = File.dirname(__FILE__) + '/../../../config/matchlists/profanity.txt'
filter = LanguageFilter::Filter.new matchlist: list
Expand All @@ -35,13 +35,13 @@
# pre-packaged lists
[:hate,:profanity,:sex,:violence].each do |list|
filter = LanguageFilter::Filter.new exceptionlist: list
filter.must_be_kind_of LanguageFilter::Filter
_(filter).must_be_kind_of LanguageFilter::Filter
valid_non_empty_list? filter.exceptionlist
end
# array of strings
list = ['blah\\w*','test']
filter = LanguageFilter::Filter.new exceptionlist: list
filter.exceptionlist.must_be_kind_of Array
_(filter.exceptionlist).must_be_kind_of Array
valid_non_empty_list? filter.exceptionlist
# filepath
list = File.dirname(__FILE__) + '/../../../config/matchlists/profanity.txt'
Expand All @@ -51,11 +51,11 @@
# CREATIVE_LETTERS
[true,false].each do |creative_boolean|
filter = LanguageFilter::Filter.new creative_letters: creative_boolean
filter.creative_letters.must_be :==, creative_boolean
_(filter.creative_letters).must_be :==, creative_boolean
valid_non_empty_list? filter.creative_matchlist
filter.creative_matchlist.must_be :!=, filter.matchlist
filter.creative_matchlist.size.must_be :==, filter.matchlist.size
filter.creative_matchlist.join("").size.must_be :>, filter.matchlist.join("").size
_(filter.creative_matchlist).must_be :!=, filter.matchlist
_(filter.creative_matchlist.size).must_be :==, filter.matchlist.size
_(filter.creative_matchlist.join("").size).must_be :>, filter.matchlist.join("").size
end
end

Expand Down
2 changes: 1 addition & 1 deletion test/lib/language_filter/version_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
describe LanguageFilter do

it "must be defined" do
LanguageFilter::VERSION.wont_be_nil
_(LanguageFilter::VERSION).wont_be_nil
end

end
14 changes: 7 additions & 7 deletions test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
require File.expand_path('../../lib/language_filter.rb', __FILE__)

def valid_non_empty_list?(list)
list.must_be_kind_of Array
list.wont_be_empty
list.each {|list_item| list_item.must_be_kind_of String}
_(list).must_be_kind_of Array
_(list).wont_be_empty
list.each {|list_item| _(list_item).must_be_kind_of String}
end

def test_against_word_lists
Expand Down Expand Up @@ -68,7 +68,7 @@ def test_against_word_lists
},
{
name: :sex,
results: ["sex","sexual","sexes","Sex","Sexual","cock","cocks","Cock","Dick","DICK","ass","Ass","penis","prick","pricks","manhood","breast","breasts","cleavage","muff","Homo","homo","slut","whore","gay","Gay","dyke","Dyke","dykes","fagots","fagged","faggots","puberty"]
results: ["sex","sexual","sexes","Sex","Sexual","cock","cocks","Cock","Dick","DICK","ass","Ass","penis","prick","pricks","manhood","breast","breasts","cleavage","muff","Homo","homo","slut","whore","gay","Gay","dyke","Dyke","dykes","fagots","fagged","faggots","cum","Cum","puberty"]
},
{
name: :violence,
Expand All @@ -86,7 +86,7 @@ def test_against_word_lists
},
{
name: :sex,
results: ["sex","sexual","sexes","Sex","Sexual","cock","cocks","Cock","Dick","DICK","ass","Ass","penis","prick","pricks","manhood","breast","breasts","cleavage","muff","Kunti","kunt","Homo","homo","slut","whore","gay","Gay","dyke","Dyke","dykes","fagots","fagged","faggots","puberty"]
results: ["sex","sexual","sexes","Sex","Sexual","cock","cocks","Cock","Dick","DICK","ass","Ass","penis","prick","pricks","manhood","breast","breasts","cleavage","muff","Kunti","kunt","Homo","homo","slut","whore","gay","Gay","dyke","Dyke","dykes","fagots","fagged","faggots","cum","Cum","puberty"]
},
{
name: :violence,
Expand All @@ -99,12 +99,12 @@ def test_against_word_lists
word_lists.each do |wordlist|
wordlist[:expected][:normal].each do |matchlist|
filter = LanguageFilter::Filter.new(matchlist: matchlist[:name], creative_letters: false)
filter.matched(wordlist[:contents]).must_be :==, matchlist[:results],
_(filter.matched(wordlist[:contents])).must_be :==, matchlist[:results],
"expected\n#{filter.matched(wordlist[:contents])}\nto be\n#{matchlist[:results]}\nwhile testing normal #{matchlist[:name]} against #{wordlist[:name]}"
end
wordlist[:expected][:creative].each do |matchlist|
filter = LanguageFilter::Filter.new(matchlist: matchlist[:name], creative_letters: true)
filter.matched(wordlist[:contents]).must_be :==, matchlist[:results],
_(filter.matched(wordlist[:contents])).must_be :==, matchlist[:results],
"expected\n#{filter.matched(wordlist[:contents])}\nto be\n#{matchlist[:results]}\nwhile testing creative #{matchlist[:name]} against #{wordlist[:name]}"
end
end
Expand Down