Here is a piece of Javascript that traverses the DOM tree of a document and applies rot13 to all text nodes.
(function() { var skipTag = {'SCRIPT': 1, 'STYLE': 1} function applyTextNode(node, f) { if (node.nodeType == node.ELEMENT_NODE && node.tagName in skipTag) return; if (node.nodeType == node.TEXT_NODE) return f(node); for (var curr = node.firstChild; curr; curr = curr.nextSibling) applyTextNode(curr, f); } function rot13(c) { var i = c.charCodeAt(0); if (i >= 65 && i <= 90) { i = ((i - 65) + 13) % 26 + 65; } else if (i >= 97 && i <= 122) { i = ((i - 97) + 13) % 26 + 97; } return String.fromCharCode(i); } applyTextNode(document.documentElement, function (node) { node.data = node.data.replace(/[A-Za-z]/g, rot13); }); })();And here is the "UglifyJS" version.
(function(){function b(c,d){if(!(c.nodeType==c.ELEMENT_NODE&&c.tagName in a)){if(c.nodeType==c.TEXT_NODE)return d(c);for(var e=c.firstChild;e;e=e.nextSibling)b(e,d)}}function c(a){var b=a.charCodeAt(0);return b>=65&&90>=b?b=(b-65+13)%26+65:b>=97&&122>=b&&(b=(b-97+13)%26+97),String.fromCharCode(b)}var a={SCRIPT:1,STYLE:1};b(document.documentElement,function(a){a.data=a.data.replace(/[A-Za-z]/g,c)})})();
And finally, to make it a bookmarklet, we need to encodeURI() and prepend the javascript: scheme, which gives:
javascript:(function()%7Bfunction%20b(c,d)%7Bif(!(c.nodeType==c.ELEMENT_NODE&&c.tagName%20in%20a))%7Bif(c.nodeType==c.TEXT_NODE)return%20d(c);for(var%20e=c.firstChild;e;e=e.nextSibling)b(e,d)%7D%7Dfunction%20c(a)%7Bvar%20b=a.charCodeAt(0);return%20b%3E=65&&90%3E=b?b=(b-65+13)%2526+65:b%3E=97&&122%3E=b&&(b=(b-97+13)%2526+97),String.fromCharCode(b)%7Dvar%20a=%7BSCRIPT:1,STYLE:1%7D;b(document.documentElement,function(a)%7Ba.data=a.data.replace(/%5BA-Za-z%5D/g,c)%7D)%7D)();
Enjoy!
No comments:
Post a Comment