Skip to content

Instantly share code, notes, and snippets.

@sanex3339
Last active August 18, 2017 20:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sanex3339/7c0bc3ff14ae57d0b8d9 to your computer and use it in GitHub Desktop.
Save sanex3339/7c0bc3ff14ae57d0b8d9 to your computer and use it in GitHub Desktop.
/**
* Находит на странице слова из словаря, если кол-во слов больше лимита - сайт порнографической/эротической тематики.
*
* @param dictionary
* @param debug
* @constructor
*/
function PornoDetector (dictionary, debug) {
this.dictionary = dictionary;
this.filteredDictionary = [];
this.allowedPornoPhrasesLimit = 3;
this.foundedPornoPhrases = [];
this.debug = debug !== undefined ? debug : true;
}
/**
* Инициализирует поиск запрещенных фраз
*/
PornoDetector.prototype.run = function () {
var pageTextContent = this.getPageTextContent(
document.body
);
this.foundedPornoPhrases = this.getPornoPhrases(pageTextContent);
if (this.foundedPornoPhrases.length > this.allowedPornoPhrasesLimit) {
this.processSuccessPornoDetectionResult(this.foundedPornoPhrases);
}
};
/**
* Если в textContent текущей ноды есть запрещенное слово:
* Получает массив с текстовым содержимым текущей текстовой ноды (TEXT_NODE) или рекурсивно запускается повторно
* на дочерней ноде текущей ноды, если текущая нода содержит всебе какие либо элементы (ELEMENT_NODE)
*
* @param parentElement
* @returns {Array}
*/
PornoDetector.prototype.getPageTextContent = function (parentElement) {
var textContent = [],
parentNodes = parentElement.childNodes,
nodeTextContent = parentElement.textContent.toLowerCase(),
skipFlag = true;
for (var word = 0, dictionaryLength = this.dictionary.length; word < dictionaryLength; word++) {
if (
nodeTextContent.indexOf(this.dictionary[word]) === -1
) {
continue;
}
this.filteredDictionary.push(this.dictionary[word]);
skipFlag = false;
break;
}
if (skipFlag) {
return textContent;
}
for (var node = 0, nodeLength = parentNodes.length; node < nodeLength; node++) {
var nodeValue = parentNodes[node].nodeValue,
nodeType = parentNodes[node].nodeType;
if (
nodeType === 3 &&
nodeValue.trim() !== ''
) {
textContent.push(nodeValue.toLowerCase());
} else if (nodeType === 1) {
textContent = textContent.concat(this.getPageTextContent(parentNodes[node]));
}
}
return textContent;
};
/**
* @param textContent
* @returns {Array}
*/
PornoDetector.prototype.prepareTextContent = function (textContent) {
return textContent.map(function (value) {
var regexp = /[^a-zа-яё\-\s]/g;
return value.replace(regexp, '').trim();
}).filter(function (value) {
if (value.length < 3) {
return false;
}
return value;
});
};
/**
* Находит фразы, содержащие в себе запрещенные слова из словаря и возвращает массив из элементов, где каждый элемент -
* запрещенная фраза на странице сайта из словаря + по одному слову предшествующиму и последующиму запрещенному слову.
*
* @param data
* @returns {Array}
*/
PornoDetector.prototype.findPornoPhrases = function (data) {
var result = [],
regexp = new RegExp('(?:(?:[a-zа-яё]* +)?([a-zа-яёЁ]*(' + this.filteredDictionary.join('|') + ')[a-zа-яёЁ]*)(?: *[a-zа-яё]*))', 'ig');
for (var i = 0, len = data.length; i < len; i++) {
var match = data[i].match(regexp);
if (!match) {
continue;
}
result.push(match[0]);
}
return result;
};
/**
* Получает массив строк, обрабатывает его (удаление всех небуквенных символов),
* находит фразы с запрещенными словами, устраняет дубликаты, возвращает массив с результатом
*
* @returns {*}
* @param textContent
*/
PornoDetector.prototype.getPornoPhrases = function (textContent) {
var result;
result = this.uniquePornoPhrases(
this.findPornoPhrases(
this.prepareTextContent(textContent)
).sort()
);
return result;
};
/**
* Обработка фраз, содержащих в себе запрещеные слова
*
* @param data
*/
PornoDetector.prototype.processSuccessPornoDetectionResult = function (data) {
if (this.debug) {
console.log(data);
}
};
/**
* @param data
* @returns {Array}
*/
PornoDetector.prototype.uniquePornoPhrases = function (data) {
var u = {},
result = [],
continueFlag;
for (var i = 0, l = data.length; i < l; ++i) {
if (u.hasOwnProperty(data[i])) {
continue;
}
continueFlag = false;
for (var k = 0; k < l; k++) {
if (data[i] === data[k]) {
continue;
}
if (data[k].indexOf(data[i]) !== -1) {
continueFlag = true;
break;
}
continueFlag = false;
}
if (continueFlag) {
continue;
}
result.push(data[i]);
u[data[i]] = 1;
}
return result;
};
var iterations = 1,
debug = true,
start = new Date();
if (iterations > 1) {
debug = false;
}
for (var i = 0; i < iterations; i++) {
var pornDetector = new PornoDetector([
'x-art',
'hot girl',
'hot chicks',
'porno',
'blowjob',
'мастурб',
'сиськ',
'brazzers',
'bdsm',
'титьк',
'ctrfc',
'ctrc',
'эроти',
'porn',
'sex',
'секас',
'секс',
'гомосекс',
'erotik',
'порн',
'dojki',
'xvideo',
'gangbang',
'eboni',
'малолет',
'насилов',
'инцест',
'зоофил',
'оргазм',
'дойки',
'xhamster'
], debug);
pornDetector.run();
}
console.log((new Date() - start) / iterations);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment