Replace Text with Property Values
This is a strange idea I had for a web developer tool.
I've written a script that will replace every piece of text on a page with the value of any css property you select.
Try it out
For example, if you pick the property font-family
then it will replace every heading, every paragraph, ever word, with the name of the font that is used in that part of the page.
A blockquote will be selected with the values of that CSS property within the blockquote
An a piece of marked text will be replaced with the values of the selected property as well.
You will be able to see the different font-weight of bold text and the different font-style of emphasized text.
You | can | look | at | the |
---|---|---|---|---|
different | borders | in | tables | or |
explore | padding | and | margins | too |
I'd like to wrap this technique into a bookmarklet
(aka favelet
) but not tonight.
There are two key pieces of code:
- A tree walker (created with
document.createTreeWalker
) for visiting every element of the page, looking particularly for text - The use of
getComputedStyle
to find the array of styles that have been applied to each piece of text. (Technically: to the parent of each piece of text)
Here's the central function:
function replaceAllTextWithStylePropertyValue(propertyName) {
var walker = document.createTreeWalker(
document.body, // root node
NodeFilter.SHOW_TEXT, // filtering only text nodes
null,
false
);
while (walker.nextNode()) {
if (walker.currentNode.nodeValue.trim()) { // if it's not empty(whitespaced) node
// Don't alter a node if it has an ancestor with a class of 'protected'
if (walker.currentNode.parentNode.closest('.protected') == null) {
let length = walker.currentNode.nodeValue.length;
let newText = getComputedStyle(walker.currentNode.parentNode)[propertyName] + " ";
let newLength = newText.length;
walker.currentNode.parentNode.setAttribute("title", `${propertyName}: ${newText.trim()}`);
walker.currentNode.nodeValue = newText.repeat(Math.ceil(length / newLength)).substring(0, length);
}
}
}
}
That's enough strangeness for one evening.