Hatena::ブログ(Diary)

(TooLab.)Lab. 研究日誌 このページをアンテナに追加 RSSフィード Twitter

2012 February 03

2012年02月03日のツイート

Sleipnir Mobile for Android 2.0 β版の売り「エクステンション」を試した

「穴」が当たったのかな?

先日、Twitterで「ブログ書く気おきねー」とかgdgdツイートしてましたら、たばさんが今週末に書く気起きるかもみたいな情報をくれました。
私は"本命ぷにる3.1、対抗3系統にSDE、HLRあたりが先行公開、穴でぷにモバ大幅うpだて、大穴で新ソフト、願望でまさかのWebkitプラグインと予想"していい所を突いてるのがあると言われたのですが、「穴」の「ぷにモバ大幅うpだて」が当たったみたいですね。


今日はとりあえず、公開されたエクステンションを試してみるだけにしました。
使い方はデベロッパーズブログ:Sleipnir Mobile for Android 2.0 β をリリースしました!Extensions Gallery - ヘルプを参照してください。

とりあえず、PickUp エクステンションを試す

Stop sticky ADs」を入れましょう。
入れるときに「エクステンションをインストールしますか?」というダイアログが表示されます。*1
ここで「インストール」*2をタップするとスクリプトがインストールされます。
この時出来れば各種情報をきっちり読んで欲しいんですが、とりあえずのところ「説明」、「このエクステンションを実行する URL」、「実行対象から除外する URL」くらいは読んでください。

Stop sticky ADsは現在@wiki、オリコン、FC2ブログ、食べログの4サイトの浮動型広告を消します。埋め込み型の広告を消すわけじゃないので注意してください。
ただ、私が試した時はFC2ブログでは上手く消えないようでした。(たまてばこゲーム翻訳者のブログしか試してないですけどw)
ちなみに浮動型広告はSleipnir Mobileではタブバーの後ろに隠れがちなので普段は気にならないですけどね。全画面にしたりすると気になりますが。

「エクステンションの管理」をする

「MENUボタン>その他>設定>エクステンション≫エクステンションの管理」から設定が可能です。
右側のチェックボックスでエクステンションの有効/無効が設定できます。*3
エクステンションのアイコン、エクステンション名、説明の部分をタップするとそのエクステンションの詳細ダイアログが表示されます。
同じくタッチアンドホールドをするとアンインストールダイアログが出力されます。

デモエクステンションを軽く紹介

デモエクステンションは「エクステンション API」の挙動の説明つまり、どちらかというと開発者に向けたものです。
※上から3つのエクステンションは同時にONだと重複して発動して面倒なので、一つずつONにした方がよろしいです。

API Demo - SLEX_shareText

"http://www.fenrir-inc.com/"以下で動作。
適当な場所でタップするとタップした場所のHTMLタグのテキストをインテントで共有しようとします。

API Demo - SLEX_download

"http://www.fenrir-inc.com/"以下で動作。
リンクをタップするとリンク先のファイルをダウンロードしようとします。

API Demo - SLEX_shareUrl

"http://www.fenrir-inc.com/"以下で動作。
リンクをタップするとリンク先のURLをインテントで共有しようとします。

API Demo - SLEX_addStyle

"http://m.sleipnirstart.com/"で動作。
Sleipnir Start の各ボタンのアイコン画像をすべてTwitterのアイコン画像に置換します。

おわりに

フェンリルではエクステンションを募集しているので、Javascriptが出来る人はチャレンジしてみてはいかがでしょう。
また、そんなの作れねーよって方もあったらいいなというエクステンションを言ってみると誰かが作ってくれるかもしれません。
連絡方法など詳しくはブログの後半に書いてあります。


自作のエクステンションを何か作ろうかと思っているので、そのへんは明日以降に。

アドレスバーの左側のボタンに任意のアクションを割り当てる

ブログをサボりにサボってましたが久々に。
本当は昨日、一昨日書く予定だったのにうっかり寝ちゃったので、会社で書いてます。
まぁ、今日は暇なんですよ。割と。


復帰初回は小ネタな感じで。
アドレスバーの左側のボタン、要するにページのfaviconが表示される部分のお話です。
このボタンをクリックするとアクションが実行できます。
「Sleipnirオプション>ツールバー>アドレスバー≫左ボタンの動作」の所から設定できます。

アクションが「なし」と「お気に入りに追加、IEで開く、デスクトップにショートカット作成」の3種類しかないわけです。


ただし、"user.ini"を直接弄れば任意のアクションが割り当てられます。
「AddressBarSetting」セクションに設定する箇所があります。

[AddressBarSetting]
(中略)
LeftButtonActionClickTypeC=
LeftButtonActionClickTypeCS=
LeftButtonActionClickTypeCC=
LeftButtonActionClickTypeR=
LeftButtonActionClickTypeRS=
LeftButtonActionClickTypeRC=

それぞれボタンの押し方「左クリック、Shift+左クリック、Ctrl+左クリック、右クリック、Shift+右クリック、Ctrl+右クリック」に対応しています。


で、Sleipnirのデフォアクションにも設定して使えるのは"CopyTitleAndUri"とかいくつもあるんですけど、
私のほうでも使えるかなっというUAアクションを考えてみました。

アドレスバーでURIとページタイトルを交互に表示するアクション

会社で使ってるノートPCは以前に書いたネタのとおりにタイトルバーの部分を非表示にしているのですけれど、タイトルみたいな時もあるので設定してます。
SwitchTitleAndUriAtAddressBar

(function(){
	var pnir = sleipnir.api;
	if(pnir.AddressBarString == pnir.URL) {
		pnir.AddressBarString = document.title;
	}else {
		pnir.AddressBarString = pnir.URL;
	}
})();



貼り付けて移動/検索をするアクション

以前ブログで書いたアクションです。少し修正してますが。
PasteAndGoUA.js

(function(){
	// 検索エンジンクエリ
	var r = "http://www.google.com/search?q=";
	
	var p = sleipnir.api;
	var tmp = clipboardData.getData("Text");
	
	if(tmp.length>0){
		if(tmp.indexOf("\n") >= 0){
			// 改行コードがあった場合検索する
			p.Navigate(p.GetDocumentID(p.ActiveIndex), r + encodeURIComponent(tmp));
			//p.NewWindow(r + encodeURIComponent(tmp), true);
		}else{
			if(tmp.match(/^(http:\/\/|https:\/\/|about:|\/\/).+/) != null){
				// 文字列先頭が「http、https、about、//」の何れかならその文字列のアドレスに飛ぶ
				p.Navigate(p.GetDocumentID(p.ActiveIndex), tmp);
				//p.NewWindow(tmp, true);
			}else if(tmp.match(/^(ttp:\/\/|ttps:\/\/).+/) != null){
				// 文字列先頭が「ttp、ttps」なら先頭に"h"を足してその文字列のアドレスに飛ぶ
				p.Navigate(p.GetDocumentID(p.ActiveIndex), "h" + tmp);
				//p.NewWindow("/" + tmp, true);
			}else if(tmp.match(/^\/[^\/]/) != null){
				// 文字列先頭が「/」なら先頭に"/"を足してその文字列のアドレスに飛ぶ
				p.Navigate(p.GetDocumentID(p.ActiveIndex), "/" + tmp);
				//p.NewWindow("/" + tmp, true);
			}else if(tmp.match(/.*\..+/) != null){
				// 文字列が「<任意の文字>.<任意の文字>」なら先頭に"//"を足してその文字列のアドレスに飛ぶ
				p.Navigate(p.GetDocumentID(p.ActiveIndex), "//" + tmp);
				//p.NewWindow("//" + tmp, true);
			}else{
				// 上記の分岐に当てはまらなかったらその文字列で検索する
				p.Navigate(p.GetDocumentID(p.ActiveIndex), r + encodeURIComponent(tmp));
				//p.NewWindow(r + encodeURIComponent(tmp), true);
			}
		}
	}
})();



デスクトップにURLショートカットを作成するアクション

デフォルトのと違うのはファイル作成時に入力ダイアログでファイル名を入力できることです。
CreateUrlShortcut.js

(function(){

var fso = sleipnir.CreateObject("Scripting.FileSystemObject");
var folderPath = sleipnir.CreateObject("WScript.Shell").SpecialFolders("Desktop");
var path;

// ファイル名入力
var dupliFlag = true; // ファイル名ダブり判定フラグ
var setFlag = true; // ファイル作成フラグ
var filename;
var title = document.title.length != null ? document.title : document.URL;

while(dupliFlag) {
	filename = prompt("「お気に入り」のファイル名を指定してください。", title)
	
	if(filename == null) {
		setFlag = false;
		break;
	}
	
	// ファイル名調整
	// 禁則文字の置換
	var tmpFN = new Array();
	for(var i = 0; i < filename.length; i++) {
		switch(filename.charAt(i)) {
			case "\\": tmpFN.push("¥"); break;
			case "/":  tmpFN.push("/"); break;
			case ":":  tmpFN.push(":"); break;
			case "*":  tmpFN.push("*"); break;
			case "?":  tmpFN.push("?"); break;
			case "\"": tmpFN.push("“"); break;
			case "<":  tmpFN.push("<"); break;
			case ">":  tmpFN.push(">"); break;
			case "\|": tmpFN.push("|"); break;
			default:   tmpFN.push(filename.charAt(i));
		}
	}
	filename = tmpFN.join("");
	
	// 256文字以上のパスの時適宜ファイル名をカット
	// Win9x系の事(255'バイト'まで)は知らんw
	// -4は拡張子長分
	if(filename.length > (255 -4 -folderPath.length)) {
		// -1はsubstringが0から始まるため
		filename = filename.substring(0, (255 -4 -folderPath.length -1));
	}
	// ファイル名が0以下の時
	if(filename.length <= 0) {
		setFlag = false;
		break;
	}
	
	// いわゆるCONCON問題についてはどうしよう。
	// http://ja.wikipedia.org/wiki/%E4%BA%88%E7%B4%84%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9#CONCON.E5.95.8F.E9.A1.8C
	
	// ファイル名重複時の対応
	path = fso.BuildPath(folderPath, filename + ".url");
	if(fso.FileExists(path)) {
		setFlag = confirm("ファイル名が重複しています。再入力するなら「OK」、登録をやめるなら「キャンセル」を押してください。");
	}else {
		dupliFlag = false;
	}
	
	if(!setFlag) {
		break;
	}
}

// ファイル出力
if(setFlag) {
	fso.CreateTextFile(path);
	var fp = OpenFile(path, "w");
	fp.Write('[InternetShortcut]\r\n');
	fp.Write('URL=' + document.URL +'\r\n');
	fp.Write('IDList=\r\n');
	fp.Write('IconFile=' + getFaviconURI(location.href) + '\r\n');
	fp.Write('[{000214A0-0000-0000-C000-000000000046}]\r\n');
	fp.Write('Prop3=19,2\r\n');
	fp.Close();
}

function getFaviconURI(uri) {
	var favpath = "";
	var links = document.getElementsByTagName("link");
	for(var i = 0; i < links.length; i++) {
		if(links[i].rel.toLowerCase() == "shortcut icon" || links[i].rel.toLowerCase() == "icon") {
			favpath = absolutePath(links[i].href);
			break;
		}
	}
	
	return favpath.length > 0 ? favpath : "//" + uri.split("/")[2] + "/favicon.ico";
	
}

function absolutePath(path){
	var e = document.createElement('span');
	e.innerHTML = '<a href="' + path + '" />';
	return e.firstChild.href;
}

})();



デスクトップにPinned Site ショートカットを作成するアクション

IE9以降で使用可能な固定サイトショートカット(拡張子:website)を作成します。*4
ちなみにこのファイル形式Sleipnirでは使えないのでこのアクションの有用性は無いです。*5

(function(){

var fso = sleipnir.CreateObject("Scripting.FileSystemObject");
var folderPath = sleipnir.CreateObject("WScript.Shell").SpecialFolders("Desktop");
var path;

// ファイル名入力
var dupliFlag = true; // ファイル名ダブり判定フラグ
var setFlag = true; // ファイル作成フラグ
var filename;
var title = document.title.length != null ? document.title : document.URL;

while(dupliFlag) {
	filename = prompt("「お気に入り」のファイル名を指定してください。", title)
	
	if(filename == null) {
		setFlag = false;
		break;
	}
	
	// ファイル名調整
	// 禁則文字の置換
	var tmpFN = new Array();
	for(var i = 0; i < filename.length; i++) {
		switch(filename.charAt(i)) {
			case "\\": tmpFN.push("¥"); break;
			case "/":  tmpFN.push("/"); break;
			case ":":  tmpFN.push(":"); break;
			case "*":  tmpFN.push("*"); break;
			case "?":  tmpFN.push("?"); break;
			case "\"": tmpFN.push("“"); break;
			case "<":  tmpFN.push("<"); break;
			case ">":  tmpFN.push(">"); break;
			case "\|": tmpFN.push("|"); break;
			default:   tmpFN.push(filename.charAt(i));
		}
	}
	filename = tmpFN.join("");
	
	// 256文字以上のパスの時適宜ファイル名をカット
	// Win9x系の事(255'バイト'まで)は知らんw
	// -8は拡張子長分
	if(filename.length > (255 -8 -folderPath.length)) {
		// -1はsubstringが0から始まるため
		filename = filename.substring(0, (255 -8 -folderPath.length -1));
	}
	// ファイル名が0以下の時
	if(filename.length <= 0) {
		setFlag = false;
		break;
	}
	
	// いわゆるCONCON問題についてはどうしよう。
	// http://ja.wikipedia.org/wiki/%E4%BA%88%E7%B4%84%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9#CONCON.E5.95.8F.E9.A1.8C
	
	// ファイル名重複時の対応
	path = fso.BuildPath(folderPath, filename + ".website");
	if(fso.FileExists(path)) {
		setFlag = confirm("ファイル名が重複しています。再入力するなら「OK」、登録をやめるなら「キャンセル」を押してください。");
	}else {
		dupliFlag = false;
	}
	
	if(!setFlag) {
		break;
	}
}

// ファイル出力
if(setFlag) {
	fso.CreateTextFile(path);
	var fp = OpenFile(path, "w");
	fp.Write('[{000214A0-0000-0000-C000-000000000046}]\r\n');
	fp.Write('Prop4=31,' + document.title + '\r\n');
	fp.Write('Prop3=19,2\r\n');
	fp.Write('[{A7AF692E-098D-4C08-A225-D433CA835ED0}]\r\n');
	fp.Write('Prop5=3,0\r\n');
	fp.Write('Prop9=19,0\r\n');
	fp.Write('Prop6=3,1\r\n');
	fp.Write('[InternetShortcut]\r\n');
	fp.Write('URL=' + document.URL +'\r\n');
	fp.Write('IDList=\r\n');
	fp.Write('IconFile=' + getFaviconURI(location.href) + '\r\n');
	fp.Write('IconIndex=\r\n');
	fp.Write('[{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}]\r\n');
	fp.Write('Prop5=8,Microsoft.Website\r\n');
	fp.Close();
	
}

function getFaviconURI(uri) {
	var favpath = "";
	var links = document.getElementsByTagName("link");
	for(var i = 0; i < links.length; i++) {
		if(links[i].rel.toLowerCase() == "shortcut icon" || links[i].rel.toLowerCase() == "icon") {
			favpath = absolutePath(links[i].href);
			break;
		}
	}
	
	return favpath.length > 0 ? favpath : "//" + uri.split("/")[2] + "/favicon.ico";
	
}

function absolutePath(path){
	var e = document.createElement('span');
	e.innerHTML = '<a href="' + path + '" />';
	return e.firstChild.href;
}

})();

*1:すでにインストール済みのスクリプトを再度インストールする場合は「エクステンションをアップデートしますか?」というダイアログ

*2:または「アップデート」

*3:有効/無効を切り替えた場合すでに開いているタブではページをリロードする必要があります

*4:固定サイトショートカットについてはググってください

*5:上のアクションとほぼ同じ構成なので作ってみただけです