From 77de05f977c5dfaf03d2c29a31dab7fdf31d2df9 Mon Sep 17 00:00:00 2001 From: Jason Woofenden Date: Sat, 23 Jan 2010 06:39:17 -0500 Subject: [PATCH] numbered links in google chrome! --- Makefile | 9 ++ digg_sponsered.user.js | 27 ++++ numbered_links.user.js | 318 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 354 insertions(+) create mode 100644 Makefile create mode 100644 digg_sponsered.user.js create mode 100644 numbered_links.user.js diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ae1742c --- /dev/null +++ b/Makefile @@ -0,0 +1,9 @@ +all: usage + +usage: + @echo '"make install" to copy into google chrome extensions. if you change' + @echo "the sites it affects or anything you'll have to re-add it to chrome" + @echo "manually. (go to file:///home/blah/blah/blah)" + +install: + cp numbered_links.user.js $(HOME)/config/google-chrome/Default/Extensions/nbhpmaoejlnohbchnhamgfeekimhkoma/1.0/script.js diff --git a/digg_sponsered.user.js b/digg_sponsered.user.js new file mode 100644 index 0000000..b3eb289 --- /dev/null +++ b/digg_sponsered.user.js @@ -0,0 +1,27 @@ +/* +* written by JasonWoof 2009 public domain +*/ + +// ==UserScript== +// @name kill digg "sponsored digg" +// @namespace http://patcavit.com/greasemonkey +// @description digg's sponsored diggs look way too much like content +// @include http://digg.com/* +// ==/UserScript== + +(function() +{ + var divTags; + if((divTags = document.getElementsByTagName("DIV"))) { + for(var a=0; a window.pageYOffset && (left + width) > window.pageXOffset; +} +//Removes all hints/leftovers that might be generated +//by this script. +function removeAllHints() { + var elements = doc.getElementById(uzbldivid); + if (elements) { + elements.parentNode.removeChild(elements); + } +} +//Generate a hint for an element with the given label +//Here you can play around with the style of the hints! +function generateHint(el, label) { + var pos = elementPosition(el); + var hint = doc.createElement('div'); + hint.setAttribute('name', uzblid); + hint.innerText = label; + hint.style.display = 'inline'; + hint.style.backgroundColor = '#B9FF00'; + hint.style.border = '2px solid #4A6600'; + hint.style.color = 'black'; + hint.style.fontSize = '9px'; + hint.style.fontWeight = 'bold'; + hint.style.lineHeight = '9px'; + hint.style.margin = '0px'; + hint.style.width = 'auto'; // fix broken rendering on w3schools.com + hint.style.padding = '1px'; + hint.style.position = 'absolute'; + hint.style.zIndex = '1000'; + hint.style.textTransform = 'uppercase'; + hint.style.left = Math.max(-1, (pos[1] - (7 + label.length * 9))) + 'px'; + hint.style.top = (pos[0] + 1) + 'px'; + var img = el.getElementsByTagName('img'); + //if (img.length > 0) { + //hint.style.top = pos[1] + img[0].height / 2 - 6 + 'px'; + //} + hint.style.textDecoration = 'none'; + // hint.style.webkitBorderRadius = '6px'; // slow + return hint; +} +//Here we choose what to do with an element if we +//want to "follow" it. On form elements we "select" +//or pass the focus, on links we try to perform a click, +//but at least set the href of the link. (needs some improvements) +function clickElem(item) { + removeAllHints(); + if (item) { + var name = item.tagName; + if (name == 'A') { + item.click(); + window.location = item.href; + } else if (name == 'INPUT') { + var type = item.getAttribute('type').toUpperCase(); + if (type == 'TEXT' || type == 'FILE' || type == 'PASSWORD') { + item.focus(); + item.select(); + } else { + item.click(); + } + } else if (name == 'TEXTAREA' || name == 'SELECT') { + item.focus(); + item.select(); + } else { + item.click(); + window.location = item.href; + } + } +} +//Returns a list of all links (in this version +//just the elements itself, but in other versions, we +//add the label here. +function addLinks() { + res = [[], []]; + for (var l = 0; l < links.length; l++) { + var li = links[l]; + if (isVisible(li) && elementInViewport(li)) { + res[0].push(li); + } + } + return res; +} +//Same as above, just for the form elements +function addFormElems() { + res = [[], []]; + for (var f = 0; f < forms.length; f++) { + for (var e = 0; e < forms[f].elements.length; e++) { + var el = forms[f].elements[e]; + if (el && ['INPUT', 'TEXTAREA', 'SELECT'].indexOf(el.tagName) + 1 && isVisible(el) && elementInViewport(el)) { + res[0].push(el); + } + } + } + return res; +} +//Draw all hints for all elements passed. "len" is for +//the number of chars we should use to avoid collisions +function reDrawHints(elems, chars) { + removeAllHints(); + var hintdiv = doc.createElement('div'); + hintdiv.setAttribute('id', uzbldivid); + for (var i = 0; i < elems[0].length; i++) { + if (elems[0][i]) { + var label = elems[1][i].substring(chars); + var h = generateHint(elems[0][i], label); + hintdiv.appendChild(h); + } + } + if (document.body) { + document.body.appendChild(hintdiv); + } +} +// pass: number of keys +// returns: key length +function labelLength(n) { + var oldn = n; + var keylen = 0; + if(n < 2) { + return 1; + } + n -= 1; // our highest key will be n-1 + while(n) { + keylen += 1; + n = Math.floor(n / charset.length); + } + return keylen; +} +// pass: number +// returns: label +function intToLabel(n) { + var label = ''; + do { + label = charset.charAt(n % charset.length) + label; + n = Math.floor(n / charset.length); + } while(n); + return label; +} +// pass: label +// returns: number +function labelToInt(label) { + var n = 0; + var i; + for(i = 0; i < label.length; ++i) { + n *= charset.length; + n += charset.indexOf(label[i]); + } + return n; +} +//Put it all together +function followLinks(follow) { + if(follow.charAt(0) == 'l') { + follow = follow.substr(1); + charset = 'thsnlrcgfdbmwvz-/'; + } + var s = follow.split(''); + var linknr = labelToInt(follow); + var linkelems = addLinks(); + var formelems = addFormElems(); + var elems = [linkelems[0].concat(formelems[0]), linkelems[1].concat(formelems[1])]; + var len = labelLength(elems[0].length); + var oldDiv = doc.getElementById(uzbldivid); + var leftover = [[], []]; + if (s.length == len && linknr < elems[0].length && linknr >= 0) { + clickElem(elems[0][linknr]); + got = ''; + active = 0; + } else { + for (var j = 0; j < elems[0].length; j++) { + var b = true; + var label = intToLabel(j); + var n = label.length; + for (n; n < len; n++) { + label = charset.charAt(0) + label; + } + for (var k = 0; k < s.length; k++) { + b = b && label.charAt(k) == s[k]; + } + if (b) { + leftover[0].push(elems[0][j]); + leftover[1].push(label); + } + } + reDrawHints(leftover, s.length); + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + var active = 0; + var got = ''; + document.addEventListener( + 'keypress', + function(e) { + if(e.keyCode == 96) { // change this if you want a different activation key + if(active) { + got = ''; + removeAllHints(); + } else { + followLinks(got); + } + active = 1 - active; + return; + } else { + if(active == 1) { + got += String.fromCharCode(e.keyCode); + followLinks(got); + } + } + }, + true); +})(); -- 1.7.10.4