Scroogle - bookmarkable, pretty, cache links

By khopesh Last update Oct 17, 2009 — Installed 1,976 times. Daily Installs: 2, 4, 8, 7, 3, 3, 3, 0, 12, 29, 14, 8, 11, 15, 3, 6, 5, 7, 5, 2, 2, 8, 3, 1, 4, 4, 11, 3, 3, 6, 9, 5

There are 15 previous versions of this script.

Add Syntax Highlighting (this will take a few seconds, probably freezing your browser while it works)

// ==UserScript==
// @name           Scroogle - bookmarkable, pretty, cache links
// @namespace      http://khopis.com/scripts
// @description    Nicer look, bookmarkable search, better security, cache links
// @include        https://*scroogle.org/cgi-bin/nbbw*
// @include        http://*scroogle.org/cgi-bin/*
// @include        https://ssl.scroogle.org/*
// @author         Adam Katz <scriptsATkhopiscom>
// @copyright      2008 by Adam Katz
// @license        AGPL v3+
// @version        1.4
// @lastupdated    2009-10-16
// ==/UserScript==
/*
 * There are three main features provided here:
 *   1. Bookmarkable URLs when in SSL mode.
 *   2. Display beautified, now it looks almost exactly like Google
 *   3. Helper links added for cache, similar links, and history.
 *
 * A quick overview of Scroogle - this is an anonymizer service which
 * prevents Google, Inc. from connecting your searches to you. They wipe
 * logs religiously, there are no cookies, etc. Using SSL also means nobody
 * can read your traffic and note your search queries.
 * Learn more at www.scroogle.org or http://epic.org/privacy/gmail/faq.html
 *
 * If using SSL, further searches should be SSL, and it is safe* to use GET,
 * making searches bookmarkable (see https://ssl.scroogle.org/sslnote.html )
 * If not using SSL, it is not safe to use GET.  We ensure we're using POST
 * for the reasons outlined at http://www.scroogle.org/scget.html
 * (* note:  SSL-to-SSL apparently passes referer data.  This script uses
 *           javascript:location.href='https://...'  as a workaround.)
 *
 * Quick Search and Search Bar options for scroogle
 * are listed at http://userscripts.org/scripts/show/23529
 *
 *
 * Copyright 2008-9 by Adam Katz <scriptsATkhopiscom>, AGPL 3+
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License at <http://www.gnu.org/licenses>.
 */

var override = false; // set this to true to always use SSL on refined searches
var query = null;

// fix get/post on forms
var forms = document.getElementsByTagName("form");
for (var i = 0, f; (f = forms[i]); i++) {
  //if ( /\/nbbw(ssl)?\.cgi$/.test(f.action) ) { // just the search box
  if ( f.action.indexOf("/nbbw") !=-1 ) { // just the search box
    for (var gw=document.getElementsByName("Gw"), j=0, g; (g = gw[j]); j++) {
      if (j == 0) { query = g.value; }
      g.setAttribute("spellcheck", "true");
    }
    // GET is safe only with SSL; see https://ssl.scroogle.org/sslnote.html
    if ( override || location.protocol == "https:" ) {
      f.method = "get";
      urlHead = "https://ssl.";
    } else {
      f.method = "post";
      urlHead = "http://www.";
    }
    // i see no difference between nbbw.cgi and nbbwssl.cgi
    f.action = urlHead + "scroogle.org/cgi-bin/nbbw.cgi";
  }
}


// don't do any of this unless the search form exists!
if (query != null) {

// CSS moved to top so that it looks nicer faster
GM_addStyle( "\n" + // better spacing, fonts, colors, placement for new items
// The following multi-line string requires E4X (not supported in IE or Opera)
// Syntax highlighting is almost certainly going to get broken here ...
<style><![CDATA[

  .result b[style="background-color: rgb(255, 255, 102);"]  /* 1. #ffff66 */
     { border-color:#ed5; background-color:#fffbed!important; }
  .result b[style="background-color: rgb(160, 255, 255);"]  /* 2. #a0ffff */
     { border-color:#8ee; background-color:#e8f8ff!important; }
  .result b[style="background-color: rgb(153, 255, 153);"]  /* 3. #99ff99 */
     { border-color:#8e8; background-color:#efe!important; }
  .result b[style="background-color: rgb(255, 153, 153);"]  /* 4. #ff9999 */
     { border-color:#e88; background-color:#fee!important; }
  .result b[style] { border-style:solid; border-width:1px 0; }
  body { font-family:sans-serif; }
  body.index { text-align:center; background:white; }
  ul, blockquote { margin:0; padding:0; }
  P[align="right"] b { font-size:1em; display:block; float:left; }
  #top { margin:4em 0 0 2em; }
  center { text-align:left; }
  body.index center { text-align:center; }
  .secondSearch, .searchTitle { 
       display:block; color:#000; background:#ebeff9; border:solid #6b90da; }
  .searchTitle { 
       border-width:1px 0 0 0; line-height:2em; margin-bottom:-2em;
       font-size:0.8em; padding:0 0.5em; font-weight:bold; }
  .searchTitle div { font-weight:300; }
  .secondSearch { border-width:1px 0; padding:1.5em 0; text-align:center; }
  .right { float:right; }
  .noHits { display:block; margin:3em 0 -2em 0; font-size:1.25em; }
  img { border:none; }
  #logo img { height:6em!important; margin-top:-1em; }
  #top #logo img { height:10em!important; }
  form { display:inline; }
  input[type="text"] { width:40em; }
  span.ftype { font-weight:bold; font-size:x-small; color:blue; }
  #title, #title *, center, center * { vertical-align:middle; }
  ul { margin-top:0.25em; margin-bottom:0.75em; }
  div.hit2 { margin-left:2em; } /* indent subsequent hits within a domain */
  .cache { font-size:0.75em; /* padding-left:4em; */ }
  .cache a { color:#77c; }
  .cache a:visited { color:purple; }
  .trans > a { text-decoration:underline; cursor:pointer; } /* not a href */
  span.trans div { visibility:hidden; position:absolute;
       padding:0.1em 1em; margin:1.2em 0 0 -0.5em; border:solid 1px #88d;
       background-color:#eef; -moz-opacity:0.95; -moz-border-radius:4px; }
  span.trans:hover div { display:inline; visibility:visible; }
  span.trans:hover div a { display:block; text-decoration:none; }
  span.trans:hover div a:hover { display:block; text-decoration:underline; }

]]></style> );



// remove the leading number on each hit, put each result in an ID'd <div>
document.body.innerHTML = document.body.innerHTML.replace(
  /\n(<font face="[^"]*.>)?([0-9]+)\. (<[^\n]+\n(<.font>)?<ul>[^\n]+<.ul>)/mg,
  "\n<div class='result' id='result$2'>$1$3</div>");

// add links to caching sites
function makeCacheLink(href, text, title) {
  var link = document.createElement("a");
  if (href != null) { link.href = href; }
  if (title != null) { link.title = title; }
  link.appendChild(document.createTextNode(text));
  var cache = document.createElement("span");
  cache.appendChild(document.createTextNode(" - "));
  cache.appendChild(link);
  return cache;
}

var results = document.getElementsByTagName("ul");
var links = document.getElementsByTagName("a");
var lastDomain = 'nowhere';
for (var i=0, j=0, r, l, notHTML; (r=results[j]); j++, i++) {
  notHTML = false;
  l = links[i];
  caches = document.createElement("span");
  caches.className = "cache";
  r.appendChild(caches);

  href = l.href;

  // privacy workaround for SSL-to-SSL referer issue (see "* note" above)
  if ( href.indexOf("https://") == 0 && location.protocol == "https:" ) {
    try {
      // pin link's color to initial :visited state before altering its href
      l.style.color = getComputedStyle(l,'').
                                   getPropertyValue("color");
      // because this can be used to report your history to a 3rd party,
      // it might be disabled or blocked in the future (thus the try/catch).
      // Learn more at https://bugzilla.mozilla.org/show_bug.cgi?id=147777#c11
    } catch(e) {  } // ignore errors from missing/prohibited call

    l.href = "javascript:location.href='" + href + "'";
  }

  var hrefPath = href.replace(/(?:^https?:..[^\/]+)/,'');
  var hrefDomain = href.replace(/^https?:..([^\/]*).*/,'$1');
  // mark secondary hits for this domain (unless this is a site-specific search)
  if (hrefDomain == lastDomain && ! /(?:^|\s)\+?site:[a-z]/.test(query) )
    { r.parentNode.className += " hit2"; }
  lastDomain = hrefDomain;

  if ( /(?:\.(?:p(?:df|pt)|doc|rtf)$)/i.test(href) ) {
    notHTML = true; // for google cache text below
    if ( /(?:\.pdf$)/i.test(href) ) { // PDFs get an extra cache entry
      caches.appendChild( makeCacheLink( // PDF->flash a la Stateless Systems
        "http://pdfmenot.com/view/" + href,
        "PdfMeNot", "View PDF in Flash Applet") );
      l.className += " pdf";
      i++; // links[] is dynamic, so we must increment i whenever we add a link
    }
    var ftype = document.createElement("span");
    ftype.className = "ftype";
    ftype.appendChild( document.createTextNode(
                         href.replace(/^.*\.(...)$/,"[$1] ").toUpperCase() ) );
    l.parentNode.insertBefore(ftype, l);
  }

  // skip scroogle and cache/well-seeded links (is this useful?)
  if (! /\b(?:scroogle.org|google.com|nyud.net)$/.test(hrefDomain) ) {
    caches.appendChild( makeCacheLink( // Coral, the NYU Distribution Network
      "http://" + hrefDomain + ".nyud.net:8080" + hrefPath,
      "CoralCache") );
    i++;

    goog = makeCacheLink( // get Google's cache (since it's their search result)
      "http://www.google.com/search?q=cache:" + href,
      notHTML ? "View as HTML" : "Google Cache" ); // text differs if not HTML
    if (notHTML) {
      goog.style.fontWeight = "bold";
      goog.title = "via Google Cache";
    }
    caches.appendChild(goog);
    i++;
  }

  // mimic google's related search ... mostly useless
  // NOTE - this circumvents the POST-based security in non-ssl searches!
  caches.appendChild( makeCacheLink(
    forms[0].action + "?Gw=related:" + href.replace(/^https?:../,''),
    "Similar pages" ) );
  i++;

  caches.appendChild( makeCacheLink(
    "http://web.archive.org/web/*" + href,
    "History") );
  i++;

  var hrefTLD = hrefDomain.replace(/(?:^.*\.)/g,'');
  if (/(?:^..$)/.test(hrefTLD)
      // try to exclude pages already translated into English
      && ! /english/i.test(l.innerHTML)
      && ! /(?:english|[/\.]en\b)/i.test(href) ) {
    var lang = [];
    if (/(?:c[adhim]|fr|b[ef]|m[cg]|ht|lu|ne|sn)/
        .test(hrefTLD)) lang.push("fr");
    if (/(?:a[nw]|nl|be|sr)/.test(hrefTLD)) lang.push("nl");
    if (/(?:cn|hk|tw|m[oy]|sg)/
        .test(hrefTLD)) { lang.push("zh"); lang.push("zt"); }
    if (/(?:d[ek]|at|be|c[hz]|l[iu]|hu|pl)/.test(hrefTLD)) lang.push("de");
    if (/(?:[gt]r|cy|al)/.test(hrefTLD)) lang.push("el"); // greek
    if (/(?:it|s[im]|hr|mc|ch|va)/.test(hrefTLD)) lang.push("it");
    if (/(?:jp|pw)/.test(hrefTLD)) lang.push("jp");
    if (/(?:k[pr])/.test(hrefTLD)) lang.push("ko");
    if (/(?:br|[ps]t|g[qw]|m[oz]|ao|cv|tl)/.test(hrefTLD)) lang.push("pt");
    if (/(?:ru|ua|k[gyz]|[eg]e|l[tv]|az|by|md)/.test(hrefTLD)) lang.push("ru");
    if (/(?:e[cs]|mx|c[loru]|b[oz]|g[qt]|p[ay]|uy|ve|ar|do|hn|ni|sv)/
        .test(hrefTLD)) lang.push("es");

    function langName(code) {
      switch (code) {
        case "de" : return "German";
        case "fr" : return "French";
        case "ru" : return "Russian";
        case "es" : return "Spanish";
        case "jp" : return "Japanese";
        case "zh" : return "Chinese (Simplified)";
        case "zt" : return "Chinese (Traditional)";
        case "it" : return "Italian";
        case "nl" : return "Dutch";
        case "el" : return "Greek";
        case "ko" : return "Korean";
        case "pt" : return "Portuguese";
      }
    }

    if (lang.length >= 1) {
      var translations = makeCacheLink(null, "Translate");
      translations.className = "trans";
      caches.appendChild(translations);
      var trList = document.createElement("div");
      var trTitle = translations.getElementsByTagName("a")[0];
      translations.insertBefore(trList, trTitle);
      for (var k=0, la; (la=lang[k]); k++) {
        var trLink = document.createElement("a");
        trLink.href = "http://babelfish.yahoo.com/translate_url?tt=url&trurl="
          + escape(href) + "&lp=" + la + "_en";
        if (lang.length == 1) { trTitle.href = trLink.href; }
        trLink.appendChild(document.createTextNode("from "+langName(la)));
        trList.appendChild(trLink);
      }
      i += lang.length + 1; // don't forget the top-level Translate link
    }
  }
}


///////////////////////////  everything else is for beautification

// create top image (no SSL version of image available)
var img = document.createElement("img");
/*
img.src = "http://scroogle.org/gifs/";
if (Math.random() > 0.6) {
  img.src += 'gooburns.gif'; // 40% chance of google logo burning/falling down
} else {
  img.src += 'scrooge2.gif'; // 60% chance of scroogle logo
}
*/
img.alt = "S C R O O G L E";

// create top image's link
var title = document.createElement("a");
title.href = "http://scroogle.org";
title.id = "logo";
title.appendChild(img);



// try placing and messing with specific items
try {
  var bolds = document.getElementsByTagName("b");
  if (bolds.length > 1) {
    var searchTitle = bolds[0];
    var searchTitleText='';
    if (! / results$/.test(searchTitle.innerHTML) ) {
      searchTitle.className = "searchTitle"; // mark search title for CSS
      numResults = document.getElementsByName("n");
      var tot=0;
      for(var t; (t=numResults[tot]); tot++) {
        if(t.checked) {
          tot = t.value;
          if(tot == 1) { tot = 100; } else { tot = tot * 10; }
          if (tot == results.length) { tot = tot + "+"; }
          else tot = results.length;
          break;
        }
      }
      // put count of hits in search title bar
      if (results.length > 0) {
        searchTitleText = '<div class="right">' + "Results <b>1</b>-<b>"
          + results.length + "</b> of <b>" + tot + "</b> for <b>"
          + query + "</b></div>";
      }
      searchTitle.innerHTML = searchTitleText + "Web - Google Search";
    }
    var noHits = bolds[bolds.length-2];
    if ( /no results for this search.$/.test(noHits.innerHTML) ) {
      noHits.className = "noHits"; // mark lack of hits for CSS
      searchTitle.parentNode.insertBefore(title, searchTitle); // add top image
    } else {
      if (forms.length >= 1) {
        var f0 = forms[0];
        f0.parentNode.insertBefore(title, f0); // insert top image
        if (forms.length > 1) {
          var f1 = forms[1];
          f1.className = "secondSearch"; // mark second search box
  
          var pagelinks = document.getElementsByTagName("a");
          var privacy = pagelinks[pagelinks.length-1];
          privacy.href = "http://www.eff.org/issues/privacy";
          privacy.innerHTML = "protect your privacy";
  
          /*
          // create marketwatch link
          var marketWatch = document.createElement("a"); // create link element
          marketWatch.href = "http://www.scroogle.org/bubble.html";
          marketWatch.className = "marketWatch";
  
          var mwimg = document.createElement("img"); // create image
          mwimg.src = "http://www.scroogle.org/gifs/evilb.gif";
          mwimg.alt = "Don't be evil - Google market cap watcher";
          marketWatch.appendChild(mwimg);
  
          f1.parentNode.insertBefore(marketWatch, f1); //insert mw img
          GM_addStyle("\n.marketWatch { float:right; margin-top:2em; }\n");
          */
        }
      }
    }
  } else {
  // put top image at very top of page (we failed to place it above)
  document.body.className += "index";
  document.body.innerHTML = '<div id="top"></div>' + document.body.innerHTML;
  document.getElementById("top").appendChild(title);
  }
} catch(e) {
  GM_log(e);  // this shouldn't fire any more...
}

// I moved this to the end to speed up everything else
img.src = "data:image/gif;base64,"+<base64><![CDATA[
R0lGODlhrABIAPcAAAMNAwEFAQcYBw4fEQsjCw0oDREtEhAhGBU0FRs7Gxc3Fw82DyI5HB89IiE+IiY
8KCs+LxAbLVYUDnMWC28iGHAwKFgwIBlEGBVXFBpoGg5wDh9FISNCJCtFKypDKitENDJKMjVKOjhLOj
NQMSVpJSZ3JTN3MiBgH1ZHEWpaHGhTCH5nD05SOnFMPHlpLRItVBc7bCk6TjpMRT5SRRNCeyNHdkJUR
EZXSk5YS2ldTE1hVlVmWE1qTWdkSXFtV1hqZ1htcWV1amh3d3Z8eXBzZ4QLAYcVCJgVBY8OBqkYBrgY
A6APAJEmGLszHrApFpE1KKo5KLY4JcsaAsQZA9AeBMkkC9Q2G80tFMY5JNM9JY91EbBEM4VgKtdFKsZ
HM9VLM9JOOIV0VLRtWI15baFpXNpbRMhYR9hjTdpoVMZmV+FpVOFvWdd4Z+J6ZeBXQAiDCCeJJTOUMj
qlOiCCH02aS0irR1OzU1u4WlGtUHmEeGe6Znm/eGC3XXTCc6mLGbuYFbGODbOWLqOKKMOcD9CpF+a4G
NKvL+W9LMCfIPPLOO3ELfLBGq6OTpeJdouHdbiYe6+MeLOncaOYV9e5SdGJceaHdeiKds+obvbWWPDO
TPPXbfnhfgpDgxZOlRNPmSpUjhZUoxtcsyNcqyVitlduhHR9hmh5iipszSZnxjhyzDNwz0V51HmDiX2
IknWLqk2C1YWJio2Smpibl5GTiqeai6mcl7aal7OXhpymmaekmralmLWpj5acpIyXoZuiqZ2os6apqb
mrprq2q6asta2zurm4t622qc6Yi+qVhMSliMenmde5mNCwleimmMispce0qdW1qMu7tMa5ttS+t9Sro
+K5rIvKiZHOkJbSk5LPj7XLsvTdivbkl/fgh8rBvNTDvdnFudrGpejKq+bKt/HTu/noqd/Gkbe8w663
xb7DzcPDw8zFxM3MzMbIy9PGw9XJxtTOzNrOy9rJxdfQz9vQztzQxtXT09zU0tza2trX18vO0+HNyOL
RzeLV0uPb2f///yH5BAEAAP8ALAAAAACsAEgAAAj+AP8JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGD
Nq3Mixo8ePIEOKHNmxH717/e6xI8mypcuG9/Dx43fy3j17xV7q3EnSXj6b/vzZvCcUJ8+jSDHau0fTm
7d+QfFFvZdPXdKrWBvaO3lSnSNhUOuB2xfUX7+cWdOq/ZdyqUl+92Zp8/ctGSUx30z2s7q279Gl9E7C
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
]]></base64>;

GM_addStyle(".pdf { background:right no-repeat url(" + (""+<base64><![CDATA[
"data:image/jpg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAkGBwgHBgkIBwgKCgkLDRYP
DQwMDRsUFRAWIB0iIiAdHx8kKDQsJCYxJx8fLT0tMTU3Ojo6Iys/RD84QzQ5Ojf/2wBDAQoKCg0MDRo
PDxo3JR8lNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzf/wA
ARCAAQABADASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAwQFBv/EACQQAAICAQIGAwEAAAAAA
AAAAAEDAgQFABEGEhQhIjFBcaHR/8QAFQEBAQAAAAAAAAAAAAAAAAAAAwX/xAAcEQAABgMAAAAAAAAA
AAAAAAAAAQIRIUESMWH/2gAMAwEAAhEDEQA/AN/i8rlLqGOdeWlUBKUpBAOwG/8ANDwV91BuHx78hAx
kZKchwiJrkIExBO+537feoqMtilUqq7F1i5qMuoq9Mw88uckCREe49dvnT1PK47iHiPEohWW2KpNYRK
qREeG4PlED3+6J9CgomySoomi61D//2Q==" ]]></base64>).replace(/\s/g,'')
+ "); padding-right:20px; }\n");

} // end if (query)