Linkify Google Search Results

When you mouseover the green url below google search results, the url is linkified

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name           Linkify Google Search Results
// @namespace      @namespace Andrew Basta
// @description    When you mouseover the green url below google search results, the url is linkified 
// @include        http://www.google.co*/*
// @version 0.0.1.20140621045118
// ==/UserScript==

//User variables
var indent = 1;			//set to 0 for no indentation animation
var marginPix = 8;		//number of pixels to indent
var marginCount = 10;	//number of steps that are run to complete indentation
var whiteSpaces = 2;	//number of whitespaces that show up between the links
var linkColor = "green";	//change to "default" if you're using a custom style and prefer to keep the native color,
							//or if you're not using a custom style but prefer blue links..or change to whatever you want.
var boldRoot = 1;		// set to 0 for no bold on the root domain of the url lists
var splitOnLoad = 0;	// set to 1 to split all the urls on pageload

//fadeInMargin Adapted from www.hesido.com 
function fadeInMargin (element){
	if (element.intFunction)
		window.clearInterval(element.intFunction);
	var count = 0;
	element.intFunction = window.setInterval(
		function() {
			element.currentWidth = easeInOut(0, marginPix, marginCount, count, 0.5);
			element.style.marginLeft = element.currentWidth+"px";
			count++;
			if (count > marginCount) {
				window.clearInterval(element.intFunction);
			}
		}
	, 5);
}

//fadeOutMargin Adapted from www.hesido.com 
function fadeOutMargin (element){
	if (element.intFunction)
		window.clearInterval(element.intFunction);
	var count = 0;
	element.intFunction = window.setInterval(
		function() {
			element.currentWidth = easeInOut(marginPix, 0, marginCount, count, 0.5);
			element.style.marginLeft = element.currentWidth+"px";
			count++;
			if (count > marginCount) {
				window.clearInterval(element.intFunction);
			}
		}
	, 8);
}

//Generic Animation Step Value Generator By www.hesido.com 
function easeInOut(minValue,maxValue,totalSteps,actualStep,powr) { 
    var delta = maxValue - minValue; 
    var stepp = minValue+(Math.pow(((1 / totalSteps) * actualStep), powr) * delta); 
    return Math.ceil(stepp) 
} 

function hover(event) { 
	var linkText = [];
	var count = 0;

	this.innerHTML = "";
	for (var i=0; i<linkListText[this.id].length; i++) {
		if (linkListText[this.id][i] != "...") {
			if (linkColor == "default")	this.innerHTML = this.innerHTML.concat("<a href=http://", linkListURL[this.id][i], ">",linkListText[this.id][i],"/</a>");
			else if ((i==0) && (boldRoot==1)) this.innerHTML = this.innerHTML.concat("<em><a href=http://", linkListURL[this.id][i], " style=color:", linkColor, ">",linkListText[this.id][i],"/</a></em>");
			else this.innerHTML = this.innerHTML.concat("<a href=http://", linkListURL[this.id][i], " style=color:", linkColor, ">",linkListText[this.id][i],"/</a>");
			
			for (var j=0; j<whiteSpaces; j++) {
				this.innerHTML = this.innerHTML.concat("&nbsp");
			}
		}
		else break;
	}		
	this.removeEventListener('mouseover', hover, false);
	this.addEventListener('mouseout', leave, false);
	if (indent)	fadeInMargin(this);
}

function splitAll() {
	var linkText = [];
	var count = 0;
	
	for (var i=0; i<linkList.length; i++) {
		linkList[i].innerHTML = "";
		for (var j=0; j<linkListText[linkList[i].id].length; j++) {
			if (linkListText[linkList[i].id][j] != "...") {
				if (linkColor == "default")	linkList[i].innerHTML = linkList[i].innerHTML.concat("<a href=http://", linkListURL[linkList[i].id][j], ">",linkListText[linkList[i].id][j],"/</a>");
				else if ((j==0) && (boldRoot==1)) linkList[i].innerHTML = linkList[i].innerHTML.concat("<em><a href=http://", linkListURL[linkList[i].id][j], " style=color:", linkColor, ">",linkListText[linkList[i].id][j],"/</a></em>");
				else linkList[i].innerHTML = linkList[i].innerHTML.concat("<a href=http://", linkListURL[linkList[i].id][j], " style=color:", linkColor, ">",linkListText[linkList[i].id][j],"/</a>");
				
				for (var k=0; k<whiteSpaces; k++) {
					linkList[i].innerHTML = linkList[i].innerHTML.concat("&nbsp");
				}
			}
			else break;
		}
	}
}


//contains from mike hall, brainjar.com
function contains(a, b) {
  // Return true if node a contains node b.
  while (b.parentNode)
    if ((b = b.parentNode) == a)
      return true;
  return false;
}

//leave adapted from mike hall, brainjar.com
//basically, this makes sure that the link you just moused out of was the last link moused into...
function leave(event) {
	if (window.event) {
		current = this;
		related = window.event.toElement;
	}
	else {
		current = event.currentTarget;
		related = event.relatedTarget;
	}

	if (current != related && !contains(current, related)) {
		this.textContent = linkListOrig[this.id];
		this.removeEventListener('mouseout', leave, false);
		this.addEventListener('mouseover', hover, false);
		if (indent) fadeOutMargin(this);
	}
}

var currentLink;
var linkList = document.getElementsByTagName('cite'); //gets all the green urls
var linkListText = [];	// holds the split text of the green url
var linkListOrig = [];	// holds a copy of the original green url
var linkListURL = [];	// holds the urls of all individual links

for (var i=0; i<linkList.length; i++) {
	//Indices of extraneous clutter, i.e. size of linked document and preceding http:// in green url.  I don't like those.
	var trim0 = linkList[i].textContent.indexOf("://"); 
	var trim1 = linkList[i].textContent.indexOf(" - ");
	var trim2 = linkList[i].textContent.indexOf("/ - ");
	var trim3 = linkList[i].textContent.indexOf("/.../");
	var slashTest = linkList[i].textContent.indexOf("/");

	linkList[i].id = i;

	if(linkList[i].nextSibling != null && slashTest > -1) { //make sure the url has /'s in it..this is where i split it up
		//Trimming the extraneous clutter here...
		if(trim1>-1){
			linkListText[i] = linkList[i].textContent.substring((trim0==-1)?0:(trim0+3),((trim1==(trim2+1))?trim2:trim1));
			linkListOrig[i] = linkList[i].textContent.substring((trim0==-1)?0:(trim0+3),((trim1==(trim2+1))?(trim2+4):(trim1+3)));
			linkListURL[i] = linkList[i].textContent.substring((trim0==-1)?0:(trim0+3),((trim1==(trim2+1))?trim2:trim1));
			}
		else {
			linkListText[i] = linkList[i].textContent;
			linkListOrig[i] = linkList[i].textContent;
			linkListURL[i] = linkList[i].textContent;
		}
		
		if (trim3 > -1) {
			linkListText[i] = linkList[i].textContent.substring(0,trim3);
			linkListOrig[i] = linkList[i].textContent.substring(0,trim3);
			linkListURL[i] = linkList[i].textContent.substring(0,trim3);
		}
		
		linkList[i].textContent = linkListOrig[i];	//Copy the original green url for safekeeping

		linkListText[i] = linkListText[i].split("/"); //Split up the url
		linkListURL[i] = linkListURL[i].split("/");   //Split up the url

		//Concatenate the individual links to new urls...
		for (var j=0; j<linkListURL[i].length; j++)
		{
			if (j>0) {
				if (linkListURL[i][j] != null) linkListURL[i][j] = linkListURL[i][j-1].concat("/",linkListURL[i][j]);
			}
		}

		if(!splitOnLoad) linkList[i].addEventListener('mouseover', hover, false);
	}
	//If there are /'s in the original url, make sure that it's a valid link, and not just green text that google threw in (like for adverts and such)
	else if (slashTest > -1 || (linkList[i].nextSibling != null && linkList[i].nextSibling.tagName ==  "BR")) {
		linkListText[i] = linkList[i].textContent;
		linkListOrig[i] = linkList[i].textContent;
		linkListURL[i] = linkList[i].textContent;
		
		linkList[i].textContent = linkListOrig[i];

		linkListText[i] = linkListText[i].split("/");
		linkListURL[i] = linkListURL[i].split("/");
		
		for (var j=0; j<linkListURL[i].length; j++)
		{
			if (j>0) {
				if (linkListURL[i][j] != null) linkListURL[i][j] = linkListURL[i][j-1].concat("/",linkListURL[i][j]);
			}
		}
		
		if(!splitOnLoad) linkList[i].addEventListener('mouseover', hover, false);
	}
	else {	
		linkListText[i] = linkList[i].textContent;
		linkListOrig[i] = linkList[i].textContent;
		linkListURL[i] = linkList[i].textContent;
		
		linkListText[i] = linkListText[i].split("/");
		linkListURL[i] = linkListURL[i].split("/");
		
		for (var j=0; j<linkListURL[i].length; j++)
		{
			if (j>0) {
				if (linkListURL[i][j] != null) linkListURL[i][j] = linkListURL[i][j-1].concat("/",linkListURL[i][j]);
			}
		}
		
		if(!splitOnLoad) linkList[i].addEventListener('mouseover', hover, false);
	}
}

if(splitOnLoad)	{
	splitAll();
}