Last active
September 10, 2023 22:16
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==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