фикс
This commit is contained in:
parent
340fe8993c
commit
630a415aff
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Экспортируем экземпляр фильтра для использования в приложении
|
// Экспортируем экземпляр фильтра для использования в приложении
|
||||||
|
Loading…
x
Reference in New Issue
Block a user