素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

wedataのデータをどれくらい信用するか問題

wedataの情報を元に、完全に情報を消しちゃうってのは危険な気がしてきたので修正した。

つまり、消すか半透明にするかを、wedataとソース直書きで別に設定できるようにした。
初期値は、wedataが半透明、直接書いたのを完全に削除。まあいい妥協策だと思う。

バグ修正:

  1. ニュースとかが入ってる特殊な検索結果の場合にきちんと動作するようにした

追加した機能:

  1. wedataとローカルの差別化
  2. 透明度を変数に入れた
// ==UserScript==
// @name           FilterinGoogle
// @namespace      http://d.hatena.ne.jp/javascripter/
// @include        http://www.google.co.jp/
// ==/UserScript==


var LOCAL_RULES_DELETE=true;
var SITEINFO_RULES_DELETE=false;
var OPACITY=0.5;
var SITEINFO_IMPORT_URL='http://wedata.net/databases/FilterinGoogle/items.json';
var LOCAL_RULES=[
'http://swik.net/',
'http://b.hatena.ne.jp'
];
var NOT_EXEC_RULES=[
//'http://b.hatena.ne.jp/'
];


function clear_cache(){
	GM_setValue('cache','');
}
function get_cache(callback){
	var cache=GM_getValue('cache');
	if(cache){
		callback(eval(cache));
	}else{
		GM_xmlhttpRequest({
method:'GET',
url:SITEINFO_IMPORT_URL,
onload:function(res){
var siteinfo_rules=eval(res.responseText).map(
	function(i){
	if(i.data.url.indexOf('/')!=0){
	return i.data.url;
	}else{
	var [,pattern,flags]=i.data.url.match(/^\/(.+)\/([gimy]*)$/i);
	return RegExp(pattern,flags);
	}
	});
GM_setValue('cache',uneval(siteinfo_rules));
callback(siteinfo_rules);
}
});
}
};

function deleteElement(element){
	element.parentNode.removeChild(element);
}
function translateElement(element){
	element.style.opacity=OPACITY;
}

function filtering(root,rules){
	return Array.filter(root.getElementsByClassName('g'),
		function(i){
		var i_url=i.getElementsByTagName('a')[0].href;
		return NOT_EXEC_RULES.every(
			function(url){
			return i_url[typeof(url)=='string'?'indexOf':'search'](url)==-1;
			})
		&&
		rules.some(
			function(url){
			return i_url[typeof(url)=='string'?'indexOf':'search'](url)!=-1;
			});
		});
}

function gc(root){
get_cache(function(SITEINFO_RULE){
		var deleteRules=(SITEINFO_RULES_DELETE?SITEINFO_RULE:[]).concat(LOCAL_RULES_DELETE?LOCAL_RULES:[]);
		var transRules=(SITEINFO_RULES_DELETE?[]:SITEINFO_RULE).concat(LOCAL_RULES_DELETE?[]:LOCAL_RULES);
		filtering(root,deleteRules).forEach(deleteElement);
		filtering(root,transRules).forEach(translateElement);

		});
}

GM_registerMenuCommand('FilterinGoogle - clear cache',clear_cache);
gc(document.getElementById('res'));

window.AutoPagerize&&
	window.AutoPagerize.addFilter(
		function(docs){
			docs.forEach(gc);
		});

ソースを綺麗に書くのって難しい。非同期処理が絡むともう。

あと、補助用ブックマークレットも書いた。

javascript:var%20d=document;d.getElementsByTagName('head')[0].appendChild(d.createElement('style')).textContent='div.g:hover{background-color:#dff}';Array.forEach(d.getElementsByClassName('g'),function(i){i.addEventListener('click',function(){prompt('%E3%82%B3%E3%83%94%E3%83%BC%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84',this.getElementsByTagName('a')[0].href.match(/https?:\/\/.*?\//))},false)})