// ==UserScript==
// @name google cache comeback
// @namespace trespassersW
// @description Brings back links to cached pages in the Google search results
// @include http://www.google.*
// @include https://www.google.*
// @include http://webcache.googleusercontent.*
// @include https://webcache.googleusercontent.*
// /homepageURL http://userscripts.org/scripts/show/156216
// /updateURL https://userscripts.org/scripts/source/156216.meta.js
// @version 2.016.0130
// @grant GM_addStyle
// @grant GM_log
// @run-at document-start
// 2016-01-30 * hotfix: li.g became div.g
// 2014-07-20 run-at start + run-at end
// 2013-05-31 2.2.4 plain cache links; thanks to luckymouse[userstyles.org/styles/64844]
// 2013-02-11 2.2.3 default: Esc shows gCache; cached/similar always visible.
// 2013-02-04 2.2.2 more "run by ESC" options
// 2013-02-02 2.2.1 run by ESC option comeback
// 2013-01-31 2.2 native G cache/similar links revealed; no Escape required
// 2013-01-24 2.1 now works in cached pages called from preview
// 2013-01-11 2.0 hit ESC to run the script!
// 1.3.3 links to alien cached pages
// 1.3.1 links to cache in cached page
// 1.2.1 internal links in cached page become internal
// @icon data:image/gif;base64,R0lGODlhFgAYAOePAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///yH5BAEKAP8ALAAAAAAWABgAAAj+AP8JHDiQj0E+BBMq/IdIlTd06LypQrQw4adx3BrhyZMHTyNu4z5VFKjMGyI7BO0g8qZsZKFpoeQolBNqWqGFXUgZ01NRjzFSXRR2EZVM5kI5yUQFTXil07IxFccs63RF4RJJ0ZZMakZunrxxzkg5iSZpiUIiiEhlWyfvHj588tqNq7bKDxGFRkRZI7duHj59+Oa1I7fNmS2zBP0EUzYtm5ohWdTQOfNEiaFlw3CJHKhKVzFmTZjgMeXrl69QaojU4SWLFEFTsnjNSULHVK1YvXLV8nRmSCVUnxoJ3NPoUqYhZ+QseprFzbZMcbpAqaRokEA3fhIFQuJlDZ87YLydePGDJ46XJJME7REIBs4eQz26nNEh5o79KkPgZHnC6I4bgU5oYQYcViTRhRcm8CCEDj6o0UUSeKwxRhQDKbGFGYXgYKAYTCCxxRkPKnGIF1UoMVAPAWLYQxJVdOFiFUkoUYkWUxShUA5KPIEFIatckggppvgRhRJC3FBRDUQo4YQUUnghxZBH9CDDSP+8kMMPQ2Q5RBBSskDllwoFBAA7
// ==/UserScript==
const runByEsc = false // | true /* hit ESC to run on search & cached pages */
const runByEscCached = false // | true /* hit ESC to run on cached page */
const runByEscSearch = false | true /* hit ESC to run on search page */
/* the reasons of options listed above:
- I suspect sometimes G doesn't show the cache link; nevertheless it exists;
- some pages build themself dynamically using xmlhttprequest, jquery & other such crap (G for example);
so my script can't find all references on the displayed page until the loading process is finished;
- scripts's icons on cached page are annoying if you don't plan to use them.
*/
const showPadlock = true // & false // 2013-04-25
var iconAcnhor, gComemBack;
const bref = "http://webcache.googleusercontent.com/search?ie=UTF-8&q=cache:";
var insideCache;
function main(e){
if( insideCache )
casche(e);
else
rezultz(e);
}
function rezultz(e){
/* v2.1 13-01-24 */
if(Xel('//a[starts-with(@class,"googCacheComeBack")]')) {
//GM_log('search: already')
return;
}
if(e) e.preventDefault() , e.stopPropagation();
try{
var rez = Xels('//div[@id="search"]//div[@class="g"]');
for(var i=0,li=rez.length; i< li; i++){
var a=Xel('.//a',rez[i]);
a.removeAttribute("onmousedown"); // it's not my funeral
var aref=bref + hesc(a.href); //
var cache= buildEl('span',{style: 'color: black'},null,' ‣ ');
cache.appendChild(
buildEl('a', {href: aref, 'class': 'googCacheComeBack fl'
//,style: 'color: #0E1BA3; text-decoration: none;'
,target:'_blank'},
null,'gCache'));
var cite = Xel('.//cite',rez[i]);
cite && cite.appendChild(cache);
}
}catch(e){ GM_log('cacherr:\n'+e) }
/* */
}
function casche(e) //{try
{//inside cached page
if(Xel('//a[starts-with(@class,"gooCache")]')) {
//GM_log('cache: already')
return;
}
if( runByEsc || runByEscCached ) e.preventDefault(), e.stopPropagation();
var hloc=location.href+''; /*2012-07-14*/
hloc=hloc.split(/\/?\#|\%23/)[0];
var loc =hloc.match(/[\&\?]q\=cache\:(.*)/);
if(!loc || !loc[1]){ GM_log('not webcache\n'+hloc); return;}
// loc=loc[1]; //unescape(loc[1]);
loc = Xel("/html/body/div/div/a").href+''; // 2013-01-24
var ctr=0;
var dom= FLD(loc);
var L=unsafeWindow.document.links;
GM_addStyle(iconAcnhor);
for( var i= L.length-1; i>=0; i--){
var ref=L[i].href.split(/\/?\#|\%23/);
//http://support.mozilla.org/en-US/kb/categorizing-bookmarks-make-them-easy-to-find#w_using-tags
// ref.length>1 && GM_log('l#'+ref[0]+'#'+ref[1])
if(ref.length>1 && ref[0]==loc){
// GM_log('A#'+ref[0]+'#'+ref[1])
L[i].href=hloc+'#'+ref[1]; // it should be full URL 'cause G defines BASE in page's header
L[i].removeAttribute("onmousedown"); // ??
L[i].className = (L[i].className?L[i].className+' ':'') +
'gooCacheAnchor';
}else{
var refdom=FLD(ref[0]);
//GM_log('refdom: ' + refdom.d )
if(refdom && dom){
e=buildEl('a',{'class': (refdom.d==dom.d)?'gooCacheLink':'gooCacheExt',
/* */ title: 'cached', /* */
href: bref+hesc(L[i].href)
},null,''); //'↓'
insAfter(e,L[i]);
}
}
}
//}catch(e){GM_log('linkerr:\n')+e;}
}
function hesc(href){
var hr=href+'';
const re=/^(.+?)([\?\#\&].*)$/;
var m=hr.match(re);
if(m && m.length==3){
hr=m[1]+escape(m[2]);
//GM_log('!'+hr);
}
return hr;
}
function buildEl(type, attrArray, eL, html){
var node = document.createElement(type);
for (var attr in attrArray) if (attrArray.hasOwnProperty(attr))
node.setAttribute(attr, attrArray[attr]);
if(eL)
node.addEventListener(eL[0], eL[1], eL[2]?true:false);
if(html)
node.innerHTML = html;
return node;
}
function Xel(XPath, contextNode){
var a = document.evaluate(XPath, (contextNode || document),
null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
return (a.snapshotLength ? a.snapshotItem(0) : null);
}
function Xels(XPath, contextNode){
var ret=[], i=0;
var a = document.evaluate(XPath, (contextNode || document),
null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
while(a.snapshotItem(i))
ret.push(a.snapshotItem(i++));
return ret;
}
function FLD(url){
var dm=url.match(/^(https?\:)\/\/(.+?)\//);
if(!dm || dm.length<3) return null;
dd=dm[2].split('.');
if(dd.length<2) return null;
return {p:dm[1], d: dd[dd.length-2]+'.'+dd[dd.length-1]};
}
/* * /
function insBefore(n,e){
return e.parentNode.insertBefore(n,e);
}/* */
function insAfter(n,e){
if(e.nextSibling){
e.parentNode.insertBefore(n,e.nextSibling);
}else if(e.nextElementSibling){
e.parentNode.insertBefore(n,e.nextElementSibling);
}else
e.parentNode.appendChild(n);
}
iconCacheLink='\
content:url(data:image/png;base64,\
iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAABMklEQVQoz42QP0tCYRSHnxuXhjCIigtW4KBRweuU1NDS0lIY9AFaWqItDIy+goM01RAI0ewkCG1BShQuweXqTRwasugS9EejWk6DaPfmTfot73nPOQ+/c46GS+l8Xdz/xPKYRi+l83VxmiIiIk5T5PjcERVPyr8AFU+Kiiclf/0qm0e2L6i3g9EBiK7uYuZSGkBla1uGA/2+Jn3t4MuneFNv+EJaofouewenPfc1JiJkd6KaZ7y1pXmK5SduHxWl2k9zLAwhw8Q+O/HudFV99gDpjXtqD00u7QilGoSMbmcd8ABzk0NMjwdYmX2jctegWP4DcqvtnL1QwCCxcLAbcl4+CRkmoEhkgsTCAK23NZ6Jbfk4LcyMAC3w9yH8pANkDvc7CeUqflhgWzC1uI6ZS3Xy35M8hMl4RkDrAAAAAElFTkSuQmCC\
)';
iconAcnhor=
'\
.gooCacheAnchor:after{\
position: relative; top: 6px; \
content:url(data:image/png;base64,\
iVBORw0KGgoAAAANSUhEUgAAAAgAAAAKCAYAAACJxx+AAAAAWElEQVR42mNkQAM6vmX/r2zuYoTxGdEl1R1iGW4eWMwAU8RIkgnBvZf/w9hri3XJMAGnApDRMCORFYDE4YIg14MUwRSAJEG+gSsA0SBFMADzKkY4wNgwawC9Qz2rUJ9HmwAAAABJRU5ErkJggg==\
)}\
.gooCacheLink:before{\
position: relative; top: 6px; opacity: 0.8;'+
iconCacheLink+
'}\
.gooCacheExt:before{\
position: relative; bottom: 4px; opacity: 0.8; \
content:url(data:image/png;base64,\
iVBORw0KGgoAAAANSUhEUgAAAAgAAAAKCAYAAACJxx+AAAAAkklEQVR42mNkQALbLn76f+PpF4b1u08yvL9zHCzGyIAF9G179h+miBGXZKCrOdgkRmTVICCoYgmWLPKSAssx2hau/w8S4BaTBCuY3FgOVnS4P5AR5CZGHd+y/7n1nWAJZHBlcxfYehQFSZkFYJNAbBQFMAkQ+PrqOcO86RMQCkBuADkQZC8IwNggN4AV4PMFiA8ADbFh5B0GQNAAAAAASUVORK5CYII=\
)}\
.googCacheComeBack{\
}\
';
// from: [http://userstyles.org/styles/64844/google-search-plain-view-cached-similar-links]
// by luckymouse [http://userstyles.org/users/14255]
gComeBack ='\
.clickable-dropdown-arrow.ab_button\
,a[id^="am-b"].ab_button\
{display: none !important;}\
.action-menu.ab_ctl {\
position: static !important;\
display: inline-block !important;\
margin: 0 !important; \
vertical-align: baseline !important;}\
.action-menu-panel.ab_dropdown {\
visibility: visible !important;\
position: static !important;\
box-shadow: none !important;\
border: none !important;}\
.ab_dropdownitem {display: inline !important;}\
.ab_dropdownitem::before,\
.ab_ctl + a.fl[href*="translate.google.com/"]::before\
{content: "\\00a0\\2023"; color: #000;\
padding-right: 2px; font-size: 14px !important;}\
.ab_dropdownitem:hover {cursor: auto !important; background: transparent !important;}\
.action-menu a[id^="am-b"],/*14-05-20*/\
.action-menu-item div.action-menu-button {display: none !important; }\
.action-menu-item a.fl {\
color: #1122CC !important;\
display: inline !important;\
padding: 0 3px 0 0 !important;\
font-size: 14px !important;\
}\
.action-menu-item a.fl:hover {text-decoration: underline !important;}\
/*2013-06-14*/\
.action-menu-panel.ab_dropdown {background-color: transparent !important;}\
div.f[style*="white-space:nowrap"] {white-space:normal !important;} \
.action-menu-button {display: inline !important; }/**/\
.kv, .slp { display: inline-block !important; padding-left: 4px !important;}\
/*2014-07-14*/\
.s .f.slp:empty{display:none!important;}\
.s span.st {display:inline-block !important;}\
.cr-dwn-arw{margin-left: 2px!important;}\
';
//
insideCache = location.href.indexOf('webcache')>=0;
if(!insideCache)
GM_addStyle(gComeBack); /* 11-02-31 */
window.addEventListener("load",function(e){ /* 2014-07-20 */
if( runByEsc || (insideCache && runByEscCached) || (!insideCache && runByEscSearch) ) {
window.addEventListener("keydown", function(e){
if(e.keyCode==27){
main(e);
}}, false);
}else
main(null);
},false);
// end