Created
February 3, 2019 01:40
-
-
Save vsubhash/2ea968e69de1c602c29b18e7c01cfe5a to your computer and use it in GitHub Desktop.
"eBook Reader" mode for desktop Internet browsers using Greasemonkey JavaScript
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
// ==UserScript== | |
// @name BookReaderView | |
// @namespace com.vsubhash.js.BookReaderView | |
// @version 1 | |
// @grant none | |
// ==/UserScript== | |
if (subhash_browser_js == null) { | |
var subhash_browser_js = {}; | |
} | |
subhash_browser_js.book_reader_js = { | |
sHtml: "", | |
bTitleFound: false, | |
arYucks: [ "-ads", "_ads", "advert", "adcode", "adselect", "addthis", "alsoread", "comment", | |
"discuss", "email", "facebook", "float", "follow", "franchise", "googlead", | |
"hide_", "hidden", "hover", "jump", "lazy", "linkedin", "navig", "notifi", | |
"outbrain", "partner", "popular", "popup", "print", "reddit", "share", "sharing", | |
"short-url", "social", "sponsor", "sprite", "subscribe", "taboola", "trend", | |
"twitter", "url-short", "zipr" ], | |
createHeader: function() { | |
subhash_browser_js.book_reader_js.sHtml = "<head>\n" + | |
" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n" + | |
" <title>" + document.title + "</title>\n" + | |
" <style>\n" + | |
" a { border-bottom: 1px dotted navy; }\n" + | |
" body { background-color: rgb(200,200,220); color: black; font-family: sans-serif;\n" + | |
" font-size: 0.5cm; margin: 1em auto; padding: 1em; max-width: 9in; }\n" + | |
" code { font-family: monospace; }\n" + | |
" h1 { text-align: center; border-bottom: 1px solid black; padding-bottom: 0.2em; }\n" + | |
" a h1, a h2, a h3, a h4, a h5, a h6, h1 a, h2 a, h3 a, h4 a, h5 a, h6 a\n" + | |
" { color: black; border-bottom: 1px dotted black; }\n" + | |
" pre, figure { margin: 1em auto; padding: 1em; }\n" + | |
" img { display: block; margin: 1em auto; max-height: 40%; max-width: 40%; }\n" + | |
" img[src*='.svg'] { display: none!important; }\n" + | |
" figcaption { font-weight: bold; font-size: 0.8em; text-align: center; }\n" + | |
" header, footer, aside, nav { display: none; }\n" + | |
" </style>\n" + | |
"</head>\n" + | |
"<body>\n"; | |
}, | |
removeUnwantedTags: function() { | |
var arrTagsToHide = [ "aside", "footer", "iframe", "nav", "noscript", "script"]; | |
for (var i = 0; i < arrTagsToHide.length; i++) { | |
var arElementsToHide = document.getElementsByTagName(arrTagsToHide[i]); | |
var j = arElementsToHide.length; | |
while (j > 0) { | |
arElementsToHide[j-1].parentNode.removeChild(arElementsToHide[j-1]); | |
--j; | |
} | |
} | |
}, | |
addNoYuckiesStyle: function() { | |
var sStyle = "\n<style>"; | |
for (var i = 0; i < subhash_browser_js.book_reader_js.arYucks.length; i++) { | |
sStyle += "*[class*=\"" + subhash_browser_js.book_reader_js.arYucks[i] + "\"], *[id*=\"" + subhash_browser_js.book_reader_js.arYucks[i] + "\"] "; | |
if (i < (subhash_browser_js.book_reader_js.arYucks.length-1)) { | |
sStyle += ","; | |
} | |
} | |
sStyle += " { display: none!important; }\n</style>\n"; | |
document.getElementsByTagName("body")[0].innerHTML += sStyle; | |
//console.error(sStyle); | |
}, | |
parseFiniteElement: function(aoEl) { | |
//console.error("Finite tag: " + aoEl.tagName); | |
subhash_browser_js.book_reader_js.isTitleTag(aoEl.tagName.toLowerCase()); | |
if (!subhash_browser_js.book_reader_js.bTitleFound || | |
!subhash_browser_js.book_reader_js.hasNoYuckiness(aoEl)) { return; } | |
var sElTag = aoEl.tagName.toLowerCase(); | |
if (!subhash_browser_js.book_reader_js.isUsefulTag(sElTag)) { return; } | |
//console.error(sElTag + " outed"); | |
if (sElTag == "a" && aoEl.href) { | |
if (aoEl.href.indexOf("#") == 0) { | |
subhash_browser_js.book_reader_js.sHtml += aoEl.textContent; | |
} else { | |
subhash_browser_js.book_reader_js.sHtml += "<a href=\"" + aoEl.getAttribute("href") + "\">" + aoEl.textContent + "</a>"; | |
} | |
} else if (sElTag == "abbr") { | |
subhash_browser_js.book_reader_js.sHtml += aoEl.textContent + | |
" (" + aoEl.getAttribute("title") + ") " + "\n"; | |
} else if ((sElTag == "b") || (sElTag == "em") || (sElTag == "strong")) { | |
subhash_browser_js.book_reader_js.sHtml += "<b>" + aoEl.textContent + "</b>"; | |
} else if (sElTag == "br") { | |
subhash_browser_js.book_reader_js.sHtml += "<br />"; | |
} else if ((sElTag == "cite") || (sElTag == "i") || (sElTag == "time")) { | |
subhash_browser_js.book_reader_js.sHtml += "<i>" + aoEl.textContent + "</i>"; | |
} else if ((sElTag == "ins") || (sElTag == "kbd") || (sElTag == "mark") || (sElTag == "u")) { | |
subhash_browser_js.book_reader_js.sHtml += "<u>" + aoEl.textContent + "</u>"; | |
} else if (sElTag == "img") { | |
subhash_browser_js.book_reader_js.sHtml += "<img src=\"" + | |
aoEl.getAttribute("src") + "\" />"; | |
} else if ((sElTag == "cite") || (sElTag == "s") || (sElTag == "strike")) { | |
subhash_browser_js.book_reader_js.sHtml += "<s>" + aoEl.textContent + "</s>"; | |
} else if ((sElTag == "code") || (sElTag == "samp") || (sElTag == "var")) { | |
subhash_browser_js.book_reader_js.sHtml += "<code>" + aoEl.textContent + "</code>"; | |
} else if ((sElTag == "sub")) { | |
subhash_browser_js.book_reader_js.sHtml += "<sub>" + aoEl.textContent + "</sub>"; | |
} else if (sElTag == "sup") { | |
subhash_browser_js.book_reader_js.sHtml += "<sup>" + aoEl.textContent + "</sup>"; | |
} else if ((sElTag == "label") || (sElTag == "span") || (sElTag == "wbr")) { | |
subhash_browser_js.book_reader_js.sHtml += aoEl.textContent; // ignore | |
} else if ((sElTag == "h1") || (sElTag == "h2") || (sElTag == "h3") || | |
(sElTag == "h4") || (sElTag == "h5") || (sElTag == "h6") || | |
(sElTag == "figcaption") || (sElTag == "p")) { | |
subhash_browser_js.book_reader_js.sHtml += "<" + sElTag + ">" + | |
aoEl.textContent + "</" + sElTag + ">"; | |
} | |
}, | |
isUsefulTag: function(asTag) { | |
var arTags = [ "a", "b", "i", "s", "u", "abbr", "article", "br", "code", | |
"cite", "em", "figure", "figcaption", "h1", "h2", "h3", "h4", "h5", | |
"h6", "img", "ins", "kbd", "label", "li", "main", "mark", "navig", "ol", | |
"p", "pre", "samp", "strike", "sub", "sup", "span", | |
"strong", "time", "ul", "var", "wbr" ]; | |
for (var i = 0; i < arTags.length; i++) { | |
if (asTag == arTags[i]) { | |
//console.error(asTag + " is valid"); | |
return(true); | |
} | |
} | |
//console.error(asTag + " is not valid"); | |
return(false); | |
}, | |
isTitleTag: function(asTag) { | |
if ((!subhash_browser_js.book_reader_js.bTitleFound) && | |
((asTag == "h1") || (asTag == "h2") || (asTag == "h3"))) { | |
subhash_browser_js.book_reader_js.bTitleFound = true; | |
//console.error("found"); | |
} | |
return(subhash_browser_js.book_reader_js.bTitleFound); | |
}, | |
hasNoYuckiness: function(aoNode) { | |
if (aoNode.className) { | |
if (aoNode.className.indexOf) { | |
for (var i = 0; i < subhash_browser_js.book_reader_js.arYucks.length; i++) { | |
if (aoNode.className.toLowerCase().indexOf(subhash_browser_js.book_reader_js.arYucks[i]) > -1) { | |
//console.error("Yucky " + aoNode.className); | |
return(false); | |
} else { | |
//console.error("Yucky no find " + subhash_browser_js.book_reader_js.arYucks[i]); | |
} | |
} | |
} | |
} | |
if (aoNode.getAttribute) { | |
if (aoNode.getAttribute("id")) { | |
if (aoNode.getAttribute("id").indexOf) { | |
for (var i = 0; i < subhash_browser_js.book_reader_js.arYucks.length; i++) { | |
if (aoNode.getAttribute("id").toLowerCase().indexOf(subhash_browser_js.book_reader_js.arYucks[i]) > -1) { | |
//console.error("Yucky " + aoNode.getAttribute("id")); | |
return(false); | |
} | |
} | |
} | |
} | |
} | |
return(true); | |
}, | |
parseNode: function(aoNode) { | |
var sTag = aoNode.nodeName.toLowerCase(); | |
//console.error("Node checking " + sTag); | |
subhash_browser_js.book_reader_js.isTitleTag(aoNode.nodeName.toLowerCase()); | |
if (subhash_browser_js.book_reader_js.bTitleFound && | |
subhash_browser_js.book_reader_js.isUsefulTag(sTag) && | |
subhash_browser_js.book_reader_js.hasNoYuckiness(aoNode)) { | |
if (sTag == "a" && (aoNode.href)) { | |
subhash_browser_js.book_reader_js.sHtml += "<" + sTag + | |
" href=\"" + aoNode.href + "\">"; | |
} else { | |
subhash_browser_js.book_reader_js.sHtml += "<" + sTag + ">"; | |
} | |
} | |
for (var i = 0; i < aoNode.childNodes.length; i++) { | |
var oNode = aoNode.childNodes[i]; | |
subhash_browser_js.book_reader_js.isTitleTag(oNode.nodeName.toLowerCase()); | |
if (oNode.nodeType == Node.ELEMENT_NODE) { | |
subhash_browser_js.book_reader_js.parseElement(oNode); | |
} else if (oNode.nodeType == Node.TEXT_NODE) { | |
if (subhash_browser_js.book_reader_js.bTitleFound) { | |
subhash_browser_js.book_reader_js.sHtml += oNode.nodeValue; | |
} | |
} | |
} | |
if (subhash_browser_js.book_reader_js.bTitleFound && | |
subhash_browser_js.book_reader_js.isUsefulTag(sTag)) { | |
subhash_browser_js.book_reader_js.sHtml += "</" + sTag + ">"; | |
} | |
//console.error("Html is : " + subhash_browser_js.book_reader_js.sHtml); | |
}, | |
parseElement: function(aoEl) { | |
if (window.getComputedStyle(aoEl)) { | |
if (window.getComputedStyle(aoEl).getPropertyValue("display") == "none") { | |
try { console.error("Ignoring hidden element: " + | |
aoEl.outerHTML.substr(0,300)); } catch (e) {} | |
return; | |
} | |
} | |
//console.error("Checking element " + aoEl.tagName); | |
subhash_browser_js.book_reader_js.isTitleTag(aoEl.tagName.toLowerCase()); | |
if (aoEl.children.length > 0) { | |
subhash_browser_js.book_reader_js.parseNode(aoEl); | |
} else if (subhash_browser_js.book_reader_js.bTitleFound) { | |
subhash_browser_js.book_reader_js.parseFiniteElement(aoEl); | |
} | |
}, | |
changeToReader: function() { | |
try { | |
subhash_browser_js.book_reader_js.addNoYuckiesStyle(); | |
subhash_browser_js.book_reader_js.removeUnwantedTags(); | |
subhash_browser_js.book_reader_js.createHeader(); | |
var oEl = document.getElementsByTagName("body")[0]; | |
subhash_browser_js.book_reader_js.parseElement(oEl); | |
subhash_browser_js.book_reader_js.sHtml += "</body>\n"; | |
document.getElementsByTagName("html")[0].innerHTML = subhash_browser_js.book_reader_js.sHtml; | |
} catch (e) { | |
console.error("Subhash Browser BRV Error" + e); | |
} | |
}, | |
handle_DOMLoaded: function() { | |
try { | |
window.setTimeout( | |
function() { | |
subhash_browser_js.book_reader_js.changeToReader(); | |
}, | |
5*1000); | |
} catch (e) { | |
console.error("Subhash Browser BRV Error: " + e); | |
} | |
} | |
} | |
document.addEventListener | |
("DOMContentLoaded", subhash_browser_js.book_reader_js.handle_DOMLoaded, false); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment