Skip to content

Instantly share code, notes, and snippets.

@kirisakow
Last active September 10, 2023 22:16
Show Gist options
  • Save kirisakow/82957128a78d1cd67432b0971621914d to your computer and use it in GitHub Desktop.
Save kirisakow/82957128a78d1cd67432b0971621914d to your computer and use it in GitHub Desktop.
Declutter a webpage by telling which elements you want to leave visible — a JavaScript user script for Firefox's Greasemonkey, Chrome's Tampermonkey or Opera's Violetmonkey. The script uses a prompt to ask the user for a CSS selector for those of the DOM elements the user wants to leave visible.
// ==UserScript==
// @name onlyShowThese.user.js
// @description Declutter a webpage by telling which elements you want to leave visible — a JavaScript user script for Firefox's Greasemonkey, Chrome's Tampermonkey or Opera's Violetmonkey. The script uses a prompt to ask the user for a CSS selector for those of the DOM elements the user wants to leave visible.
// @version 1
// @grant none
// ==/UserScript==
var selector = prompt(
`Type in a CSS selector query (documentation: https://w3c.github.io/csswg-drafts/selectors/) for the elements you want visible.
For example, to show only p elements, but not p of class ad, type in "p, p *, -p.ad".
`,
"p, p *, -p.ad"
);
if (!selector) {
return;
}
function onlyShowThese(selector) {
let selectorForElementsToShow = "";
let selectorForElementsToHide = "";
selector.split(",").forEach((token) => {
// Trim trailing spaces
token = token.trim();
// Check if the token starts with a hyphen
if (token.startsWith("-")) {
// Trim the hyphen and append the token to selectorForElementsToHide
token = token.substring(1);
if (token) {
// Append the token to selectorForElementsToHide
selectorForElementsToHide += `${token}, `;
}
} else {
if (token) {
// Append the token to selectorForElementsToHide
selectorForElementsToShow += `${token}, `;
}
}
});
// Remove the trailing comma from the selectorForElementsToShow and selectorForElementsToHide
if (
selectorForElementsToShow &&
selectorForElementsToShow.trim().endsWith(",")
) {
selectorForElementsToShow = selectorForElementsToShow.trim().slice(0, -1);
}
if (
selectorForElementsToHide &&
selectorForElementsToHide.trim().endsWith(",")
) {
selectorForElementsToHide = selectorForElementsToHide.trim().slice(0, -1);
}
// Select DOM elements
console.log("Selector for the elements to show:", selectorForElementsToShow);
if (selectorForElementsToShow) {
let domElementsToShow = Array.from(
document.querySelectorAll(selectorForElementsToShow)
).includeAncestorElements();
// Hide what we want to be hidden
document.querySelectorAll("*").forEach((elem) => {
if (!domElementsToShow.includes(elem)) {
elem.style.display = "none";
}
});
}
console.log("Selector for the elements to hide:", selectorForElementsToHide);
if (selectorForElementsToHide) {
let domElementsToHide = Array.from(
document.querySelectorAll(selectorForElementsToHide)
);
// Hide what we want to be hidden
document.querySelectorAll("*").forEach((elem) => {
if (domElementsToHide.includes(elem)) {
elem.style.display = "none";
}
});
}
}
if (!Array.prototype.includeAncestorElements) {
Array.prototype.includeAncestorElements = function () {
let ret = this;
this.forEach((elem) => {
let ancestor = elem.parentNode;
while (ancestor !== null && ancestor !== elem) {
if (!(ancestor in ret)) {
ret.push(ancestor);
}
ancestor = ancestor.parentNode;
}
});
return ret;
};
}
onlyShowThese(selector);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment