NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Australian Financial Review Paywall Bypass // @description Resets article limit for Australian Financial Review - afr.com and Smart Investor - afrsmartinvestor.com.au // @include /^https?://(\w+\.)?afr.com/.*$/ // @include /^https?://(\w+\.)?afrsmartinvestor.com.au/.*$/ // @include /^https?://(\w+\.)?misaustralia.com.au/.*$/ // @require http://code.jquery.com/jquery-latest.min.js // @grant GM_log // @grant GM_addStyle // @grant GM_xmlhttpRequest // @run-at document-start // @version 3.1 // ==/UserScript== GM_addStyle(".subscription-overlay { display: none!important; }"); GM_addStyle(".cq-article-content-paras p { color: inherit!important; }"); function findNodesByClass(nodes, className, partial){ className = className.toLowerCase(); if(typeof partial == 'undefined') var partial = false; var foundNodes = []; if(nodes) for(var i = 0; i < nodes.length; i++){ if(!('classList' in nodes[i])) continue; for(var j = 0; j < nodes[i].classList.length; j++) if(partial){ if(nodes[i].classList.item(j).toLowerCase().indexOf(className)!=-1) foundNodes.push(nodes[i]); } else if(nodes[i].classList.item(j) == className) foundNodes.push(nodes[i]); } return foundNodes; } fns = [ function(mutation){ removeClassFromNodes(mutation, 'paywall', true); return false; }, function(mutation){ removeClassFromNodes(mutation, 'bind-hagrid', true); return false; }, function(mutation){ procNodesByClass(mutation, 'subscription-overlay', function(node){ node.parentNode.removeChild(node); return true; } ); } ]; function removeClassFromNodes(mutation, class_, partial){ if(typeof partial == 'undefined') var partial = true; procNodesByClass(mutation, class_, function(node){ node.className = node.className.replace( new RegExp(partial ? ('[/w-]*' + class_ + '[/w-]*') : ('\b' + class_ + '\b'), 'gi'), '' ); return true; } , partial); } function procNodesByClass(mutation, class_, callback, partial){ var nodes = []; if(mutation.addedNodes.length) nodes = nodes.concat(findNodesByClass(mutation.addedNodes, class_, partial)); if(mutation.attributeName && (mutation.attributeName == 'class') && (mutation.target.className.indexOf(class_)!==-1)){ console.log('mutation class:' + mutation.target.className); nodes = nodes.push(mutation.target); } for(var i = 0; i < nodes.length; i++) if(callback(nodes[i])===false){ console.log("Error in callback"); return false; } return nodes.length; } function doFns(mutation){ for(var i in fns) if(fns[i](mutation)===true) delete fns[i]; if(fns.length == 0) observer.disconnect(); } var observer = new MutationObserver(function(mutations) { mutations.forEach(doFns); }); observer.observe(document.documentElement, { attributes: true, childList: true, subtree: true, attributeFilter: ['class']} );