// ==UserScript== // @name GoogleTagCloudMaker for SeaHorse // @namespace http://d.hatena.ne.jp/muddydixon/ // @author Muddy Dixon // @include http://www.google.*/search* // @exclude http://www.google.co.jp/hws/* // @description Make Tag Cloud from Google search result. // @version 0.1.2 // ==/UserScript== // modified for seahorse by 958 // Released under the GPL license // http://www.gnu.org/copyleft/gpl.html // @data 2006-10-11 This file is created // @todo the case search query include "" (quoted words) // @todo the case Japanese cannot be used by bwosere. // @data 2006-10-26 Change below points // set navi-bar in tag cloud // navi-bar has less than 3 links. (1) backword, (2) clear items, (3) forward. // @data 2006-11-07 Change below points // highlight onmouse keywords in tag cloud // clean source file (@getText()) // @data 2007-02-07 Change below points // error occurs when kwd is native code of javascript (e.g. pop, push) // error occurs when there is not next page // @data 2007-03-20 Add NG words of German language and revice the case that there is no content. (function(){ /*@cc_on _d=document;eval('var document=_d')@*/ var base = 'http://'+location.host+'/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&num=50&'; var minusOperation = 2; // 1:Shift+Click 2:RightClick var doHilight = false; var cloudWidth = "25%"; var gs = new Array(); var kwd2item = new Array(); var maxfontsize = 1; var baseElm = null; if (doHilight) { var input = document.forms(0).elements("q"); if (input == null) input = document.forms(0).elements("search"); if (input == null) input = document.forms(0).elements("yschsp"); input.value = input.value.replace(/ +/g, " ").replace(/\s+/g, " "); var keywords = input.value.split(" "); var colors = new Array(6); colors[0] = "#ffff00"; colors[1] = "#00ffff"; colors[2] = "#ff88ff"; colors[3] = "#33ff33"; colors[4] = "#8888ff"; colors[5] = "#ff8833"; var btag = document.all.tags("b"); for (var i = 0, lenI = keywords.length; i < lenI; i++) { re = RegExp(keywords[i].replace(/\"/g, "").replace(/([+*?.{}|\[\]$^])/g, function(str, p){return "\\" + p}), "i"); for (var j = 0, lenJ = btag.length; j < lenJ; j++) if (btag[j].innerText != null && re.test(btag[j].innerText)) btag[j].style.backgroundColor = colors[i % colors.length]; } } //separator var sep = ' ' + unescape('%u3000'); //emchar var emchar = new Array(); emchar['digit'] = unescape('%uFF10-%uFF19'); emchar['cChar'] = unescape('%uFF21-%uFF3A'); emchar['lChar'] = unescape('%uFF41-%uFF5A'); emchar['hKana'] = unescape('%u3042-%u3093'); emchar['kKana'] = unescape('%u30A1-%u30F4%u30FC'); emchar['kanji'] = unescape('%u4E00-%u9FA0'); emchar['other'] = unescape('%u2015%uFF1D%uFF0B%uFF01%uFF1F'); //NG word var exclude = 'above about add agree all allow also an and any are as at be below between but by can cant contain correspondingly der die das ein eine er sie es descriptions do doesnt each either entirely first following for found from full fully get getting has have higher how if in include included includes including is it least less made make making may modify more most must need new no non not of on only or other otherwise our particular partially party per please prior right same see shall should similar some specifies specify such than that the their there these third this to try two under us use used using via visit want way we what when where which will with within without would you your youre wc sp co jp org com net ac ne de us uk since gt lt amp co jp '+unescape('%u3053%u308C %u3042%u308C %u305D%u308C %u3069%u308C %u3053%u306E %u305D%u306E %u3042%u306E %u3069%u306E %u3053%u3053 %u305D%u3053 %u3042%u305D%u3053 %u3069%u3053 %u3053%u3061%u3089 %u3042%u3061%u3089 %u305D%u3061%u3089 %u3069%u3061%u3089'); //make NG words var ngExp = eval('/^('+exclude.split(/[ ]/g).join(')$|^(') + ')$/i'); /************************************************************ * sub routines ************************************************************/ /************************************************************ * definition of getElementsByClass */ document.getElementsByClass = function (searchClass) { if (document.all) { var classElements = new Array(); var allElements = document.all; for (var i = 0, j = 0, len = allElements.length; i < len; i++) { if (allElements[i].className == searchClass) { classElements[j] = allElements[i]; j++; } } } else if (document.getElementsByTagName) { var classElements = new Array(); var allElements = document.getElementsByTagName('*'); for (var i = 0, j = 0, len = allElements.length; i < len; i++) { if (allElements[i].className == searchClass) { classElements[j] = allElements[i]; j++; } } } else return; return classElements; } /************************************************************ * get all text in element */ var getText = function(g){ //comment out // g.innerHTML = g.innerHTML.replace(//, ''); // g.title = g.innerHTML.match(/(.+?<\/span>.+?)?(.+?)<\/a>/)[2]; // g.gtm_title = g.getElementsByTagName('h2')[0].getElementsByTagName('a')[0].innerText; g.gtm_title = g.firstChild.innerText; // g.title = g.title.replace(/(.+?)<\/b>/g, function($0){return $0.replace(/<.+?>/g, '');}); // g.body = (g.innerHTML.match(/(.+?)
(.+?)
.*/i, ''); g.body = g.body.replace(/<.+?>(.+?)<\/.+?>/g, function($0){return $0.replace(/<.+?>/g, '');}); return g; } /************************************************************ * add keywords for array */ var pushKwd = function(kwd, id){ //if kwd is not registered if(!kwd2item[kwd] || typeof(kwd2item[kwd]) == 'function'){ kwd2item[kwd] = new Array(); kwd2item[kwd][id] = 1; kwd2item[kwd]['sum'] = 1; } //if kwd has been registered else{ if(!kwd2item[kwd][id]) kwd2item[kwd][id] = 0; kwd2item[kwd][id]++; kwd2item[kwd]['sum']++; maxfontsize = (maxfontsize > kwd2item[kwd]['sum']) ? maxfontsize : kwd2item[kwd]['sum']; } } /************************************************************/ /* get search queries */ /* return Array */ var getSearchQuery = function(){ var qs = document.getElementsByTagName('input'); for(var i = 0, len = qs.length; i < len; i++){ if(qs[i].name.match(/^q$/)){ var str = qs[i].value; str = str.replace(/\//g, '\\/'); // str = str.replace(/([\+\-\.\?\!\=\^\$])/g, function($0){ return '\\'+$0;}); str = str.replace(/([\+\.\?\!\=\^\$])/g, function($0){ return '\\'+$0;}); str = str.replace(/\"/g, ''); eval('str = str.replace(/(['+emchar['cChar']+emchar['lChar']+emchar['digit']+'])/g, function($0){ return String.fromCharCode($0.charCodeAt(0) - 65248);})'); // return eval('str.split(/['+sep+']+/)'); eval('var strs = str.split(/['+sep+']+/)'); for (var j = 0, lenJ = strs.length; j < lenJ; j++) strs[j] = encodeURIComponent(strs[j]); return (strs); } } } //get search query var sqExp = eval('/^('+getSearchQuery().join(')$|^(')+')$/i'); /************************************************************ * get key words from strings */ var getKeys = function(id, g){ //get candidates of keyword var matchStr = '(g.gtm_title+\' \'+g.body).match(/' + '['+emchar['digit']+']+|' + '['+emchar['cChar']+']+|' + '['+emchar['lChar']+']+|' + // '['+emchar['hKana']+']+|' + '['+emchar['kKana']+']+|' + '['+emchar['kanji']+']+|' + '[a-zA-Z0-9\\\-\\\_]+/g)'; var t_kwords = eval(matchStr); for(var i = 0, len = t_kwords.length; i < len; i++){ //make lower case var t_kword = t_kwords[i].toLowerCase(); var rep = '/(['+emchar['cChar']+emchar['lChar']+emchar['digit']+']+)/'; t_kword = t_kword.replace(rep, function($0){ return String.fromCharCode($0.charCodeAt(0) - 65248);}); //exclude NG word||one char||only digit||search query and register key words if(!(t_kword.match(ngExp, 'g') || //NG word t_kword.match(/^.$/) || //one char t_kword.match(/^[\d\-\+\!\=]+$/)|| //only digit t_kword.match(sqExp) //search query )) pushKwd(t_kword, id); } } /************************************************************ * show kwd2item */ var showKwd2Item = function(){ var ka, kb; var str = '' for(var ka in kwd2item) for(var kb in kwd2item[ka]) if(!kb.match(/sum/)) if(kwd2item[ka][kb] >= 1) str = str + ka + '=>' + kb + '(' +kwd2item[ka][kb] + ')\n'; alert('keywords is\n'+str); } /************************************************************ * highlight selected keyword */ var highlightKeyword = function(kwd){ var kws = document.getElementById('cloud').childNodes; for(var i = 1, len = kws.length; i < len; i++) kws[i].style.color = ''; if(kwd) kwd.style.color = 'red'; } /************************************************************ * rearray items */ var reArrayItems = { target : null, timeout : null, reArrayOn : function(){ this.target = event.srcElement; clearTimeout(this.timeout); this.timeout = setTimeout( function(){ try{ if(this.target.id.match(/^clear$/)){ highlightKeyword(); // var parent = document.getElementById('p_node'); var parent = baseElm; var children = parent.getElementsByTagName('li'); for(var i = 0, len=children.length; i < len ; i++){ var child = document.getElementById(i); child.style.backgroundColor = '#ffffff'; parent.removeChild(child); parent.insertBefore(child, null); } }else{ highlightKeyword(this.target); // var parent = document.getElementById('p_node'); var parent = baseElm; for(var i = 0, len=parent.getElementsByTagName('li').length; i < len; i++){ if(kwd2item[this.target.id][i]){ var child = document.getElementById(i); child.style.backgroundColor = '#dfdfdf'; parent.removeChild(child); parent.insertBefore(child, parent.firstChild); }else{ var child = document.getElementById(i); child.style.backgroundColor = '#ffffff'; parent.removeChild(child); parent.insertBefore(child, null); } } } }catch(e){ // alert("Exception: " + e); } }, //400msec 400); }, //reset time counter reArrayOff : function(e){ clearTimeout(this.timeout); }, minus : function() { if ((event.srcElement.tagName.toLowerCase() == 'a') && ((minusOperation == 1) ? (event.shiftKey) : true)) { location.href = base+'q='+getSearchQuery().join('+') + "+-" + encodeURIComponent(target.id); event.returnValue = false; } } } /************************************************************ * make TagCloud */ var makeTagCloud = function(){ if (document.getElementById('cloud') != null) document.removeChild(document.getElementById('cloud')); var cloud = document.createElement('div'); cloud.setAttribute('id', 'cloud'); cloud.style.width = cloudWidth; cloud.style.border = 'solid 1px #0000cc'; cloud.style.backgroundColor = '#e5ecf9'; cloud.style.position = 'relative'; cloud.style.styleFloat = 'right'; cloud.style.marginTop = '10px'; cloud.style.padding = '5px'; cloud.style.wordSpacing = '10px'; cloud.style.lineHeight = '200%'; cloud.insertBefore(createNavi(), null); for(var ka in kwd2item){ if(kwd2item[ka]['sum'] > 1){ var item = document.createElement('a'); // item.setAttribute('href', base+'?q='+getSearchQuery().join('+') + "+" + ka); item.setAttribute('href', base+'q='+getSearchQuery().join('+') + "+" + encodeURIComponent(ka)); item.setAttribute('class', 'keyword'); item.setAttribute('id', ka); item.style.fontSize = Math.floor(kwd2item[ka]['sum'] / maxfontsize * 12 + 8) + "pt"; item.style.textDecoration = 'none'; item.insertBefore(document.createTextNode(ka + '(' + kwd2item[ka]['sum'] + ') '), null); cloud.insertBefore(item, null); } } // cloud.insertBefore(document.getElementById('navbar'), null); return cloud; } /************************************************************ * add mouse event to each keyword */ var addKeywordEvents = function() { var cloud = document.getElementById('cloud'); var ks = cloud.childNodes; for (var i = 0, len = ks.length; i < len; i++) { if(!ks[i].tagName.match(/div/i)){ ks[i].attachEvent('onmouseover', reArrayItems.reArrayOn); ks[i].attachEvent('onmouseout', reArrayItems.reArrayOff); if (minusOperation == 1) { ks[i].attachEvent('onclick', reArrayItems.minus); } else { ks[i].attachEvent('oncontextmenu', reArrayItems.minus); } } } var clear = document.getElementById('clear') clear.attachEvent('onmouseover', reArrayItems.reArrayOn); clear.attachEvent('onmouseout', reArrayItems.reArrayOff); } /************************************************************/ /* search sponsor menu and return that object if there is */ /* but now sponsor menu is judged according to two attribute*/ var getSponsorSite = function(){ var ts = document.body.getElementsByTagName('table'); for(var i = 0, len = ts.length; i < len; i++){ if(ts[i].getAttribute('width') == '25%' && ts[i].getAttribute('align').toLowerCase() == 'right'){ ts[i].setAttribute('id', 'sponsor'); return ts[i]; } } return null; } /************************************************************/ /* get top div of search results */ var getTopSearchRes = function(){ return document.getElementById('res'); } /************************************************************/ /* create Next and Back Navigator */ var createNavi = function(){ var div = document.createElement('div'); if(document.getElementById('nn')){ var nn = document.createElement('a'); nn.setAttribute('href', document.getElementById('nn').parentNode.getAttribute('href')); nn.insertBefore(document.createTextNode('Next>>'), null); nn.style.textDecoration = 'none'; nn.style.color = '#000000'; nn.style.backgroundColor = '#999999'; nn.style.position = 'relative'; nn.style.styleFloat = 'right'; div.insertBefore(nn, null); } var np = document.createElement('a'); if(document.getElementById('np')) np.setAttribute('href', document.getElementById('np').parentNode.getAttribute('href')); else np.style.display = 'none'; np.insertBefore(document.createTextNode('<