Created
April 28, 2011 00:07
-
-
Save j0shua/945522 to your computer and use it in GitHub Desktop.
readability js
This file contains hidden or 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
// | |
if(typeof(readability) === "undefined"){ | |
readability = {}; | |
} | |
(function (readability) { | |
readability.baseUrl = 'https://www.readability.com'; | |
readability.type = 'read'; | |
readability.frameId = 'readabilityIFrame-'+Math.random(); | |
readability.frameUrl = readability.baseUrl + '/articles/queue'; | |
readability.frameContainerId = 'readabilityFrameContainer-' + readability.type; | |
readability.frameContainer = null; | |
readability.docCompressed = null; | |
readability.extensionInfo = { | |
"type": (typeof window.readabilityExtensionType == "undefined" || window.readabilityExtensionType == "" ? 'bookmarklet' : window.readabilityExtensionType ), | |
"version": (typeof window.readabilityExtensionVersion == "undefined" || window.readabilityExtensionVersion == "" ? "1" : window.readabilityExtensionVersion ) | |
} | |
readability.frameContainerStyles = { | |
position: 'fixed', | |
display: 'block', | |
top: '0px', | |
left: '0px', | |
width: '100%', | |
height: '100%', | |
padding: '0', | |
margin: '0', | |
backgroundColor: "transparent", | |
zIndex: '2147483647' | |
}; | |
readability.frameStyles = ["width: 100%", "height: 100%", "display: block", "overflow: auto", // Proper iframe overflow in FF. Webkit uses the document body's CSS setting. | |
"margin: 0", "padding: 0", "border-width: 0"].join(';'); | |
/* A method so that if we change frameId we still get valid HTML */ | |
// Adds onload, which will allow us to hide the content behind the frame after we have the new content. | |
readability.getFrameHtml = function () { | |
return ['<iframe id="' + readability.frameId + '"', 'name="' + readability.frameId + '"', 'scrolling="auto"', 'frameborder="0"', 'style="' + readability.frameStyles + '"', 'onload="readability.frameLoaded(this)">', '</iframe>'].join(' '); | |
}; | |
readability.debug = function (s) { | |
if (typeof console !== "undefined") { | |
return console.log(s); | |
} | |
}; | |
readability.getExtensionDetails = function () { | |
if (typeof window.readabilityExtensionDetails !== null) { | |
return window.readabilityExtensionDetails; | |
} else { | |
return "bookmarklet"; | |
} | |
}; | |
readability.compress = function (doc_node) { | |
var i, il, html, preTags = doc_node.getElementsByTagName('pre'); | |
for (i = 0, il = preTags.length; i < il; i++) { | |
preTags[i].innerHTML = preTags[i].innerHTML.replace(/ /g, ' ').replace(/\t/g, ' ').replace(/\n/g, '--rdb-newline--'); | |
} | |
html = "<html>" + doc_node.innerHTML + "</html>"; | |
html = html.replace(/[\s\t\r\n]+/g, ' '); | |
html = html.replace(/<!--.*?-->/g, ''); | |
html = html.replace(/--rdb-newline--/g, "\n"); | |
return html; | |
}; | |
readability.hidePageElements = function () { | |
var child, i; | |
for (i = 0; i < document.body.childNodes.length; i++) { | |
child = document.body.childNodes[i]; | |
if (child.nodeType !== 1) { | |
continue; | |
} | |
display = child.currentStyle ? child.currentStyle.display : document.defaultView.getComputedStyle(child, null).getPropertyValue('display'); | |
if (child.id !== readability.frameContainerId) { | |
child.origDisplay = display; | |
child.style.display = 'none'; | |
} | |
} | |
}; | |
readability.removeDocumentScrolling = function () { | |
var child, display, i; | |
document.body.style.overflow = "hidden"; | |
}; | |
readability.addDocumentScrolling = function () { | |
var child, i; | |
for (i = 0; i < document.body.childNodes.length; i++) { | |
child = document.body.childNodes[i]; | |
if (child.nodeType !== 1) { | |
continue; | |
} | |
if (child.origDisplay) { | |
child.style.display = child.origDisplay; | |
} | |
} | |
document.body.style.overflow = "auto"; | |
}; | |
readability.isLocalPage = function () { | |
if (document.location.href.indexOf(readability.baseUrl) !== - 1) { | |
return true; | |
} | |
else { | |
return false; | |
} | |
}; | |
/* Cross-browser dispatchEvent - from http://www.cross-browser.com/forums/viewtopic.php?id=384 */ | |
readability.dispatchEvent = function (element, rawEvent) { | |
// Attempts to fire a raw DOM event on an element | |
// param name="element" type="Element" The element or its identifier to fire the event | |
// param name="rawEvent" type="Object" The raw DOM event object to fire | |
// returns type="Boolean" True if the event was successfully fired, otherwise false | |
try { | |
if (element.fireEvent) { | |
element.fireEvent("on" + rawEvent.type, rawEvent); | |
return true; | |
} | |
else if (element.dispatchEvent) { | |
element.dispatchEvent(rawEvent); | |
return true; | |
} | |
} catch (e) { | |
readability.debug('Error caught:'); | |
readability.debug(e); | |
} | |
return false; | |
}; | |
readability.checkDocLocation = function () { | |
if (document.location.href.indexOf(readability.baseUrl) !== - 1) { | |
if (document.getElementById('read-bar') !== null && document.getElementById('read-link') !== null) { | |
var clickEvent = document.createEvent('MouseEvent'); | |
clickEvent.initMouseEvent('click', true, true, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null); | |
readability.dispatchEvent(document.getElementById('read-link'), clickEvent); | |
return false; | |
} else { | |
document.location = readability.baseUrl; | |
return false; | |
} | |
} | |
}; | |
// Cross browser addEventListener from http://snipplr.com/view.php?codeview&id=3116 | |
readability.listen = function (evnt, elem, func) { | |
if (elem.addEventListener) { // W3C DOM | |
return elem.addEventListener(evnt, func, false); | |
} else if (elem.attachEvent) { // IE DOM | |
var r = elem.attachEvent("on" + evnt, func); | |
return r; | |
} else { | |
return false; | |
} | |
}; | |
// Receive cross-DOM js events | |
readability.receiveMessage = function (event) { | |
if (event.origin === readability.baseUrl && event.data) { | |
/** | |
* Special handling for set_token, otherwise just event handlers. | |
* TODO: Turn these all into json structures with a name rather than just strings. | |
**/ | |
if (event.data.indexOf('set_token') === 0) { | |
window.readabilityToken = event.data.replace('set_token=', ''); | |
readability.readabilityToken = window.readabilityToken; | |
} else { | |
try { | |
var event_method = event.data.replace('-', '_'); | |
if (typeof readability.event_handlers[event_method] !== "undefined") { | |
readability.event_handlers[event_method](event); | |
} | |
} catch (e) { | |
readability.debug('Error caught in receiveMessage:'); | |
readability.debug(e); | |
} | |
} | |
} | |
}; | |
// The handlers for cross-DOM events | |
readability.event_handlers = { | |
rdb_load_modal: function (event) { | |
var iframeContainer = readability.frameContainer, | |
styleKey, | |
iframeContainerStyles = {position: 'fixed', display: 'block', width: '100%', height: '100%', zIndex: '2147483647',background: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA9JREFUeNpiYmBgWAYQYAAAtQCpptGMZwAAAABJRU5ErkJggg==')"}; | |
for (styleKey in iframeContainerStyles) { | |
if (iframeContainerStyles.hasOwnProperty(styleKey)) { | |
iframeContainer.style[styleKey] = iframeContainerStyles[styleKey]; | |
} | |
} | |
}, | |
rdb_remove_frame: function (event) { | |
var frameContainer = readability.frameContainer; | |
if (frameContainer) { | |
frameContainer.parentNode.removeChild(frameContainer); | |
} | |
}, | |
rdb_load_bar: function (event) { | |
var messageBar = { | |
styles: { | |
position: 'fixed', | |
display: 'block', | |
top: '0px', | |
left: '0px', | |
width: '100%', | |
padding: '0', | |
margin: '0', | |
height: '43px', | |
background: 'black' | |
} | |
}; | |
readability.addStyle(readability.frameContainer, messageBar.styles); | |
}, | |
rdb_load_new_frame: function (event, obj) { | |
readability.closeFrame(); | |
readability.frameContainer = null; | |
readability.frameId = 'readabilityIFrame-' + Math.random(); | |
readability.init(true); // Force a reinit | |
}, | |
rdb_close: function (event) { | |
readability.closeFrame(); | |
}, | |
rdb_repost_form: function (event) { | |
readability.openFrame(); | |
} | |
}; | |
/** | |
* Removes script tags from the document. | |
* | |
* @param Element | |
**/ | |
readability.removeScripts = function (doc) { | |
var scripts = doc.getElementsByTagName('script'); | |
for(var i = scripts.length-1; i >= 0; i--) | |
{ | |
if(typeof(scripts[i].src) == "undefined" || (scripts[i].src.indexOf(readability.baseUrl) == -1 && scripts[i].src.indexOf('typekit') == -1)) | |
{ | |
scripts[i].nodeValue=""; | |
scripts[i].removeAttribute('src'); | |
if (scripts[i].parentNode) { | |
scripts[i].parentNode.removeChild(scripts[i]); | |
} | |
} | |
} | |
}; | |
readability.hideFlash = function () { | |
var i, il, embeds = document.getElementsByTagName('embed'), | |
objects = document.getElementsByTagName('object'), | |
iframes = document.getElementsByTagName('iframe'); | |
for (i = 0, il = embeds.length; i < il; i++) { | |
embeds[i].style.display = 'none'; | |
} | |
for (i = 0, il = objects.length; i < il; i++) { | |
objects[i].style.display = 'none'; | |
} | |
for (i = 0, il = iframes.length; i < il; i++) { | |
if (iframes[i].id !== readability.frameId) { | |
iframes[i].style.display = 'none'; | |
} | |
} | |
}; | |
readability.addStyle = function (elem, styles) { | |
var styleKey; | |
for (styleKey in styles) { | |
if (styles.hasOwnProperty(styleKey)) { | |
elem.style[styleKey] = styles[styleKey]; | |
} | |
} | |
}; | |
readability.getFrameContainer = function () { | |
if (readability.frameContainer === null) { | |
readability.frameContainer = document.createElement('div'); | |
readability.frameContainer.id = readability.frameContainerId; | |
readability.frameContainer.innerHTML = readability.getFrameHtml(); | |
readability.addStyle(readability.frameContainer, readability.frameContainerStyles); | |
} | |
return readability.frameContainer; | |
}; | |
readability.openFrame = function () { | |
var r = readability, | |
// shortcut | |
frameContent; | |
//Readability cannot parse framesets, so quit it. | |
if(document.body.nodeName == 'FRAMESET') { | |
alert("To read the content of a frame with Readability, right click on that content and select 'open this frame in new tab' and run Readability on the new tab."); | |
return; | |
} | |
readability.docCompressed = false; | |
if (readability.frameContainer === null) { | |
document.body.appendChild(r.getFrameContainer()); | |
} | |
r.listen("message", window, r.receiveMessage); | |
r.hideFlash(); | |
r.removeDocumentScrolling(); | |
try { | |
readability.docCompressed = readability.compress(document.documentElement); | |
} catch (e) {} | |
var load_text = (readability.type === 'read') ? '<div id="read-load">Converting...</div>' : '<div id="save-load">Saving...</div>'; | |
var charset = (document.characterSet ? document.characterSet : document.charset); | |
var hiddenInputs = { | |
"token": r.readabilityToken, | |
"extensionType": r.extensionInfo['type'], | |
"extensionVersion": r.extensionInfo['version'], | |
"legacyBookmarklet": (typeof window.readStyle !== "undefined" ? 1 : 0), | |
"read": (readability.type=='read' ? 1 : 0), | |
"archive": (readability.type=='support' ? 1 : 0), | |
"support": (readability.type=='support' ? 1 : 0), | |
"url": window.location.href, | |
"doc": readability.docCompressed, | |
"charset": charset | |
}; | |
/** | |
* Note: accept-charset is needed to be forced to the current character set because otherwise it appears Firefox will try to convert the data before the server gets a chance to work with it. | |
* By specifying the same character set no transforms are attempted on the client side, so we can handle it properly on the server side. | |
* Without accept-charset you will get bad characters on URLs like http://www.deseretnews.com/article/705369257/Parents-confused-upset-over-new-car-seat-guidelines.html | |
**/ | |
frameContent = [ | |
'<html>', | |
'<head>', | |
'<style type="text/css">', | |
'body { background-color: transparent; }', | |
'#wrapper { text-align: center; position:absolute;top:6em;left:50%;margin-left:-92.5px;}', | |
'#read-load, #save-load {text-align : center;color : #ffffff;padding-top: 10px; font:bold 1.2em Georgia; margin-left: 0.5em;}', | |
'#save-load.saved {padding-top: 4px;}', | |
'#spinner-box { background-color:#232323;height:107px;width:189px;margin:20px auto;padding:22px 0 0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;text-align: center;border-width:1px 0 0 1px;border-style:solid; border-color:#000;opacity: .85;-moz-opacity:.85;filter: alpha(opacity=85);}', | |
'</style>', | |
'</head>', | |
'<body>', | |
'<div id="wrapper">', | |
'<div id="spinner-box">', | |
'<img src="data:image/gif;base64,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" />', | |
load_text, | |
'</div>', | |
'<form id="readabilityPostForm" accept-charset="', charset, '" enctype="application/x-www-form-urlencoded" style="display: none;" method="post" action="', r.frameUrl, '"></form>', | |
'</div>', | |
'</body>', | |
'</html>' | |
].join(''); | |
// Todo fix bug that occurs here: http://www.reddit.com/r/blog/comments/ddc0w/update_on_the_colbert_rally_time_to_show_our/ | |
var leframe = document.getElementById(r.frameId); | |
var ledocument = null; | |
if( leframe.contentDocument ) { | |
ledocument = leframe.contentDocument; | |
} else if ( leframe.contentWindow ) { //IE | |
ledocument = leframe.contentWindow.document; | |
} | |
ledocument.write(frameContent); | |
var postForm = ledocument.getElementById('readabilityPostForm'); | |
for (var inputKey in hiddenInputs) { | |
if(hiddenInputs.hasOwnProperty(inputKey)) { | |
var newInput = ledocument.createElement('input'); | |
newInput.type = "hidden"; | |
newInput.name = inputKey; | |
newInput.id = inputKey; | |
newInput.value = hiddenInputs[inputKey]; | |
postForm.appendChild(newInput); | |
} | |
} | |
ledocument.write(['<scr', 'ipt type="text/javascript">window.setTimeout(function() { document.getElementById("readabilityPostForm").submit(); }, 1);</scr', 'ipt>'].join('')); | |
}; | |
readability.frameLoaded = function (frame) { | |
try { | |
// Just try to access a restricted part of the document. If we can access it, that means we're not on the loaded doc yet. | |
x = window[readability.frameId].document; | |
} catch (e) { | |
// If we got caught, that means we've loaded the frame. Hide the backgrund elements. | |
readability.hidePageElements(); | |
} | |
}; | |
readability.url_is_valid = (function(){ | |
var invalid_list = [ | |
/file:/, | |
/about:blank/ | |
]; | |
return function(given_url){ | |
var url = given_url ? given_url.toLowerCase() : document.location.href.toLowerCase(), | |
i; | |
for(i = 0; i < invalid_list.length; i++){ | |
if(url.search(invalid_list[i]) !== -1){ | |
return false; | |
} | |
} | |
return true; | |
} | |
}()); | |
readability.site_in_blacklist = function (){ | |
var site_blacklist = 'www.youtube.com;mail.google.com'.toLowerCase().split(';'), | |
netloc, | |
i, | |
il; | |
try { | |
netloc = window.location.href.match(/^https?:\/\/([^\/]*)/)[1]; | |
} catch (e) { | |
return false; // Was a file:// URL or other non-http URL - gets caught by url_is_valid. | |
} | |
for (i = 0, il = site_blacklist.length; i < il; i++) { | |
if (site_blacklist[i] === netloc) { | |
return true; | |
} | |
} | |
return false; | |
}; | |
readability.closeFrame = function() { | |
var frameContainer = readability.frameContainer; | |
if (frameContainer) { | |
frameContainer.style.display = 'none'; | |
} | |
readability.addDocumentScrolling(); | |
}; | |
readability.init = function(force) { | |
if (!force && document.getElementById(readability.frameContainerId) !== null) { | |
readability.frameContainer = document.getElementById(readability.frameContainerId); | |
readability.frameContainer.style.display = 'block'; | |
readability.removeDocumentScrolling(); | |
return false; | |
} | |
/* If we're already on a parsed page */ | |
if (readability.isLocalPage() && document.getElementById('rdb-article') !== null ) { | |
return; | |
} | |
readability.removeScripts(document); | |
// If we are on our own page, bounce it to the homepage | |
if (readability.checkDocLocation()) { | |
readability.listen("message", window, readability.receiveMessage); | |
readability.openFrame(); | |
} | |
readability.readabilityToken = window.readabilityToken; | |
readability.openFrame(); | |
}; | |
} (readability)); | |
// First, check to see if we should even run Readability on this page | |
if( | |
readability.url_is_valid() && | |
!readability.isLocalPage() && // Make sure we aren't trying to run readability on itself | |
!readability.site_in_blacklist() // Don't run readability on blacklisted sites | |
){ | |
if(navigator.userAgent.indexOf('MSIE') !=-1) { | |
var queryParams = 'url=' + encodeURIComponent(window.top.location) + '&token=' + (typeof(window.readabilityToken) !== "undefined" ? encodeURIComponent(window.readabilityToken) : ""); | |
if(readability.type == "read") { | |
window.top.location = readability.baseUrl + '/pr?' + queryParams; | |
} else { | |
document.scrollTop = 0; | |
var wrap = document.createElement('div'); | |
wrap.innerHTML = '<iframe src="https://www.readability.com/prl?' + queryParams + '" width="500" height="200" frameBorder="0" allowTransparency="true" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 281823498"></iframe>'; | |
document.body.appendChild(wrap); | |
readability.listen("message", window, function() { | |
if (event.origin === readability.baseUrl && event.data) { | |
if (event.data.indexOf('set_token') === 0) { | |
window.readabilityToken = event.data.replace('set_token=', ''); | |
readability.readabilityToken = window.readabilityToken; | |
} else if (event.data == "close_frame"){ | |
wrap.parentNode.removeChild(wrap); | |
} | |
} | |
}); | |
} | |
} else { | |
readability.init(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment