Sleipnir 2 で現在開いているタブを書き出すスクリプト

Browser to Browser

ケータイをAndroidにしてから1年と少し、出退勤中とか出先だとかにWebページを見る機会は多くなりました。*1
するとモバイルで読んでるけどPCで読みたいなぁとか、その逆(あんま無いけど)だとかってこともあるわけです。
そういう時はDropboxだとかEvernoteをこれまで使ってました。
ブラウザ間でタブを共有するアプリやサービスもあったりしますが、使ったこと無かったですね。なんとなくw


そんなこんなで今日急にスクリプト書きたくなったので、やっつけで作ってみました。
しかも個人的に需要が無い方のPCブラウザ→モバイルブラウザの方向のものをw
まぁ、PCブラウザ→別のPCのブラウザとかでも使えたりしますが。
やってることは何のことは無く、単にHTMLファイル出力するだけなんですけどね。

ExportTabs.js

(function(){
	var path = sleipnir.CreateObject("WScript.Shell").SpecialFolders("Desktop");
	var Overwrite = true;
	var fontsize = "150%";
	
	var pnir = sleipnir.api;
	var fso = sleipnir.CreateObject("Scripting.FileSystemObject");
	var dat = "_" + formDate(new Date());
	
	var file = Overwrite ? "ExportTabs.html" : "ExportTabs" + dat + ".html";
	var exPath = fso.BuildPath(path, file);
	
	if(document.getElementById("ExportTabs") == null && pnir.AddressBarString.indexOf("http:///") == -1) {
		var tbl = "<html><head><style type='text/css'>table{width:100%}td.ttl,td.uri{width:49%}td.ttl input{width:100%}td.uri input{width:100%}</style></head><body id='ExportTabs'><table>";
		for(var i = 0; i < pnir.GetCount; i++) {
			var doc = pnir.GetDocumentObject(pnir.GetDocumentID(i));
			if(doc != null) {
				var chk = doc.location.href.match(/^(about|file|javascript):/) == null ? "checked" : "";
				var tmp = "<tr><td class='cb'><input type='checkbox' " + chk + "></td>";
				var ttl = doc.title.length > 0 ? doc.title : doc.location.href;
				tmp += "<td class='ttl'><input type='text' value='" + ttl + "'></td>";
				tmp += "<td class='uri'><input type='text' value='" + doc.location.href + "'></td></tr>\n";
				tbl += tmp;
			}
		}
		tbl += "</table></body></html>";
		
		var nw = pnir.NewWindow('about:blank', true);
		var doc = pnir.GetDocumentObject(nw);
		if (doc == null) {
			alert('documentオブジェクトを作成できません');
		}
		doc.write(tbl);
	}else{
		try {
			var stream = fso.OpenTextFile(exPath, 2, true, -2);
			stream.WriteLine("<html>\r\n<body style='font-size:" + fontsize + "'>");
			
			var tr = document.getElementsByTagName("tr");
			for(var i = 0; i < tr.length; i++) {
				var td = tr[i].getElementsByTagName("td");
				if(td[0].firstChild.checked) {
					stream.WriteLine("<a href='" + td[2].firstChild.value + "' target='_blank'>" + td[1].firstChild.value + "</a><br><br>");
				}
			}
			stream.Write("</body>\r\n</html>");
			alert(exPath + " に書き出しました");
		}catch(e) {
			alert("エラー:" + e.number);
		}finally {
			stream.Close();
		}
	}
	
function formDate(Obj) {
	return "" + Obj.getFullYear() + "-" + format(Obj.getMonth()+1, 2) + "-" + format(Obj.getDate(), 2) + "_" + format(Obj.getHours(), 2) + "-" + format(Obj.getMinutes(), 2) + "-" + format(Obj.getSeconds(), 2);
}

function format(num, x) {
	num = String(num);
	return (x > num.length) ? new Array((x - num.length) + 1).join('0') + num: num;
}
})();

アクションを実行すると現在開いているタブの一覧が新規タブで開かれます。
チェックボックスにチェックが入っているものだけ出力されます。
デフォルトでチェックが入らないのはURIが「about〜、file〜、javascript〜」で始まるものです。
あとはテキストとURIを適当に編集したりしなかったりしてください。
その後、その新規タブでもう一度アクションを実行するとファイルが書き出されます。


以下のあたりを自分の好みの設定にすると良いんじゃないでしょうか。

var path = sleipnir.CreateObject("WScript.Shell").SpecialFolders("Desktop");

デフォルトではデスクトップに出力するようになっているので、My Dropboxだとか好きなフォルダにしてください。*2
そういえば、フォルダの存在チェックを忘れていたが気にしないことにしよう。

var Overwrite = true;

上書きフラグです。デフォルトではファイルを上書きするようになっています。
"true"を"false"にするとファイル名に保存日時が付加されます。

var fontsize = "150%";

文字サイズです。
テストでモバイルブラウザで開こうとしたとき字が小さかったので設定を付けてみました。*3

細かいところは手抜きなんでこんなところでしょう。

ぐちぐち

上でも触れてますがホントのところモバイルブラウザ→PCブラウザな方法が欲しかったんですけどねw
Sleipnir Mobile for Android でも SeaHorse的なの使えるようになったし、UAスクリプト的なの使えるようにならんかな。
いや、Bookmarkletで十分なんだけどね。APIがあるとまた色々出来るので。

アプリかサービス探すか自作しろよって話ですよね。

*1:フューチャーフォン時代は専ら2ちゃんROMってました

*2:パスの区切りの"\"は例のごとく"\\"にしてね

*3:拡大すれば事足りるんですけどねw