Skip to content

Instantly share code, notes, and snippets.

@think49
Created January 16, 2011 03:22
Show Gist options
  • Save think49/781520 to your computer and use it in GitHub Desktop.
Save think49/781520 to your computer and use it in GitHub Desktop.
Twitter-outputHTML-bookmarklet.js
/**
* Twitter-outputHTML-bookmarklet.js
*
* @version 1.2
* @author think49
*/
if (!('outerHTML' in document.createElement('p')) && 'innerHTML' in document.createElement('p') && (typeof HTMLElement === 'function' || typeof HTMLElement === 'object')) {
(function () {
var _Node = (typeof Node === 'function' || typeof Node === 'object') ? Node : {
ELEMENT_NODE: 1,
ATTRIBUTE_NODE: 2,
TEXT_NODE: 3,
CDATA_SECTION_NODE: 4,
ENTITY_REFERENCE_NODE: 5,
ENTITY_NODE: 6,
PROCESSING_INSTRUCTION_NODE: 7,
COMMENT_NODE: 8,
DOCUMENT_NODE: 9,
DOCUMENT_TYPE_NODE: 10,
DOCUMENT_FRAGMENT_NODE: 11,
NOTATION_NODE: 12
};
function getOuterHTML () {
var node;
node = this.ownerDocument.createElement('body');
node.appendChild(this.cloneNode(true));
return node.innerHTML;
}
function setOuterHTML (htmlString) {
var doc, parentNode, node, df;
parentNode = this.parentNode;
if (!parentNode) { // HTML5 3.5.6 (step2)
return;
}
if (parentNode.nodeType === _Node.DOCUMENT_NODE) { // HTML5 3.5.6 (step3)
throw new Error('NO_MODIFICATION_ALLOWED_ERR');
}
doc = this.ownerDocument;
node = doc.createElement('body');
node.innerHTML = htmlString;
node = node.firstChild;
df = doc.createDocumentFragment();
while (node) {
df.appendChild(node);
node = node.nextSibling;
}
parentNode.replaceChild(df, this);
}
if ('defineProperty' in Object) { // ECMAScript 5
Object.defineProperty(this, 'outerHTML', {get: getOuterHTML, set: setOuterHTML});
return;
}
if ('__defineGetter__' in this && '__defineSetter__' in this) { // for Firefox
this.__defineGetter__('outerHTML', getOuterHTML);
this.__defineSetter__('outerHTML', setOuterHTML);
}
}).call(HTMLElement.prototype);
}
(function (forEach) {
var _Node, doc, itemElements, resultElement, resultElements, newlineElement, indentElement, divElement, spanElement, anchorElement, brElement, p, textarea, htmlString;
_Node = (typeof Node === 'function' || typeof Node === 'object') ? Node : {
ELEMENT_NODE: 1,
ATTRIBUTE_NODE: 2,
TEXT_NODE: 3,
CDATA_SECTION_NODE: 4,
ENTITY_REFERENCE_NODE: 5,
ENTITY_NODE: 6,
PROCESSING_INSTRUCTION_NODE: 7,
COMMENT_NODE: 8,
DOCUMENT_NODE: 9,
DOCUMENT_TYPE_NODE: 10,
DOCUMENT_FRAGMENT_NODE: 11,
NOTATION_NODE: 12
};
doc = document;
newlineElement = doc.createTextNode('\r\n');
indentElement = doc.createTextNode(' ');
divElement = doc.createElement('div');
spanElement = doc.createElement('span');
anchorElement = doc.createElement('a');
brElement = doc.createElement('br');
resultElement = divElement.cloneNode(false);
resultElement.className = 'stream-tweets';
resultElement.appendChild(newlineElement.cloneNode(false));
resultElements = [];
itemElements = doc.querySelectorAll('.stream-item');
forEach.call(itemElements, function (element) {
var itemElement, div, span, a, orgNode, df;
itemElement = divElement.cloneNode(false);
itemElement.className = 'stream-tweet';
div = itemElement.appendChild(divElement.cloneNode(false));
div.className = 'tweet-image';
div.appendChild(element.querySelector('.tweet-image>img').cloneNode(false));
div = itemElement.appendChild(divElement.cloneNode(false));
div.className = 'tweet-content';
div = div.appendChild(divElement.cloneNode(false));
div.className = 'tweet-header';
span = div.appendChild(spanElement.cloneNode(false));
span.className = 'tweet-user-name';
a = span.appendChild(anchorElement.cloneNode(false));
a.className = 'user-profile-link';
orgNode = element.querySelector('.tweet-user-name>a');
a.href = orgNode.href;
a.title = orgNode.title;
a.appendChild(orgNode.firstChild.cloneNode(false));
div.appendChild(indentElement.cloneNode(false));
span = div.appendChild(spanElement.cloneNode(false));
span.className = 'tweet-full-name';
span.appendChild(element.querySelector('.tweet-user-name>.tweet-full-name').firstChild.cloneNode(false));
orgNode = element.querySelector('.tweet-text').cloneNode(true);
orgNode.className = 'tweet-body';
forEach.call(orgNode.childNodes, function (node) {
var lines, df, i, l;
if (node.nodeType !== _Node.TEXT_NODE) {
return;
}
lines = node.nodeValue.split(/\r\n|[\r\n]/);
if (lines.length < 2) {
return;
}
df = doc.createDocumentFragment();
df.appendChild(doc.createTextNode(lines.shift()));
for (i = 0, l = lines.length; i < l; i++) {
df.appendChild(brElement.cloneNode(false));
df.appendChild(doc.createTextNode(lines[i]));
}
node.parentNode.replaceChild(df, node);
});
forEach.call(orgNode.getElementsByTagName('a'), function (a) {
a.href = a.href;
});
div = div.parentNode;
div.appendChild(orgNode);
div = div.appendChild(divElement.cloneNode(false));
div.className = 'tweet-footer';
a = div.appendChild(anchorElement.cloneNode(false));
orgNode = element.querySelector('.tweet-timestamp');
a.href = orgNode.href;
a.title = orgNode.title;
a.appendChild(doc.createTextNode(orgNode.title));
a.className = 'tweet-timestamp';
orgNode = element.querySelector('._timestamp');
if (orgNode) {
a.className += ' time' + orgNode.getAttribute('data-time');
// a.setAttribute('data-time', orgNode.getAttribute('data-time'));
}
df = doc.createDocumentFragment();
df.appendChild(indentElement.cloneNode(false));
df.appendChild(itemElement);
df.appendChild(newlineElement.cloneNode(false));
resultElements.push(df);
});
resultElements.reverse();
forEach.call(resultElements, function (element) {
resultElement.appendChild(element);
});
htmlString = resultElement.outerHTML;
textarea = doc.getElementById('Stream-items-HTML');
if (textarea) {
textarea.value = htmlString;
} else {
textarea = doc.createElement('textarea');
textarea.id = 'Stream-items-HTML';
textarea.cols = 40;
textarea.style.display = 'block';
textarea.style.margin = '2em auto';
textarea.style.width = '80%';
textarea.style.height = '10em';
textarea.value = htmlString;
p = doc.createElement('p');
p.appendChild(textarea);
resultElement = doc.querySelector('.stream-tabs');
if (resultElement) {
resultElement.parentNode.insertBefore(p, resultElement);
} else {
resultElement = doc.getElementById('page-container');
resultElement.parentNode.insertBefore(p, resultElement);
}
}
})(Array.prototype.forEach ||
function (callbackfn /*, thisArg*/) {
var thisArg, O, k, len;
if ('function' !== typeof callbackfn) {
throw new TypeError(callbackfn + ' is not a function');
}
O = Object(this); // ToObject(this)
len = Number(O.length); // ToUint32(lenValue)
thisArg = arguments[1];
if (arguments.length < 2) { // for "strict mode"
thisArg = this;
}
for (k = 0, len = O.length; k < len; k++) {
if (k in O) {
callbackfn.call(thisArg, O[k], k, O);
}
}
});
@think49
Copy link
Author

think49 commented Jan 16, 2011

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment