package me.moodcat.profanity; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; /** * Tool to create regex patterns to also match leet profanity. */ public class LeetPatterns { final static String LIST_DIRECTORY = "./src/main/resources/profanity/"; public static void main(String[] args) throws IOException { LeetPatterns patterns = new LeetPatterns(); patterns.createLeetPatternList("nl"); patterns.createLeetPatternList("en"); patterns.mergeFiles("patterns.txt", "nl-patterns.txt", "en-patterns.txt"); } public void createLeetPatternList(String language) throws IOException { String path = LIST_DIRECTORY + language + ".txt"; String[] words = new String(Files.readAllBytes(Paths.get(path))).split("\n"); List<String> leetWords = new ArrayList<>(); for (String word : words) { leetWords.add(leetReplace(word)); } writeList(leetWords, language + "-patterns.txt"); } private void writeList(List<String> words, String fileName) throws IOException { if (words.isEmpty()) return; String path = LIST_DIRECTORY + fileName; StringBuilder builder = new StringBuilder(); for (String word : words) { builder.append(word); builder.append('\n'); } builder.deleteCharAt(builder.length() - 1); Files.write(Paths.get(path), builder.toString().getBytes()); } private String leetReplace(String word) { String leetWord = word.toLowerCase(); leetWord = leetWord.replaceAll("o", "[o0]"); leetWord = leetWord.replaceAll("a", "[a@4]"); leetWord = leetWord.replaceAll("i", "[i1|]"); leetWord = leetWord.replaceAll("t", "[t7]"); leetWord = leetWord.replaceAll("e", "[e3]"); leetWord = leetWord.replaceAll("g", "[g9]"); leetWord = leetWord.replaceAll("s", "[s5]"); return leetWord; } public void mergeFiles(String outFile, String... files) throws IOException { StringBuilder builder = new StringBuilder(); for (String file : files) { String path = LIST_DIRECTORY + file; builder.append(new String(Files.readAllBytes(Paths.get(path)))); builder.append('\n'); } builder.deleteCharAt(builder.length() - 1); Files.write(Paths.get(LIST_DIRECTORY + outFile), builder.toString().getBytes()); } }