// ==UserScript== // @name - Snap Links - for opera // @author - Ayush // @version - 1.4.9 // @description - Select the links by drawing a box around links then leave the mousebutton to open the links in that box/region. // Hold -Shift- key to select all links in rectangle and hold down -Alt- key while dragging to move rectangle. Hold Ctrl to select duplicate urls // You can change the tab opening behaviour(in background tab,in new window etc.) by changing the Middle-Click settings (Shift+Middle-Click in opera) // ==/UserScript== //code based on ff extension but improved (function(opera,getSelection,addEventListener,selNode,getBoundingClientRect,window){var //..// showStatus=1 , // show # of selected links in status bar selAllLinks=0, // select all links dupLinks=0, // select duplicate links (links with same href) inSameTab=0, // open the first or last link in same tab: 1=first link in same tab , -1=last link in same tab , 0=open all in new tabs reqAltKey=0, // run script only when alt key is pressed rectBorder='2px dashed #1E90FF', rectBG='transparent', linksOutline='1px solid #ef0006' //..// ;var mdown,outRect,elms,mdElm,updateTimeout,visElms,x,y,x2,y2,ctKey,shKey,scrTm,visMinY=-1,visMaxY=-1,docMaxX,docMaxY,winFocused=1, lastTp, events={ mousedown:function(ev){ if(ev.dynamicEvent)return; sl.clear(0,0,1); if(ev.which!==1 || ev.altKey!=reqAltKey || selNode.call(ev.target,'ancestor-or-self::node()[contains(",input,textarea,img,button,select,a,",concat(",",local-name(),",")) and (local-name()!="a" or @href)]'))return; x=x2=ev.pageX;y=y2=ev.pageY; //docMaxX=getComputedStyle(document.documentElement).width;docMaxY=getComputedStyle(document.documentElement).height; mdElm=[ev.srcElement];mdElm.push(mdElm[0].offsetLeft,mdElm[0].offsetTop,mdElm[0].offsetWidth,mdElm[0].offsetHeight); var cSty,pos;if((mdElm[0].tagName!='BODY' && mdElm[0].tagName!='HTML') && ((cSty=getComputedStyle(mdElm[0],null)).overflow!='visible' && cSty.overflow!='hidden') && ((((pos=sl.getPos(mdElm[0])).x+parseInt(cSty.borderLeftWidth,10)+mdElm[0].clientWidth)ev.pageX) || ((pos.y+parseInt(cSty.borderTopWidth,10)+mdElm[0].clientHeight)ev.pageY)))return; mdown=1; }, mousemove:function(ev){ if(!mdown)return; if(reqAltKey!=ev.altKey) if(!reqAltKey){ x+=ev.pageX-x2; y+=ev.pageY-y2; }else return(sl.clear()); x2=ev.pageX; y2=ev.pageY; ctKey=ev.ctrlKey;shKey=ev.shiftKey; var rect=sl.getRealXY([x,x2],[y,y2]); if(!outRect){ if( reqAltKey || ((rect.x[1]-rect.x[0])>4 && (rect.y[1]-rect.y[0])>10 && !getSelection().rangeCount)){ if(winFocused && mdElm && mdElm[1]==mdElm[0].offsetLeft && mdElm[2]==mdElm[0].offsetTop && mdElm[3]==mdElm[0].offsetWidth && mdElm[4]==mdElm[0].offsetHeight) sl.createRect(); else return sl.clear(0,0,1); }else return; }; if(getSelection().rangeCount)getSelection().removeAllRanges(); sl.setRectSize(rect,docMaxX,docMaxY) if(!updateTimeout) updateTimeout=setTimeout(function(){updateTimeout=null;sl.selLinks()},66); }, mouseup:function(ev){ if(ev.which===1 && mdown){ var linksOpened; ev.preventDefault();//ev.stopPropagation(); sl.selLinks(); if(elms && (!reqAltKey || ev.altKey)){ var mEv=document.createEvent('MouseEvent');mEv.initMouseEvent('mousedown',0,0,document.defaultView,1,0,0,0,0,0,0,0,0,1,null);mEv.dynamicEvent=1; for(var iX=0,elm,link=!inSameTab?0:(inSameTab==-1?elms.pop():elms.shift());elm=elms[iX];iX++){ elm.dispatchEvent(mEv); elm.style.outline="none"; } if(linksOpened=(iX && showStatus)){ window.status=iX+" link" + (iX>1?'s':'') + " opened"; setTimeout(function(){status=''},1456); } if(link){ sl.clear();location.href=link.href;return } } sl.clear(0,0,linksOpened); } }, keydown:function(ev){ if(!mdown)return var kc=ev.keyCode; if(kc==16) shKey=1; else if(kc==17) ctKey=1; else{ if(kc==27) sl.clear(); //ev.preventDefault(); return }; sl.selLinks(); }, keyup:function(ev){ if(!mdown)return; var kc=ev.keyCode; if(kc==16) shKey=0; else if(kc==17) ctKey=0; else return; sl.selLinks(); }, scroll:function(){ if(mdown && outRect){ if(scrTm)clearTimeout(scrTm); scrTm=setTimeout(function(){ if(mdown)sl.createRect(lastTp,0,0,visElms,1); sl.selLinks() },66+6); } }, blur:function(){ winFocused=0; }, focus:function(){ winFocused=1; } }, sl={ clear:function(noOutRect,noElms,noStat,noMDown){ if(!noOutRect){ if(outRect){ outRect.parentNode.removeChild(outRect); outRect=null; } if(!noMDown)mdown=ctKey=shKey=mdElm=0; }; if(!noElms && elms){ for(var iX=0;iXvisMaxY){ minY=visMaxY visMaxY=maxY; }else return; var elms=loopElms||document.links,i=0,elm;visElms=addToElms||visElms||{sizes:[],elms:[],pos:[]}; var eSty,elFS,pos; var iX=0,cLnk,vEls=visElms.elms; wOLoop:while(elm=elms[i++]){ if(addToElms)while(cLnk=vEls[iX++])if(cLnk==elm)continue wOLoop; eSty=getComputedStyle(elm,null); if(eSty.visibility=="hidden")continue; pos=sl.getPos(elm); if( pos.y2maxY || pos.y2==pos.y || pos.x2==pos.x) continue; if((eSty=eSty.fontSize).indexOf('px')!=-1)elFS=parseFloat(eSty);else elFS=0; visElms.sizes.push(elFS);visElms.elms.push(elm);visElms.pos.push(pos); }; lastTp=loopElms; }, setRectSize:function(rect,maxX,maxY,oRect){ var tmpsty=(oRect||outRect).style; if(!maxX || rect.x[1] Y2 || eY2 < Y || eX2 < X ||eX > X2); if(elNotInRect || (!DupLinks && (Elm.href in dLinkStr))){ Elm.style.outline=""; }else{ if(!allLinks){ if(largSz>sz){ Elm.style.outline=""; continue }else if(largSz