// ==UserScript==
// @name Twitter - Remove elements
// @namespace http://tampermonkey.net/
// @version 0.4
// @description Remove elements on Twitter.com
// @author You
// @match https://twitter.com/*
// @grant none
// @license MIT
// @downloadURL https://update.greasyfork.icu/scripts/482888/Twitter%20-%20Remove%20elements.user.js
// @updateURL https://update.greasyfork.icu/scripts/482888/Twitter%20-%20Remove%20elements.meta.js
// ==/UserScript==
(function () {
'use strict';
let keywords = [];
function updateKeywords(text) {
keywords = text.split(',').map(word => word.trim()).filter(word => word !== '');
}
function containsKeyword(element) {
const text = element.textContent.toLowerCase();
return keywords.some(keyword => text.includes(keyword));
}
function removeElement(element) {
if (element && element.parentNode) {
element.parentNode.removeChild(element);
}
}
const icon = document.createElement('div');
icon.id = 'filterIcon';
icon.innerHTML = '
🔍
';
document.body.appendChild(icon);
const windowDiv = document.createElement('div');
windowDiv.style.position = 'fixed';
windowDiv.style.left = '600px';
windowDiv.style.top = '50%';
windowDiv.style.transform = 'translate(0, -50%)';
windowDiv.style.padding = '30px';
windowDiv.style.height = '600px';
windowDiv.style.backgroundColor = '#fff';
windowDiv.style.boxShadow = '0 0 10px rgba(0, 0, 0, 0.5)';
windowDiv.style.zIndex = '9998';
windowDiv.style.display = 'none';
const description = document.createElement('div');
description.textContent = 'Block keywors:';
description.style.marginBottom = '10px';
const inputField = document.createElement('textarea');
inputField.style.height = 'calc(100% - 40px)';
inputField.style.width = '100%';
inputField.style.resize = 'none';
inputField.style.fontSize = '18px';
inputField.placeholder = 'Enter text.';
const saveButton = document.createElement('button');
saveButton.textContent = 'SAVE';
saveButton.style.cursor = 'pointer';
windowDiv.appendChild(description);
windowDiv.appendChild(inputField);
windowDiv.appendChild(saveButton);
document.body.appendChild(windowDiv);
icon.addEventListener('click', function () {
windowDiv.style.display = windowDiv.style.display === 'none' ? 'block' : 'none';
});
saveButton.addEventListener('click', function () {
const enteredText = inputField.value;
localStorage.setItem('savedText', enteredText);
windowDiv.style.display = 'none';
updateKeywords(enteredText);
location.reload();
});
const savedText = localStorage.getItem('savedText');
if (savedText) {
inputField.value = savedText;
updateKeywords(savedText);
}
let removedElementsCount = 0;
const infoDiv = document.createElement('div');
infoDiv.style.position = 'fixed';
infoDiv.style.top = '0px';
infoDiv.style.left = '1150px';
infoDiv.style.backgroundColor = '#CCC';
infoDiv.style.padding = '10px';
infoDiv.style.zIndex = '9999';
document.body.appendChild(infoDiv);
// Function to handle changes in the DOM
function handleDOMChanges(mutationsList, observer) {
const elementsToCheck = ['article'];
elementsToCheck.forEach(elementType => {
const elements = document.querySelectorAll(elementType);
elements.forEach(element => {
if (containsKeyword(element)) {
removeElement(element);
removedElementsCount++;
}
});
});
infoDiv.textContent = `Remove ${removedElementsCount} elements`;
infoDiv.style.display = 'block';
// Hide the information after 5 seconds
setTimeout(() => {
infoDiv.style.display = 'none';
}, 5000);
}
// Use a MutationObserver to detect changes in the DOM
const observer = new MutationObserver(handleDOMChanges);
const observerConfig = { childList: true, subtree: true };
observer.observe(document.body, observerConfig);
})();