Bookmarklet to get the HTML5 innerHTML of the document node.
javascript:(function()%20%7B%0D%0Avar%20textReserved%20%3D%20%2F(%3C)%7C(%3E)%7C(%26)%7C(%5Cu00A0)%2Fg%3B%0D%0Afunction%20escapeTextNodeValue(data)%20%7B%0D%0A%20%20%20%20return%20data.replace(textReserved%2C%20function(m%2C%20a%2C%20b%2C%20c)%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20(a)%20return%20%22%26lt%3B%22%3B%0D%0A%20%20%20%20%20%20%20%20if%20(b)%20return%20%22%26gt%3B%22%0D%0A%20%20%20%20%20%20%20%20if%20(c)%20return%20%22%26amp%3B%22%3B%0D%0A%20%20%20%20%20%20%20%20return%20%22%26nbsp%3B%22%0D%0A%20%20%20%20%7D)%3B%0D%0A%7D%0D%0Avar%20attrReserved%20%3D%20%2F(%26)%7C(%22)%7C(%5Cu00A0)%2Fg%3B%0D%0Afunction%20escapeAttrNodeValue(value)%20%7B%0D%0A%20%20%20%20return%20value.replace(attrReserved%2C%20function(m%2C%20a%2C%20b)%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20(a)%20return%20%22%26amp%3B%22%3B%0D%0A%20%20%20%20%20%20%20%20if%20(b)%20return%20%22%26quot%3B%22%3B%0D%0A%20%20%20%20%20%20%20%20return%20%22%26nbsp%3B%22%3B%0D%0A%20%20%20%20%7D)%3B%0D%0A%7D%0D%0Afunction%20isVoidElement(tag)%20%7B%0D%0A%20%20%20%20%20return%20tag%20%3D%3D%3D%20%22area%22%20%7C%7C%20tag%20%3D%3D%3D%20%22base%22%20%7C%7C%20tag%20%3D%3D%3D%20%22basefont%22%20%7C%7C%20tag%20%3D%3D%3D%20%22bgsound%22%20%7C%7C%20tag%20%3D%3D%3D%20%22br%22%20%7C%7C%20tag%20%3D%3D%3D%20%22col%22%20%7C%7C%20tag%20%3D%3D%3D%20%22command%22%20%7C%7C%20tag%20%3D%3D%3D%20%22embed%22%20%7C%7C%20tag%20%3D%3D%3D%20%22event-source%22%20%7C%7C%20tag%20%3D%3D%3D%20%22frame%22%20%7C%7C%20tag%20%3D%3D%3D%20%22hr%22%20%7C%7C%20tag%20%3D%3D%3D%20%22img%22%20%7C%7C%20tag%20%3D%3D%3D%20%22input%22%20%7C%7C%20tag%20%3D%3D%3D%20%22link%22%20%7C%7C%20tag%20%3D%3D%3D%20%22meta%22%20%7C%7C%20tag%20%3D%3D%3D%20%22param%22%20%7C%7C%20tag%20%3D%3D%3D%20%22spacer%22%20%7C%7C%20tag%20%3D%3D%3D%20%22source%22%20%7C%7C%20tag%20%3D%3D%3D%20%22wbr%22%3B%20%20%20%20%20%0D%0A%7D%0D%0Afunction%20needsNewlinePrefix(tag)%20%7B%0D%0A%20%20%20%20return%20tag%20%3D%3D%3D%20%22listing%22%20%7C%7C%20tag%20%3D%3D%3D%20%22pre%22%20%7C%7C%20tag%20%3D%3D%3D%20%22textarea%22%3B%0D%0A%7D%0D%0A%0D%0Afunction%20isCDATA(tag)%20%7B%0D%0A%20%20%20%20return%20tag%20%3D%3D%3D%20%22iframe%22%20%7C%7C%20tag%20%3D%3D%3D%20%22noembed%22%20%7C%7C%20tag%20%3D%3D%3D%20%22noframes%22%20%7C%7C%20tag%20%3D%3D%3D%20%22noscript%22%20%7C%7C%20tag%20%3D%3D%3D%20%22plaintext%22%20%7C%7C%20tag%20%3D%3D%3D%20%22script%22%20%7C%7C%20tag%20%3D%3D%3D%20%22style%22%20%7C%7C%20tag%20%3D%3D%3D%20%22xmp%22%3B%0D%0A%7D%0D%0A%0D%0Afunction%20getAttrHTML(attr)%20%7B%0D%0A%20%20%20%20var%20markup%20%3D%20attr.name.toLowerCase()%3B%0D%0A%20%20%20%20markup%20%2B%3D%20'%3D%22'%3B%0D%0A%20%20%20%20markup%20%2B%3D%20escapeAttrNodeValue(attr.value)%3B%0D%0A%20%20%20%20markup%20%2B%3D%20'%22'%3B%0D%0A%20%20%20%20return%20markup%3B%0D%0A%7D%0D%0Afunction%20getInnerHTML(node)%20%7B%0D%0A%20%20%20%20var%20markup%20%3D%20%22%22%3B%0D%0A%20%20%20%20if%20(node.hasChildNodes())%20%7B%0D%0A%20%20%20%20%20%20%20%20var%20current%20%3D%20node.firstChild%3B%0D%0A%20%20%20%20%20%20%20%20var%20cdata%20%3D%20null%3B%0D%0A%20%20%20%20%20%20%20%20for%20(%20%3B%20%3B%20)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20switch%20(current.nodeType)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%201%3A%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20tag%20%3D%20current.tagName.toLowerCase()%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(cdata%20%3D%3D%20null%20%26%26%20isCDATA(tag))%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cdata%20%3D%20current%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20%2B%3D%20%22%3C%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20%2B%3D%20tag%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20attrs%20%3D%20current.attributes%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(var%20i%20%3D%200%3B%20i%20%3C%20attrs.length%3B%20%2B%2Bi)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20%2B%3D%20%22%20%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20%2B%3D%20getAttrHTML(attrs%5Bi%5D)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20%2B%3D%20%22%3E%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(needsNewlinePrefix(tag))%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20%2B%3D%20%22%5Cn%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%203%3A%20case%204%3A%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20%2B%3D%20cdata%20!%3D%20null%20%3F%20current.data%20%3A%20escapeTextNodeValue(current.data)%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%207%3A%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20%2B%3D%20%22%3C%3F%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20%2B%3D%20current.target%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20%2B%3D%20current.data%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20%2B%3D%20%22%3F%3E%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%208%3A%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20%2B%3D%20%22%3C!--%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20%2B%3D%20current.data%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20%2B%3D%20%22--%3E%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%2010%3A%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20%2B%3D%20%22%3C!DOCTYPE%20%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20%2B%3D%20current.name.toLowerCase()%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20%2B%3D%20%22%3E%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20default%3A%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20throw%20%22INVALID_STATE_ERR%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(current.firstChild)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20current%20%3D%20current.firstChild%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(%20%3B%20%3B%20)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(current.nodeType%20%3D%3D%3D%201)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20tag%20%3D%20current.tagName.toLowerCase()%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(!isVoidElement(tag))%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20%2B%3D%20%22%3C%2F%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20%2B%3D%20tag%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20markup%20%2B%3D%20%22%3E%22%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(current%20%3D%3D%20cdata)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cdata%20%3D%20null%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(current%20%3D%3D%20node)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20markup%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(current.nextSibling)%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20current%20%3D%20current.nextSibling%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20current%20%3D%20current.parentNode%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20return%20markup%3B%0D%0A%7D%0D%0Avar%20uri%20%3D%20%22data%3Atext%2Fplain%3Bcharset%3Dutf-8%2C%22%20%2B%20encodeURIComponent(getInnerHTML(document))%3B%0D%0Awindow.open(uri)%3B%0D%0A%7D)()%3B
Source:
(function() {
var textReserved = /(<)|(>)|(&)|(\u00A0)/g;
function escapeTextNodeValue(data) {
return data.replace(textReserved, function(m, a, b, c) {
if (a) return "<";
if (b) return ">"
if (c) return "&";
return " "
});
}
var attrReserved = /(&)|(")|(\u00A0)/g;
function escapeAttrNodeValue(value) {
return value.replace(attrReserved, function(m, a, b) {
if (a) return "&";
if (b) return """;
return " ";
});
}
function isVoidElement(tag) {
return tag === "area" || tag === "base" || tag === "basefont" || tag === "bgsound" || tag === "br" || tag === "col" || tag === "command" || tag === "embed" || tag === "event-source" || tag === "frame" || tag === "hr" || tag === "img" || tag === "input" || tag === "link" || tag === "meta" || tag === "param" || tag === "spacer" || tag === "source" || tag === "wbr";
}
function needsNewlinePrefix(tag) {
return tag === "listing" || tag === "pre" || tag === "textarea";
}
function isCDATA(tag) {
return tag === "iframe" || tag === "noembed" || tag === "noframes" || tag === "noscript" || tag === "plaintext" || tag === "script" || tag === "style" || tag === "xmp";
}
function getAttrHTML(attr) {
var markup = attr.name.toLowerCase();
markup += '="';
markup += escapeAttrNodeValue(attr.value);
markup += '"';
return markup;
}
function getInnerHTML(node) {
var markup = "";
if (node.hasChildNodes()) {
var current = node.firstChild;
var cdata = null;
for ( ; ; ) {
switch (current.nodeType) {
case 1:
var tag = current.tagName.toLowerCase();
if (cdata == null && isCDATA(tag)) {
cdata = current;
}
markup += "<";
markup += tag;
var attrs = current.attributes;
for (var i = 0; i < attrs.length; ++i) {
markup += " ";
markup += getAttrHTML(attrs[i]);
}
markup += ">";
if (needsNewlinePrefix(tag)) {
markup += "\n";
}
break;
case 3: case 4:
markup += cdata != null ? current.data : escapeTextNodeValue(current.data);
break;
case 7:
markup += "";
markup += current.target;
markup += current.data;
markup += "?>";
break;
case 8:
markup += "";
break;
case 10:
markup += "";
break;
default:
throw "INVALID_STATE_ERR";
}
if (current.firstChild) {
current = current.firstChild;
} else {
for ( ; ; ) {
if (current.nodeType === 1) {
var tag = current.tagName.toLowerCase();
if (!isVoidElement(tag)) {
markup += "";
markup += tag;
markup += ">";
}
if (current == cdata) {
cdata = null;
}
}
if (current == node) {
return markup;
} else if (current.nextSibling) {
current = current.nextSibling;
break;
} else {
current = current.parentNode;
}
}
}
}
}
return markup;
}
var uri = "data:text/plain;charset=utf-8," + encodeURIComponent(getInnerHTML(document));
window.open(uri);
})();