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

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


復帰初回は小ネタな感じで。
アドレスバーの左側のボタン、要するにページの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)を作成します。*1
ちなみにこのファイル形式Sleipnirでは使えないのでこのアクションの有用性は無いです。*2

(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:上のアクションとほぼ同じ構成なので作ってみただけです