By Valentin Laube
Has 4 other scripts.
// ==UserScript==
// @name Slashdot - add mirrors
// @namespace http://www.cs.uni-magdeburg.de/~vlaube/Projekte/GreaseMonkey/
// @description Adds links to Coral (http://www.coralcdn.org/), MirrorDot (http://www.mirrordot.com/) and the Google Cache (http://www.google.com/) to every link in the articles and comments
// @include http://slashdot.org/*
// @include http://*.slashdot.org/*
// ==/UserScript==
// $LastChangedDate: 2006-05-14 00:14:18 +0200 (So, 14 Mai 2006) $
// $Revision: 38 $
// FIXME: conflicts with slimbody
var coralcacheicon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEWSURBVBiVbZAxS0JxAMR/zycKRVE9SCKiKIdAHGqIcnCwVTOcBEe/Qx+iORycpVFajByihqdigwjWVESUUhIU/KmUGq7lVUQd/Ja744azJAEsANvAmgfAmccBcGNJ2hx8DMrFVnHcvXVp3DWwfTaxuRjx+Tj5lbwJ2IGMJame3E9uVC4r/KdcNEcpU2r4ANM1XQAsYNmBxYmfopcZJGV7pqxOf1pmaElCEnp686l9P6v+y4kkZZGGVWnyu/CXJUk68kPQgQjgMryG52N4vQD/GIxEwElFsUeZQtK6NHh4f9xTzQnqFH7R2UpJUuVrPyCp2isU1E4kVA+F1AyHdZ5OyzSbknRoeYcDzAA7wCoQ9rwroAXsfgIdia0pCy1RlwAAAABJRU5ErkJggg==";
var mirrordoticon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACGSURBVBiVjZAxDsMgFEOdqnfI3kOkW/dsHIazkb1i6cARiFjDIfK6kAiYsGTJkv+Xv78AVTRAKjS1p24w2hCwIQDE2nuqxet7HLdunBIRAU7A54zPmZMbETACkg2BxTl8zizONbqckR4axWj0BDR7722TJP3WVZKmy+hb7595vtruffTQw/++Y9bFbtqJvgAAAABJRU5ErkJggg==";
var googleicon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACzSURBVBiVYxSN+fZfLyaKgSAQjfn2nxC4pqD/nwWm4fvPfwy1s+8xbDn2loGbg4nByViQITNQmkFJipOBgYGBgQmmcO6WZwxPXv9kWNGozbCtR59BRYaLoWTqXUyrbTLP/r/16CtOq5kYcAAhz8MMQp6H4Xy4wnBnMYbaOfcZLtz+wvDy3S+G9gxlBgcjQbhCuGeSfaQYHjz/wRBRfxXumZ5sZdKDh9F5R8B/QmE9OeM+AwCkQpisMtX1uwAAAABJRU5ErkJggg==";
var networkmirroricon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs%2B9AAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABiSURBVBiVhdGxEYAgEETRGxuwEYvRBqyDTIykEzK1F%2BnnmwjjwI5u%2BOdFdwYY7QzwdTCAfo70c8zdA2z7VVpneks4koUzlSBhjSRUSMMHuXH4hhm56Qcq1MAXWhspDu7VE26kNYBvyCO2EQAAAABJRU5ErkJggg%3D%3D";
function getLeft(element) {
var left = element.offsetLeft;
var parent = element.offsetParent;
do {
left += parent.offsetLeft;
parent = parent.offsetParent;
}while(parent);
return left;
}
function getTop(element) {
var top = element.offsetTop;
var parent = element.offsetParent;
do {
top += parent.offsetTop;
parent = parent.offsetParent;
}while(parent);
return top;
}
function addIcons(node, isComment) {
// skip links to slashdot
if(/^.*\.slashdot\.org$/.test(node.host))
return;
// add container
container = document.createElement("div");
container.className = "sam_container";
node.parentNode.insertBefore(container, node.nextSibling);
// put the link in the container too
container.appendChild(node);
popup = document.createElement("div");
popup.className = "sam_popup";
container.appendChild(popup);
container.addEventListener("mousemove", function(e) {
var link = this.firstChild;
var popup = this.firstChild.nextSibling;
if(e.target.className)
return false;
/*
var linkheight = link.offsetHeight+1;
var mouseoffset = e.pageY-getTop(e.target);
var top = (Math.floor(mouseoffset/linkheight)+1)*linkheight;
// GM_log("linkheight: "+linkheight+"; mouseoffset: "+mouseoffset+"; top: "+top+";");
// GM_log("e.pageY: "+e.pageY+"; getTop(e.target): "+getTop(e.target)+";");
popup.style.top = (top-1)+"px";
*/
popup.style.top = link.offsetHeight+'px';
popup.style.left = e.pageX-getLeft(e.target)-(popup.offsetWidth/2)+"px";
}, true);
// links in comments are not cached by mirrordot or networkmirror
if(!isComment) {
//add mirrordot link
anchor = document.createElement("a");
anchor.href = "http://www.mirrordot.com/find-mirror.html?" + node.href;
anchor.title = "MirrorDot - Solving the Slashdot Effect";
anchor.className = "sam_icon sam_mirrordot";
anchor.appendChild(document.createTextNode("MirrorDot"));
popup.appendChild(anchor);
popup.appendChild(document.createElement("br"));
//### probably added in the future ###
//add networkmirror link
anchor = document.createElement("a");
//anchor.href = "http://www.networkmirror.com/" + some_page_that_redirects_to_the_mirror;
anchor.href = "http://www.networkmirror.com/";
anchor.title = "Network Mirror - In Case of Slashdotting, Break Mirror";
anchor.className = "sam_icon sam_networkmirror";
anchor.appendChild(document.createTextNode("Network Mirror"));
popup.appendChild(anchor);
popup.appendChild(document.createElement("br"));
}
//add coral cache link
anchor = document.createElement("a");
anchor.href = node.href;
anchor.host += ".nyud.net:8080";
anchor.title = "Coral - The NYU Distribution Network";
anchor.className = "sam_icon sam_coralcache";
anchor.appendChild(document.createTextNode("CoralCache"));
popup.appendChild(anchor);
popup.appendChild(document.createElement("br"));
//add google cache link
anchor = document.createElement("a");
anchor.href = "http://www.google.com/search?q=cache:" + node.href;
anchor.title = "Google Cache";
anchor.className = "sam_icon sam_google";
anchor.appendChild(document.createTextNode("GoogleCache"));
popup.appendChild(anchor);
popup.appendChild(document.createElement("br"));
}
GM_addStyle("\
a.sam_icon { \
padding-left: 15px; \
padding-top: 1px; \
background: left no-repeat; \
font-style: normal; \
font-weight: normal; \
}");
GM_addStyle("\
a.sam_icon:hover { \
opacity: 0.5; \
}");
GM_addStyle("\
a.sam_coralcache { \
background-image: url(" + coralcacheicon + "); \
}");
GM_addStyle("\
a.sam_mirrordot { \
background-image: url(" + mirrordoticon + "); \
}");
GM_addStyle("\
a.sam_google { \
background-image: url(" + googleicon + "); \
}");
GM_addStyle("\
a.sam_networkmirror { \
background-image: url(" + networkmirroricon + "); \
}");
GM_addStyle("\
div.sam_container { \
display:inline; \
position:relative; \
}");
GM_addStyle("\
div.sam_popup { \
z-index: 99; \
border: 1px solid black; \
position: absolute; \
background: lightGrey; \
-moz-border-radius: 4px; \
padding: 2px; \
left: 0px; \
top: 1.1em; \
display: block; \
width: 8em; \
visibility: hidden; \
}");
GM_addStyle("\
div.sam_container:hover > div.sam_popup { \
display: block; \
visibility: visible; \
}");
// articles
var xpath="//div[@class='article']/div[@class='body']/div[@class='intro' or @class='full']/descendant::a[starts-with(@href,'http://') or starts-with(@href,'https://')]";
var result = document.evaluate(xpath,document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);
for(var i=0; i<result.snapshotLength; i++) {
addIcons(result.snapshotItem(i), false);
}
// comments
xpath="//div[@class='commentBody']/descendant::a[starts-with(@href,'http://') or starts-with(@href,'https://')]";
result = document.evaluate(xpath,document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);
for(var i=0; i<result.snapshotLength; i++) {
addIcons(result.snapshotItem(i), true);
}