Skip to content

Instantly share code, notes, and snippets.

@alpicola
Created January 19, 2009 13:59
Show Gist options
  • Select an option

  • Save alpicola/49002 to your computer and use it in GitHub Desktop.

Select an option

Save alpicola/49002 to your computer and use it in GitHub Desktop.
// ==UserScript==
// @name Google Search Filter
// @description Selected web-sites aren't displayed from Google search result.
// @version 2.2.6
// @author Shinya
// @namespace http://www.code-404.net/
// @homepage http://userscripts.org/scripts/show/12643
// @include http://www.google.*/search*
// @require http://gist.github.com/3242.txt
// ==/UserScript==
/* == The Original Script Copyright =========
* Written by leva.
* http://note.openvista.jp/212/
*
* Released under the CCL by-nc-na ja license.
* http://creativecommons.org/licenses/by-nc-sa/2.1/jp/
/* ======================================= */
// Therefore, the license of this script is under the CCL by-nc-na ja license, too.
(function(){
var SearchFilter = {
// == Config ==================
// Default blocked sites
// CAUTION: Script DO NOT use this list if you used "Filters Editor".
filters: [
"*.basefeed.net",
"*.designiddatabase.net",
"*.designlinkdatabase.net",
"*.designrecipedatabase.net",
"*.goo.ne.jp/search",
"*.pg-feed.com",
"*.rightclicksright.net",
"*.swik.net",
"*.thatsping.jp",
"*.thumbnailcloud.net",
"1470.net",
"208.71.106.69",
"a.hatena.ne.jp",
"basefeed.net",
"bookmark.fc2.com",
"bookmarks.yahoo.co.jp",
"bugzero.shooti.jp",
"buzzurl.jp",
"clip.livedoor.com",
"clip.nifty.com",
"del.icio.us",
"delicious.com",
"dlinkbring.com",
"faves.com",
"feedraider.com",
"friendfeed.com",
"hirashi.mydns.jp",
"inezha.com",
"kago.in",
"kizasi.jp",
"mark.jolt.jp",
"minna.topics.yahoo.co.jp",
"okweb.ne.jp",
"okyuu.com",
"oshiete(1|).goo.ne.jp",
"pookmark.jp",
"psearch.yahoo.co.jp",
"qanda.rakuten.ne.jp",
"r.hatena.ne.jp",
"seiren-udoku.com",
"soudan1.biglobe.ne.jp",
"swik.net",
"technorati.com",
"technorati.jp",
"thatsping.jp",
"www.flog.jp",
"www.hackjob.org",
"www.inezha.com",
"www.iza.ne.jp",
"www.tagli.org",
"zuvat.com"
],
// Default blocked hidden mode
hidden: false,
// Font color(CSS's value)
fontColor: "#999",
// Font size(CSS's value)
characterSize: "90%",
// Use "Filters Editor"
useEditor: true,
// == Config end ==============
list: [],
init: function(){
Language.init();
SearchFilter.hidden = GM_getValue("mode", SearchFilter.hidden);
SearchFilter.list = eval(GM_getValue("filter")) || SearchFilter.filters.sort();
if(SearchFilter.useEditor) EditFilter.init();
SearchFilter.doFiltering($X("//li[@class='g']"));
addFilter(function(elm){
SearchFilter.doFiltering($X(".//li[@class='g']", elm[0]));
});
},
doFiltering: function(results){
for(var i = 0, l = results.length; i < l; i++){
var anchor = $X(".//a[@class='l']", results[i])[0];
if(SearchFilter.useEditor) EditFilter.createLink(results[i], anchor);
for(var j = 0, b = SearchFilter.list.length; j < b; j++){
var regexp = SearchFilter.createRegExp(SearchFilter.list[j]);
if(anchor.href.match(regexp) != null){
if(SearchFilter.hidden){
results[i].style.display = "none";
}
else{
anchor.style.color = SearchFilter.fontColor; // for other scripts
var headline = $X("./h3[@class='r']", results[i])[0];
headline.style.color = SearchFilter.fontColor;
headline.style.fontSize = SearchFilter.characterSize;
$X("./div[contains(concat(' ', @class, ' '), ' s ')]", results[i])[0].style.display = "none";
}
}
}
}
},
createRegExp: function(filter){
return new RegExp("^https?:\/\/" + filter.replace(".", "\.", "g").replace("*", ".*", "g"), "i");
},
}
var EditFilter = {
list: [],
filter: "",
timer: null,
init: function(){
EditFilter.list = eval(SearchFilter.list.toSource());
var place = $X("id('sft')//td[@class='nobr xsm']")[0];
place.parentNode.style.position = "relative";
place.appendChild(document.createElement("br"));
var link = document.createElement("a");
link.setAttribute("href", "#");
link.appendChild(document.createTextNode(Language[Language.lang].config));
link.addEventListener("click", EditFilter.toggleDisplayList, false);
place.appendChild(link);
var field = document.createElement("div");
field.id = "google-search-filter";
field.style.position = "absolute";
field.style.top = place.parentNode.offsetTop + place.parentNode.offsetHeight + 10;
field.style.right = "8px";
field.style.width = place.parentNode.offsetWidth - 26;
field.style.maxWidth = place.parentNode.offsetWidth - 26;
field.style.minWidth = "250";
field.style.padding = "8px";
field.style.border = "1px solid #000";
field.style.backgroundColor = "#eee";
field.style.display = "none";
var input = document.createElement("input");
input.id = "filter-edit-area";
input.setAttribute("name", "filter-edit-area");
input.setAttribute("type", "text");
input.addEventListener("focus", EditFilter.setTimer, false);
input.addEventListener("blur", EditFilter.clearTimer, false);
input.style.width = Math.abs(place.parentNode.offsetWidth * 2 / 3);
input.style.minWidth = "150px";
input.style.fontFamily = "'Lucida Console', 'Courier New', Courier, Monaco, monospace";
input.style.fontSize = "80%";
input.style.marginBottom = "2px";
field.appendChild(input);
field.appendChild(document.createElement("br"));
var select = document.createElement("select");
select.id = "filter-list";
select.setAttribute("name", "filter-list");
select.setAttribute("size", 7);
select.addEventListener("change", EditFilter.selectFilter, false);
select.style.width = Math.abs(place.parentNode.offsetWidth * 2 / 3);
select.style.minWidth = "150px";
select.style.cssFloat = "left";
EditFilter.list.forEach(function(value){
option = document.createElement("option");
option.appendChild(document.createTextNode(value));
select.appendChild(option);
});
field.appendChild(select);
["add", "edit", "remove", "reset"].forEach(function(value){
var button = document.createElement("input");
button.id = "filter-" + value;
button.setAttribute("name", "filter-" + value);
button.setAttribute("type", "button");
button.setAttribute("value", Language[Language.lang][value]);
if(value != "reset"){
button.setAttribute("disabled", "disabled");
}
button.addEventListener("click", EditFilter[value + "Filter"], false);
button.style.width = "60px";
button.style.marginLeft = "8px";
button.style.marginBottom = "4px";
field.appendChild(button);
field.appendChild(document.createElement("br"));
});
var mode = document.createElement("label");
mode.style.clear = "left";
mode.style.cssFloat = "left";
mode.style.fontSize = "90%";
var check = document.createElement("input");
check.id = "filter-mode";
check.setAttribute("name", "filter-mode");
check.setAttribute("type", "checkbox");
if(SearchFilter.hidden) check.setAttribute("checked", "checked");
mode.appendChild(check);
mode.appendChild(document.createTextNode(" " + Language[Language.lang].mode));
field.appendChild(mode);
var p = document.createElement("p");
p.style.clear = "left";
p.style.margin = "0";
p.style.paddingTop = "8px";
p.style.borderTop = "1px solid #ccc";
p.style.textAlign = "right";
["ok", "cancel"].forEach(function(value){
var button = document.createElement("input");
button.id = "filter-" + value;
button.setAttribute("name", "filter-" + value);
button.setAttribute("type", "button");
button.setAttribute("value", Language[Language.lang][value]);
button.addEventListener("click", EditFilter[value + "Editing"], false);
p.appendChild(button);
p.appendChild(document.createTextNode(" "));
button.style.width = "75px";
});
field.appendChild(p);
place.parentNode.appendChild(field);
},
createLink: function(result, anchor){
var link = document.createElement("a");
link.setAttribute("href", "#" + anchor.host);
link.appendChild(document.createTextNode(Language[Language.lang].block));
link.addEventListener("click", EditFilter.addFromLink, false);
var span = $X('.//span[@class="gl"]', result)[0];
if (!span) {
span = document.createElement("span");
span.className = "gl";
$X('.//div[@class="s"]', result)[0].appendChild(span);
} else {
span.appendChild(document.createTextNode(" - "));
}
span.appendChild(link);
},
addFromLink: function(event){
var filter = event.target.href.match(/#([\w.-]+)$/)[1];
if(confirm(Language[Language.lang].addPrefix + filter + Language[Language.lang].addSuffix)){
EditFilter.addList(filter);
event.target.removeEventListener("click", EditFilter.addFromLink, false);
event.target.addEventListener("click", function(event){
alert(Language[Language.lang].addedPrefix + filter + Language[Language.lang].addedSuffix);
}, false);
event.target.replaceChild(document.createTextNode(
Language[Language.lang].blocked
), event.target.firstChild);
}
event.preventDefault();
},
addList: function(filter){
if(EditFilter.isFilterAdded(filter) == null) return;
EditFilter.list.push(filter);
EditFilter.updateFilterList();
SearchFilter.list = eval(EditFilter.list.toSource());
GM_setValue("filter", SearchFilter.list.toSource());
},
addFilter: function(event){
var filter = EditFilter.filter = EditFilter.getEditedFilter();
if(EditFilter.isFilterAdded(filter) == null) return;
EditFilter.list.push(filter);
EditFilter.updateFilterList(filter);
EditFilter.resetEnableButton();
},
isFilterAdded: function(filter){
for(var i = 0, l = EditFilter.list.length; i < l; i++){
// var regexp = SearchFilter.createRegExp(EditFilter.list[i]);
// if(("http://" + filter + "/").match(regexp) != null){
if(filter == EditFilter.list[i]){
alert(Language[Language.lang].addedPrefix + filter + Language[Language.lang].addedSuffix);
return null;
}
}
return 1;
},
editFilter: function(event){
var filter = EditFilter.getEditedFilter();
if(EditFilter.filter == filter){
alert("'" + filter + "' " + Language[Language.lang].notEdited);
return;
}
for(var i = 0, l = EditFilter.list.length; i < l; i++){
if(EditFilter.filter == EditFilter.list[i]){
EditFilter.list[i] = filter;
break;
}
}
EditFilter.filter = filter;
EditFilter.updateFilterList(filter);
EditFilter.resetEnableButton();
},
removeFilter: function(event){
var filter = EditFilter.getEditedFilter();
for(var i = 0, l = EditFilter.list.length; i < l; i++){
if(filter == EditFilter.list[i]){
EditFilter.list.splice(i, 1);
EditFilter.updateFilterList();
EditFilter.filter = document.getElementById("filter-edit-area").value = "";
event.target.setAttribute("disabled", "disabled");
return;
}
}
alert("'" + filter + "' " + Language[Language.lang].notFound);
},
getEditedFilter: function(){
return document.getElementById("filter-edit-area").value;
},
resetFilter: function(event){
if(confirm(Language[Language.lang].init)){
EditFilter.list = SearchFilter.filters.sort()
SearchFilter.list = eval(EditFilter.list.toSource());
EditFilter.updateFilterList();
EditFilter.filter = document.getElementById("filter-edit-area").value = "";
}
},
okEditing: function(event){
SearchFilter.list = eval(EditFilter.list.toSource());
GM_setValue("filter", SearchFilter.list.toSource());
GM_setValue("mode", document.getElementById("filter-mode").checked);
EditFilter.toggleDisplayList(event);
},
cancelEditing: function(event){
EditFilter.list = eval(SearchFilter.list.toSource());
EditFilter.updateFilterList();
EditFilter.toggleDisplayList(event);
},
updateFilterList: function(filter){
EditFilter.list.sort();
var list = document.getElementById("filter-list");
while(list.firstChild){
list.removeChild(list.firstChild);
}
EditFilter.list.forEach(function(value){
var option = document.createElement("option");
option.appendChild(document.createTextNode(value));
list.appendChild(option);
});
if(filter){
for(var i = 0, l = list.childNodes.length; i < l; i++){
if(filter == list.childNodes[i].value){
list.childNodes[i].selected = true;
return;
}
}
}
},
selectFilter: function(event){
EditFilter.filter = document.getElementById("filter-edit-area").value = event.target.value;
EditFilter.resetEnableButton();
if(event.target.value == "")
document.getElementById("filter-remove").setAttribute("disabled", "disabled");
},
setTimer: function(event){
EditFilter.timer = setInterval(EditFilter.checkValue, 250);
},
clearTimer: function(event){
clearInterval(EditFilter.timer);
EditFilter.timer = null;
},
checkValue: function(){
var add = document.getElementById("filter-add");
var edit = document.getElementById("filter-edit");
var filter = document.getElementById("filter-edit-area").value;
if(filter == ""){
[add, edit].forEach(function(button){
button.setAttribute("disabled", "disabled");
});
}
else if(EditFilter.filter == "" && filter != ""){
add.removeAttribute("disabled");
}
else if(filter != EditFilter.filter){
[add, edit].forEach(function(button){
button.removeAttribute("disabled");
});
}
else{
[add, edit].forEach(function(button){
if(!button.hasAttribute("disabled")) button.setAttribute("disabled", "disabled");
});
}
},
resetEnableButton: function(){
["add", "edit"].forEach(function(value){
var button = document.getElementById("filter-" + value);
if(!button.hasAttribute("disabled")){
button.setAttribute("disabled", "disabled");
}
});
button = document.getElementById("filter-remove");
if(button.hasAttribute("disabled")){
button.removeAttribute("disabled");
}
},
toggleDisplayList: function(event){
var list = document.getElementById("google-search-filter");
list.style.display = list.style.display == "none" ? "block" : "none";
event.preventDefault();
},
}
var Language = {
lang: "en",
init: function(){
var lang = navigator.language.substring(0,2);
Language.lang = Language[lang] ? lang : "en";
},
ja: {
config : "\u30d5\u30a3\u30eb\u30bf\u8a2d\u5b9a",
add : "\u8ffd\u52a0",
edit : "\u7de8\u96c6",
remove : "\u524a\u9664",
reset : "\u521d\u671f\u5024",
mode : "\u30d5\u30a3\u30eb\u30bf\u306b\u30de\u30c3\u30c1\u3057\u305f\u7d50\u679c\u3092\u975e\u8868\u793a",
ok : "OK",
cancel : "\u30ad\u30e3\u30f3\u30bb\u30eb",
block : "\u30d6\u30ed\u30c3\u30af",
blocked : "\u30d6\u30ed\u30c3\u30af\u6e08!",
addPrefix : "'",
addSuffix : "' \u3092\u30d5\u30a3\u30eb\u30bf\u306b\u8ffd\u52a0\u3057\u307e\u3059\u304b?",
addedPrefix: "'",
addedSuffix: "' \u306f\u65e2\u306b\u30d5\u30a3\u30eb\u30bf\u306b\u8ffd\u52a0\u3055\u308c\u3066\u3044\u307e\u3059\u3002",
notEdited : "\u306f\u7de8\u96c6\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002",
notFound : "\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002",
init : "\u30d5\u30a3\u30eb\u30bf\u30ea\u30b9\u30c8\u3092\u521d\u671f\u5316\u3057\u307e\u3059\u304b\uff1f",
},
en: {
config : "Config Filters",
add : "Add",
edit : "Edit",
remove : "Delete",
reset : "Reset",
mode : "Hide the filter matched result",
ok : "OK",
cancel : "Cancel",
block : "Block",
blocked : "Blocked!",
addPrefix : "Add '",
addSuffix : "' to filter?",
addedPrefix: "Added '",
addedSuffix: "' to filter already.",
notEdited : "isn't edited.",
notFound : "isn't found.",
init : "Do you initialize the list of filters?",
},
}
// For Autopagerize 0.0.12
function addFilter(filter, i) {
i = i || 4;
if(window.AutoPagerize && window.AutoPagerize.addFilter){
window.AutoPagerize.addFilter(filter);
}
else if(i > 1){
setTimeout(arguments.callee, 1000, filter, i - 1);
}
}
if(document.body) SearchFilter.init();
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment