mixiから外部リンクへの移行を簡単にするスクリプト@Safari

 SafariにもCreammonkeyというFirefoxGreasemonkeyに相当する、特定のページで任意のJavascriptを実行するプラグインが存在する。この話は以前、Safariでの環境構築をした際にも書きましたね。


 参考:カエル日記:Safariでの環境構築


 しかし、このCreammonkey上で今までFirefoxで使ってきた.user.jsファイルを動作させてみても、ほとんどが動作しないんです。これについて、いろいろ調べてみたんだけど、SafariではJavascriptの挙動が他のブラウザ(特にここではFirefox)と異なるからみたい。例えば、下にも出てくるescape関数などが挙げられます。他にも、GreasemonkeyではAjaxで有名なXmlHttpRequestがセキュリティ上の観点からGM_xmlhttprequestという独自のものを使っていたりするので、これを使っている.user.jsファイルは動作しないと思います。


 ここら辺を考慮しつつ、今まで使っていた.user.jsファイルを修正できたらいいのではないかなぁ。ま、そこら辺はお遊び程度においおいやっていくつもり。


 んで、せっかくだから今まで使っていた.user.jsファイルを1つ試しに修正してみました。以下のサイトで配布されている「mixiから外部リンクへの移行を簡単にするスクリプト」です。


 参考:mixiから外部リンクへの移行を簡単にするスクリプト AutomaticMoving@Mixi 0.1 - ヽ(´・肉・`)ノ日誌

修正前

// ==UserScript==
// @name	automatic moving @mixi
// @description	automatic moving script to an external link
// @namespace	http://niku.name/
// @include	http://mixi.jp/view_diary.pl?url=*
// @include	http://mixi.jp/new_friend_diary.pl*
// ==/UserScript==

// style definition for external url
// Ex.
//var external_url_style = 'font-weight:bold; font-style:italic;';
//var external_url_style = 'background-color:yellow;';
var external_url_style = 'border-style:solid;border-width:1px 1px 0 1px;';


(function (){
    var anchor = document.getElementsByTagName('A');

    if(document.URL.match(/new_friend_diary.pl/)) {
	for(i=0; i<anchor.length; i++) {
	    var diary_url = anchor[i].href;
	    if(diary_url.match(/view_diary/)&&diary_url.match(/url=/)) {
		anchor[i].innerHTML='<span style="'+external_url_style+'">'+anchor[i].innerHTML+'</span>';
	    }
	}
    }
    
    if(document.URL.match(/view_diary.pl/)) {
	var start_external_url = document.URL.indexOf("http",4);
	var end_external_url = document.URL.indexOf("&owner",0);
	var external_url = unescape(document.URL.substring(start_external_url,end_external_url));
	for(i=0;i<anchor.length;i++)
	    if(anchor[i].href==external_url) location.replace(anchor[i].href);
    }

})();

修正後

// ==UserScript==
// @name	automatic moving @mixi
// @description	automatic moving script to an external link
// @namespace	http://niku.name/
// @include	http://mixi.jp/view_diary.pl?url=*
// @include	http://mixi.jp/new_friend_diary.pl*
// ==/UserScript==

// style definition for external url
// Ex.
//var external_url_style = 'font-weight:bold; font-style:italic;';
//var external_url_style = 'background-color:yellow;';
var external_url_style = 'border-style:solid;border-width:1px 1px 0 1px;';


(function (){
    var anchor = document.getElementsByTagName('A');

    if(document.URL.match(/new_friend_diary.pl/)) {
	for(i=0; i<anchor.length; i++) {
	    var diary_url = anchor[i].href;
	    if(diary_url.match(/view_diary/)&&diary_url.match(/url=/)) {
		anchor[i].innerHTML='<span style="'+external_url_style+'">'+anchor[i].innerHTML+'</span>';
	    }
	}
    }
    
    if(document.URL.match(/view_diary.pl/)) {
	var start_external_url = document.URL.indexOf("http",4);
	var end_external_url = document.URL.indexOf("&owner",0);
	var external_url = decodeURI(document.URL.substring(start_external_url,end_external_url));
	for(i=0;i<anchor.length;i++)
	    if(anchor[i].href==external_url) location.replace(anchor[i].href);
    }

})();

 具体的には、下から6行目のunescape関数をdecodeURI関数に書き換えただけです。Safariではescape関数の動作が他のブラウザと異なることもあり、文字コードを違って認識してしまうために、上のスクリプトが動作してなかったと考えられます。


 うまく動作するようになったのは良いんですが、如何せんGreasemonkeyに比べて、重いんですよね〜。やはり、Creammonkeyはまだ発展途上だし、頼りっきりにしていいソフトではないのかもしれないな〜。