opera:cache等に機能追加をするブックマークレット



Kurumaさんの仰る事に全く同感

edvakfさんのエントリーを通じて知ったopera:cacheにadvanced searchを追加する方法が素晴らしいのでBookmarkletとして覚え書きしておきます。

原典では言語ファイルを書き換える方法が紹介されています。こちらの方が圧倒的に使いやすいのですが、如何せん言語ファイルは適宜更新されるのが問題です。書き換えを忘れてしまいますからね。

何があろうとブックマークは引き継ぐので忘れませんから、私はブックマークレットで利用することにします。


なので、真似をして覚書を書いておく事にしました。

が少し便利になります。


対象にしている Opera のバージョンは、
Desktop の V9.50 , V9.27 , V8.54
Opera Mbile V8.65
です。って言うか、たぶん V8.50(?) 以上でブックマークレットの動く Opera なら動くと思います。


尤も、原作者(Lex1)さんは V9.00 以上を想定して作っていますから V8.xx系では多少制限があります。

opera:ブックマークレット

javascript:(function(){var S=document.createElement('script');S.src='http://borbis.web.fc2.com/js/OperaColonBml.js';document.body.appendChild(S);})();

OperaColonBml.js

// ==UserScript==
// @name      OperaColon
// @include   opera:*
// @namespace http://my.opera.com/Lex1/blog/
// @namespace http://my.opera.com/Kuruma/blog/2008/04/02/opera-cache-bookmarkl
// @namespace http://my.opera.com/borbis/blog/
// @namespace http://d.hatena.ne.jp/borbis/
// @author    borbis
// @version   0.0.1
// ==/UserScript==

(function(){

	if(location.href.indexOf('opera:')!=0){	return;	}

	var OperaVersion='9.00';
	if( /Opera[ \/]([\d\.]+)/.test(navigator.userAgent) ){
		OperaVersion=RegExp.$1;				// Opera (Mobile) 8.xx
	}

	if(location.href=='opera:plugins'){
		opera_plugins();
	}
	if(location.href=='opera:cache'){
		opera_cache();
	}
	if(location.href=='opera:about'){
		opera_about();
	}
	if(location.href.indexOf('opera:illegal-url')==0){
		opera_illegal_url();
	}



/*
 *	Referr to http://my.opera.com/Lex1/blog/show.dml/1732590
 */
	function opera_plugins(){
		if(OperaVersion >= 9.00){
			opera_plugins9();
		}else{
			opera_plugins8();
		}
	}
	function opera_plugins9(){
//		-1303632626="Plug-ins<script type='text/javascript'>
//		document.addEventListener('load',function() {
			var p=navigator.plugins;
			var t=document.getElementsByTagName('tbody');
			for(var i=0, ti; ti=t[i]; i++){
				ti.innerHTML='<TR><TD>Description:</TD><TD>'+(p[i].description ? p[i].description : 'Plug-in disabled')+'</TD></TR>'+ti.innerHTML
			};
//		},false)
//		</script>"
	}
/*
 *	Referr to http://my.opera.com/Lex1/blog/show.dml/1732590#comment4662814
 */
	function opera_plugins8(){
//		javascript:
		var flashversion = function(){
			var p;
			if (((p = navigator.plugins) && (p = p["Shockwave Flash"]) && (p = p.description)) || ((p = window.ActiveXObject) && (p = new p("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")))){
				return p;
//			return p.replace(/^\D+/, '').split(/\D+/g);
			}
			return 'Plug-in disabled';
//		return null;
		}();
		alert(flashversion)
	}



/*
 *	Referr to http://d.hatena.ne.jp/edvakf/20080326/1206511024
 */
	function opera_cache(){
		if(OperaVersion >= 9.00){
			opera_cache9();
		}else{
			opera_cache8();
		}
	}
	function opera_cache9(){
//		-1713924769="Size<script type='text/javascript'>
//		document.addEventListener('load',function() {
			for(var i=0; document.links[i]; i++){document.links[i].target = '_blank'};
			var l = document.getElementsByTagName('tr');
			var sf=document.createElement('input'); 
			sf.type = 'text';
			sf.defaultValue='Search';
			sf.style='margin:0 4px;float:right';
			sf.addEventListener('focus',function(){
				if(this.value==this.defaultValue){this.value='';}
			},false);
			sf.addEventListener('blur',function(){
				if(!this.value){this.value=this.defaultValue;}
			},false);
			sf.addEventListener('keyup',function(){
				var v=this.value;
				for(var i=0, li; li=l[i]; i++){
					var p=li.lastChild.firstChild.innerText;
					if(p && p.indexOf(v)==-1){li.style='display: none'} 
					else                     {li.style='display: table-row'}; 
				}
			},false); 
			var inp=document.createElement('input'); 
			inp.type='button'; 
			inp.value='Thumbnails';
			inp.style='float:right;';
			inp.addEventListener('click', function(){
				var b=/\.(jpe?g|bmp|gif|png|ico|swf|flv)$/i;
				var f=/\.(swf|flv)$/i;
				for(var i=0, li; li=l[i]; i++){
					var p=li.lastChild.firstChild;
					var c=li.lastChild.firstChild.innerText;
					if(li.offsetHeight!=0 && p.childNodes.length<2){
						if(b.test(c)){
							var stl='float:right; border:1px dotted black; margin:1px; padding:1px;'; 
							if(f.test(c)){
								var dv=document.createElement('div');
								p.appendChild(dv);
								dv.innerHTML='<embed src='+p.href+'>';
								var fh=dv.firstChild;
								fh.setAttribute('height', 100);
								fh.setAttribute('width', 100);
								fh.setAttribute('style', stl+' content:normal; outline:none; color:inherit');
							} else {
								var image=document.createElement('img');
								image.setAttribute('src',p.href);
								if(!image.height || image.height>100){image.height='100'};
								if(!image.width || image.width>100){image.width='100'};
								image.setAttribute('style', stl);
								p.appendChild(image);
							}
						}
					}
				};
			}, false);
			var th=document.getElementsByTagName('th')[2];
			th.appendChild(inp);th.appendChild(sf); 
//		},false)
//		</script>"
	}
/*
 *	Referr to http://my.opera.com/borbis/blog/show.dml/1849569
 */
	function opera_cache8(){
//		21418="Size<script type='text/javascript'>
//		document.addEventListener('load',function() {
			for(var i=0; document.links[i]; i++){document.links[i].target = '_blank'};
			var l = document.getElementsByTagName('tr');
			var sf=document.createElement('input'); 
			sf.type = 'text';
			sf.defaultValue='Search';
			sf.style='margin:0 4px;float:right;'; 
			sf.addEventListener('focus',function(){
				if(this.value==this.defaultValue){this.value='';}
			},false);
			sf.addEventListener('blur',function(){
				if(!this.value){this.value=this.defaultValue;}
			},false);
			sf.addEventListener('keyup',function(){
				var v=this.value;
				for(var i=0, li; li=l[i]; i++){
					var p=li.lastChild.firstChild.innerText;
					if(p && p.indexOf(v)==-1){li.style='display: none'} 
					else                     {li.style='display: table-row'}; 
				}
			},false); 
			var inp=document.createElement('input'); 
			inp.type='button'; 
			inp.value='Thumbnails';
			inp.style='float:right;';
			inp.addEventListener('click', function(){
				var b=/\.(jpe?g|bmp|gif|png|ico|swf|flv)$/i;
				var f=/\.(swf|flv)$/i;
				for(var i=0, li; li=l[i]; i++){
					var p=li.lastChild.firstChild;
					var c=li.lastChild.firstChild.innerText;
					if(li.offsetHeight!=0 && p.childNodes.length<2){
						if(b.test(c)){
							var stl='float:right; border:1px dotted black; margin:1px; padding:1px;'; 
							if(f.test(c)){
								var dv=document.createElement('div');
								p.appendChild(dv);
								dv.innerHTML='<EMBED src='+p.href+'>';
								var fh=dv.firstChild;
								fh.setAttribute('height', 100);
								fh.setAttribute('width', 100);
								fh.setAttribute('style', stl+' content:normal; outline:none; color:inherit;');
							} else {
								var image=document.createElement('img');
								image.setAttribute('src',p.href);
								if(!image.height || image.height>100){image.height='100'};
								if(!image.width || image.width>100){image.width='100'};
								image.setAttribute('style', stl);
								p.appendChild(image);
							}
						}
					}
				};
			}, false);
			var td=document.getElementsByTagName('td')[2];
			td.appendChild(inp);
			td.appendChild(sf); 
//		},false)
//		</script>"
	}



/*
 *	Referr to http://my.opera.com/Lex1/blog/show.dml/1014525
 */
	function opera_about(){
		if(OperaVersion >= 9.00){
			opera_about9();
		}else{
			opera_about8();
		}
	}
	function opera_about9(){
//		1557681688="Preferences<script type='text/javascript'>
//		window.addEventListener('load',function() {
			var l = document.getElementsByTagName('dd');
			for(var i=6, li; li=l[i]; i++){
				li.innerHTML='<a href=file://localhost/'+li.innerHTML.replace(/\\\\/g,'/').replace(/ /g,'%20')+'>'+li.innerHTML+'</a>'
			};
//		},false)
//		</script>"
	}
	function opera_about8(){
//		11708="Preferences<script type='text/javascript'>
//		window.addEventListener('load',function() {
			var l = document.getElementsByTagName('td');
			for(var i=7, li; li=l[i]; i++){
				if(li.previousSibling==null){continue;} 
				li.innerHTML='<a href=file://localhost/'+li.innerHTML.replace(/\\\\/g,'/').replace(/ /g,'%20')+'>'+li.innerHTML+'</a>'
			};
//		},false)
//		</script>"
	}



/*
 *	Referr to http://my.opera.com/Lex1/blog/show.dml/1014525
 *	          http://files.myopera.com/Lex1/files/english.zip
 */
	function opera_illegal_url(){
		if(OperaVersion >= 9.00){
			opera_illegal_url9();
		}else{
			opera_illegal_url8();
		}
	}
	function opera_illegal_url9(){
//		1150263995="contains characters that are not valid in the location they are found.<script type='text/javascript'>
//		document.addEventListener('load',function() {
			var st = document.getElementsByTagName('cite')[0].innerHTML.substr(7); 
			if(!prompt('Do you want to search this URL?',st))return; 
			if(document.location.host!='www.google.com'){
				document.location = 'http://www.google.com/search?client=opera&rls=en&sourceid=opera&ie=utf-8&oe=utf-8&q=' + encodeURIComponent(st.replace(/ /,'+'))
			};
//		},false)
//		</script>"
	}
	function opera_illegal_url8(){
//		70528="contains characters that are not valid in the location they are found.<script type='text/javascript'>
//		document.addEventListener('load',function() {
			var st = document.getElementsByTagName('strong')[0].innerHTML; 
			if(!(/\shttps?:\/\/(.+?)\s+(contains characters that|)/.test(st)))return; 
			st = RegExp.$1; 
			if(!prompt('Do you want to search this URL?',st))return; 
			if(document.location.host!='www.google.com'){
				document.location = 'http://www.google.com/search?client=opera&rls=en&sourceid=opera&ie=utf-8&oe=utf-8&q=' + encodeURIComponent(st.replace(/ /,'+'))
			};
//		},false)
//		</script>"
	}

})();



なんと言うかダサダサなのですが、言語ファイルを更新するときの為の参考にでもなれば良いかと、、、、、
言語ファイルの順番どおりに並べてありますし。


Opera Mobile で言語ファイルを書き換える際には↓を参考にするのも良いかと思います。(文字数制限を回避できます。)
The Opera blog



実は、当初ブックマークレットにするよりも UserJS にしてしまえばブックマークレットを呼び出す手間が省けてよさげかもって思って実際 UserJS にして見たのですが、なんと、 Operaopera:xxxx の URL については UserJS を全く呼び出してくれませんでした。


追記

opera:illegal-url の URL について補足しておきます。
「読んで字の如し」と言ってしまえばそれまでですがどうやら次のような URL を対象にしているようです。

  1. http://www^
  2. http://yahoo.com∕special∕2007∕action.do.test.minazuki.com/
1番目はただの typo でしょうが、2番目は URL を偽装してフィッシングを狙っているので警告しているアレですね。
参考:「ほんとうは怖い国際化ドメイン名」@水無月ばけらのえび日記