This commit is contained in:
Professional 2025-05-25 22:47:56 +07:00
parent 340fe8993c
commit 630a415aff

View File

@ -1,5 +1,4 @@
// Утилита для фильтрации нежелательного контента // Утилита для фильтрации нежелательного контента
const Filter = require('bad-words');
const fs = require('fs'); const fs = require('fs');
const path = require('path'); const path = require('path');
@ -40,28 +39,22 @@ function loadBadWordsFromFile(filePath) {
class ProfanityFilter { class ProfanityFilter {
constructor() { constructor() {
// Создаем экземпляр фильтра с английскими словами по умолчанию
this.filter = new Filter({ placeHolder: '*' });
// Загружаем слова из файлов // Загружаем слова из файлов
const russianFileWords = loadBadWordsFromFile(path.join(__dirname, 'words.txt')); const russianFileWords = loadBadWordsFromFile(path.join(__dirname, 'words.txt'));
const englishFileWords = loadBadWordsFromFile(path.join(__dirname, 'en.txt')); const englishFileWords = loadBadWordsFromFile(path.join(__dirname, 'en.txt'));
// Объединяем все источники запрещенных слов // Объединяем все источники запрещенных слов
const allBadWords = [ this.badWords = [
...russianBadWords, ...russianBadWords,
...datingAppBadWords, ...datingAppBadWords,
...russianFileWords, ...russianFileWords,
...englishFileWords ...englishFileWords
]; ];
// Добавляем все слова в фильтр
this.filter.addWords(...allBadWords);
// Создаем регулярные выражения для проверки производных слов // Создаем регулярные выражения для проверки производных слов
this.generateWordPatterns(allBadWords); this.generateWordPatterns(this.badWords);
console.log(`Всего загружено ${allBadWords.length} запрещенных слов`); console.log(`Всего загружено ${this.badWords.length} запрещенных слов`);
} }
/** /**
@ -106,10 +99,12 @@ class ProfanityFilter {
const normalizedText = text.toLowerCase() const normalizedText = text.toLowerCase()
.replace(/[\s\._\-]+/g, ''); // Удаляем пробелы, точки, подчеркивания, дефисы .replace(/[\s\._\-]+/g, ''); // Удаляем пробелы, точки, подчеркивания, дефисы
// Проверяем сначала стандартным методом библиотеки bad-words // Проверяем на простое вхождение запрещенных слов
if (this.filter.isProfane(normalizedText) || this.filter.isProfane(text.toLowerCase())) { for (const word of this.badWords) {
if (normalizedText.includes(word.toLowerCase())) {
return true; return true;
} }
}
// Дополнительная проверка на производные слова через регулярные выражения // Дополнительная проверка на производные слова через регулярные выражения
return this.wordPatterns.some(pattern => pattern.test(text.toLowerCase())); return this.wordPatterns.some(pattern => pattern.test(text.toLowerCase()));
@ -138,8 +133,13 @@ class ProfanityFilter {
clean(text) { clean(text) {
if (!text) return ''; if (!text) return '';
// Сначала используем стандартный метод библиотеки let cleanedText = text;
let cleanedText = this.filter.clean(text);
// Проверяем и заменяем на звездочки каждое запрещенное слово
this.badWords.forEach(word => {
const regex = new RegExp(`\\b${word}\\b`, 'gi');
cleanedText = cleanedText.replace(regex, match => '*'.repeat(match.length));
});
// Затем проверяем на производные слова и заменяем их // Затем проверяем на производные слова и заменяем их
this.wordPatterns.forEach(pattern => { this.wordPatterns.forEach(pattern => {
@ -154,17 +154,25 @@ class ProfanityFilter {
* @param {string|Array<string>} words - Слово или массив слов для добавления * @param {string|Array<string>} words - Слово или массив слов для добавления
*/ */
addWords(words) { addWords(words) {
// Добавляем слова в стандартный фильтр // Добавляем слова в список запрещенных слов
this.filter.addWords(words);
// Если слова переданы как массив
if (Array.isArray(words)) { if (Array.isArray(words)) {
this.badWords.push(...words);
this.generateWordPatterns(words); this.generateWordPatterns(words);
} else { } else {
// Если передано одно слово // Если передано одно слово
this.badWords.push(words);
this.generateWordPatterns([words]); this.generateWordPatterns([words]);
} }
} }
/**
* Проверяет является ли слово запрещенным
* @param {string} word - Слово для проверки
* @return {boolean} - true, если слово запрещено, иначе false
*/
isProfane(word) {
return this.hasProfanity(word);
}
} }
// Экспортируем экземпляр фильтра для использования в приложении // Экспортируем экземпляр фильтра для использования в приложении