var readabilityVersion = "0.3";
(function(){
var objOverlay = document.createElement("div");
var objinnerDiv = document.createElement("div");
objOverlay.id = "readOverlay";
objinnerDiv.id = "readInner";
// Apply user-selected styling:
document.body.className = readStyle;
objOverlay.className = readStyle;
objinnerDiv.className = readMargin + " " + readSize;
objinnerDiv.appendChild(grabArticle()); // Get the article and place it inside the inner Div
objOverlay.appendChild(objinnerDiv); // Insert the inner div into the overlay
// For totally hosed HTML, add body node that can't be found because of bad HTML or something.
if(document.body == null)
{
body = document.createElement("body");
document.body = body;
}
document.body.innerHTML = "";
// Inserts the new content :
document.body.insertBefore(objOverlay, document.body.firstChild);
})()
function grabArticle() {
var allParagraphs = document.getElementsByTagName("p");
var topDivCount = 0;
var topDiv = null;
var topDivParas;
var articleContent = document.createElement("DIV");
var articleTitle = document.createElement("H1");
var articleFooter = document.createElement("DIV");
// Replace all doubled-up
tags with
tags, and remove fonts.
var pattern = new RegExp ("
[ \r\n\s]*
", "g");
document.body.innerHTML = document.body.innerHTML.replace(pattern, "
").replace(/<\/?font[^>]*>/g, ''); // Grab the title from the
's, commas, special classes, etc. for (var j=0; j < allParagraphs.length; j++) { parentNode = allParagraphs[j].parentNode; // Initialize readability data if(typeof parentNode.readability == 'undefined') { parentNode.readability = {"contentScore": 0}; // Look for a special classname if(parentNode.className.match(/(comment|meta|footer|footnote)/)) parentNode.readability.contentScore -= 50; else if(parentNode.className.match(/((^|\\s)(post|hentry|entry[-]?(content|text|body)?|article[-]?(content|text|body)?)(\\s|$))/)) parentNode.readability.contentScore += 25; // Look for a special ID if(parentNode.id.match(/(comment|meta|footer|footnote)/)) parentNode.readability.contentScore -= 50; else if(parentNode.id.match(/^(post|hentry|entry[-]?(content|text|body)?|article[-]?(content|text|body)?)$/)) parentNode.readability.contentScore += 25; } // Add a point for the paragraph found if(getInnerText(allParagraphs[j]).length > 10) parentNode.readability.contentScore++; // Add points for any commas within this paragraph parentNode.readability.contentScore += getCharCount(allParagraphs[j]); } // Assignment from index for performance. See http://www.peachpit.com/articles/article.aspx?p=31567&seqNum=5 for(nodeIndex = 0; (node = document.getElementsByTagName('*')[nodeIndex]); nodeIndex++) if(typeof node.readability != 'undefined' && (topDiv == null || node.readability.contentScore > topDiv.readability.contentScore)) topDiv = node; if(topDiv == null) { topDiv = document.createElement('div'); topDiv.innerHTML = 'Sorry, readability was unable to parse this page for content. If you feel like it should have been able to, please let us know by submitting an issue.'; } // REMOVES ALL STYLESHEETS ... for (var k=0;k < document.styleSheets.length; k++) { if (document.styleSheets[k].href != null && document.styleSheets[k].href.lastIndexOf("readability") == -1) { document.styleSheets[k].disabled = true; } } // Remove all style tags in head (not doing this on IE) : var styleTags = document.getElementsByTagName("style"); for (var j=0;j < styleTags.length; j++) if (navigator.appName != "Microsoft Internet Explorer") styleTags[j].textContent = ""; cleanStyles(topDiv); // Removes all style attributes topDiv = killDivs(topDiv); // Goes in and removes DIV's that have more non
stuff than
stuff
topDiv = killBreaks(topDiv); // Removes any consecutive
's into just one
// Cleans out junk from the topDiv just in case:
topDiv = clean(topDiv, "form");
topDiv = clean(topDiv, "object");
topDiv = clean(topDiv, "table", 250);
topDiv = clean(topDiv, "h1");
topDiv = clean(topDiv, "h2");
topDiv = clean(topDiv, "iframe");
// Add the footer and contents:
articleFooter.id = "readFooter";
articleFooter.innerHTML = "\
\