LDRizePinAddLinkPad.jsを一行だけ修正

我慢できずにやりました。

不具合は958さんのおかげで解消されたのでタイトル通り一行だけ追加。
API?のclearPin();を追加しただけです。

動作は

  • PinしたパラグラフのURLとタイトル相当部分をLinkPadに送ります。
  • LinkPadに渡したあとのPinはクリアされます。
  • 後述するやり方で導入した場合はLinkPadにちなんで”l(エル)”にしたかったのですがリスト表示と被ってしまうのでLDRの動作とキーバインドに倣って キーバインド”i(アイ)” で動作します。
  • キーバインドは自由に変えられます。

導入

LDRizeとLinkPad(ともに2007/11/23の時点での最新版)をすでに導入済みという前提で書きます。
1.以下のスクリプトをLDRizePinAddLinkPad.jsという名前でC:\Program Files\Fenrir & Co\Sleipnir\plugins\scripts*1フォルダに保存してください。

(function () {
	var path = sleipnir.UserFolder + 'setting\\linkpad.tmp';
	var fso = new ActiveXObject('Scripting.FileSystemObject');
	var stream;
	try {
		stream = fso.CreateTextFile(path, false);
	} catch(e) {
		stream = fso.OpenTextFile(path, 8);
	}
	var urls = _window.LDRize.getPinListURL();
	var pins = _window.LDRize.getPinList();
	if (urls.length == 0) {
		alert('ピンが設定されていません。');
		return;
	}
	for (var i = 0; i < pins.length; i++){
		try{
			pins[i].innerText.match(/(.*?)\r\n/)
		}catch(e){}
		stream.Write(RegExp.$1 + '\r\n' + urls[i] + '\r\n');
	};
	_window.LDRize.clearPin();
	stream.Close();
})();

2.次に {Sleipnirインストールディレクトリ}\plugin\seahorse\LDRize\ に keybindex.js というファイルを作成。
3.先ほど作成したkeybindex.jsをテキストエディタで開き、以下の内容をコピペして保存。

KEYBIND['i'] = function() {
	sleipnir.RunScript(sleipnir.ScriptFullName.replace(sleipnir.ScriptName, '').replace(/\.js$/, '') + '..\\scripts\\LDRizePinAddLinkPad.js');
};

これで次にLDRizeが動作したページからは ”i” でLinkPadにクリップできるはず。

*1:インストーラでのデフォルトインストール先の場合

LDRize with LinkPad

今さっきこれを書き終わってトラバの削除ボタンをクリックしたらページを再読み込みしやがって書いたのが全部消えてorz

今はSaveTextAreaでばっちり保存しながらだから大丈夫。気を取り直して書き直し。

 

最新版のLDRizeにはPinのパラグラフとURLにアクセスできるようになったのでちょっと書いてみた。
はっきり言ってLDRize同梱のLDRizePinAddHatebu.js と LinkPad同梱のスクリプト群とのコピペした程度のものです。LDRizePinAddLinkPad.jsとかで保存してみてください。

(function () {
	var path = sleipnir.UserFolder + 'setting\\linkpad.tmp';
	var fso = new ActiveXObject('Scripting.FileSystemObject');
	var stream;
	try {
		stream = fso.CreateTextFile(path, false);
	} catch(e) {
		stream = fso.OpenTextFile(path, 8);
	}
	var urls = _window.LDRize.getPinListURL();
	var pins = _window.LDRize.getPinList();
	if (urls.length == 0) {
		alert('ピンが設定されていません。');
		return;
	}
	for (var i = 0; i < pins.length; i++){
		pins[i].innerText.match(/(.*?)\r\n/)
		stream.Write(RegExp.$1 + '\r\n' + urls[i] + '\r\n');
	};
	stream.Close();

})();

LDRizeでPinしたところをLinkPadに送るってだけです。
LinkPadに送るタイトル部分をどうしようかと思ったけど、単純にパラグラフのinnerTextの一行を持ってきてみることにしてみました。
LinkPad自体が優秀だからタイトル部分がなくてもURLが表示されるし、タイトルが長すぎてもちゃんとツールチップが出るからこれでもいいかもしれない。むしろ、長めの方がLinkPadにマウスオーバーしたときにリンク内容がよくわかって良い感じ。
LDRizeとLinkPadとこのスクリプトを使うとLDRizeが有効な所ならすべてがはてブホッテントリみたいに気になった所をガンガンPinしていって見たいときに見るっていうことができて少なくとも僕的には便利。

958さんがこれを見てくれててさらに"あり"と思ってくれたら958さんによってブラッシュアップしてもらってLDRizeに同梱もしくはLDRize本体に組み込んでもらったら便利なんじゃないかと思ってみたり。

と、調子こいてみた。

これを書いてて気付いた

LinkPadを以前はほとんど使ってなくて今回新たに導入してみて気付いたんだけど、LinkPadも958さんの作だったのね。すごいっす。へこんでくるorz

958さんsuite(sweetではない)はすごく便利です。

スウィートなブラウジングを!(笑)

追記

こちらに最新版あります。

IEPanelやIEDock内でSleipnirScriptが使えるらしい。

本当は書きかけのエントリがあったのですが、タイミングも逃しまくったのですっとばします。
プヨぷよさんがまたしても素晴らしいことを発見&公表してくれました。

IEDockやIEPanelへISleipnirを渡せるということです。

これってIEDockExとIEPanelExのことを指してるのでしょうか?Dockが併記されているところからするとそうでしょう。

で、やってみた。

orz

できない・・・。

SeaHorseスクリプトは”@type SleipnirScript”にして対象URLをローカルHTMLへのフルパスを設定。
スクリプトの内容はプヨぷよさんの所のコピペ。

ローカルファイル側にボタン要素に

 function pnir(){
	sleipnir.alert(sleipnir.api.url);
 }

上記の関数をonclickイベントとしてセットしたのですが・・・ 予定通りいかずorz


このIEPanelEXやIEDockEXにISleipnirが渡せるというプヨぷよさんのエントリを仕事の休憩中に知りました。
となるとPanel内でCRUDアプリがサーバ無しでできると思って仕事中に2つほどネタまで考えてたのになぁ。

最近ちょっと疲れ気味で夜起きていられないのでもう寝ます。

SeaHorseプラグインに関して

某掲示板でSeaHorseプラグインに関して書かれていたので個人的な感想&またまた要望

SeaHorseは便利だと思います。いろいろなサイトのUIを自分好みに調整することで格段にサイトが使いやすくなったりします。これによって作業効率が格段に上がったりするわけです。
特に僕の場合は仕事で大活躍。一つの事柄を調べるのに今まではAのサイトではこの情報を、Bのサイトではこの情報をといった感じにあちこちを見て回ってやっと調べ終わることがSeaHorseプラグインを使ってスクリプトを書くことで社内WEBアプリにアクセスするだけでA・Bのサイトから必要な情報だけを引っ張ってきて社内WEBアプリ内に埋め込めるわけです。このプラグインができたときはそりゃもううれしかった。
ただ、プライベートではAutopagerizeとSaveTextAreaくらいしか頻度の高いスクリプトがないのが事実。なかなか汎用的に使えるスクリプトが少なかったりしてます。このあたりはFxのGMスクリプトはユーザ数が半端なく多いのでいろいろとあっていいですよね。このあたりは負けている感あり。
SeaHorseプラグインとGMスクリプトではSOLiteくらいしか大きなアドバンテージを感じない。
そのSQLiteをもっと生かしていかなければと自分で感じてはいるもののDB周りの知識がしっかりしてないと難しい。
僕もがんばってみんなに使ってもらえるようなスクリプトを書いてみたいと思ってはみてるのですがなかなか良いアイディアが浮かばなかったり、技術が足りずに実装できなかったりです。
GMスクリプトでうらやましいところと言えばXPath
XPathさえ使えれば。 XPathさえ・・・・。
GMスクリプトの移植もあそこがクリアできればあとはとりあえずごまかせる気がするんですよね。
XPathJavaScriptで実装している例もいくつかありますがどれもなかなか使いづらかったりするようで、958氏が「AutoPagerize for SeaHorse」を書いてくださっていますがやはりXPathのせいでいろいろと苦労されているように思います。それでも違う方法で移植してしまうところが本当にすごいっす。

ということで要望

XPathをどうにか使えるようにしてください〜〜〜〜。

「おまえががんばれよ」

ちょっとは僕も貢献できるように努力します。

最近ちょくちょく

Function 'IsEnableRestore' cannot found.

といったエラーがでます。
これはRememberMeExtensionのRestore.js内に定義されている関数のようなです。
発生の厳密な条件・タイミングの方はまだはっきり分かりませんが報告までに。

すごいっす

先週の土曜日に作ろうとしていたものを作ってくれた人がいました。
ブックマークレットから起動できるブックマークレットエディタを作ってみた | fladdict

当初の構想
  1. Sleipnirスクリプトで起動
  2. JavaScriptをごにょごにょかいてページ上に対して実行
  3. 改行できる(FirebugのConsoleがなじめないので)
  4. お気に入りみたいに何パターンか保存できる

エディタ部分の作成で早くも断念してましたorz

このブックマークレットのすごいところ
  • 上記構想をすべて満たしているところ

”何パターンか保存”って言う部分はタブをいくつか開いてれば次に起動したときも前回実行時のスクリプトが残っているのでOK。見た目もかっこいいし、最高です。
こいつがあればスクリプトの勉強に最適。jQueryブックマークレットからインクルードさせてこいつでごにょごにょ遊ぶのに便利に使えます。これがしたくて自作しようとしてたので。

FLEXで造られてるようですが、FLEXってこういうこともできるのですね。
機会があれば勉強してみたいです。

おまけ

さっきこのエントリを書いてるときに間違って「戻る」をしてしまって、またこのエディタ画面にに戻ってきたもののorz
消えていました。
そこでサジタリウスのボタンをみると『復』のアイコンが輝いているではないですか!
そこでぼちっとな。
復元しないorz
しょうがないのでRememberMeExtensionが安定動作するまではブログを書くときはSaveTextAreaを使うようにします。

Googleの検索結果をjkで

今さら感全開です。
に触発されて昔、移植したものを中途半端に公開します。

雑用系
nagatonさんのスクリプトをベースにSleipnirでも動くようにしてみたつもりです。

プヨぷよ氏のGoogleAutoPager+にも一応対応しているはずです。

キーバインド

  • j:フォーカスを進める
  • k:フォーカスを戻す
  • r:手動で検索件数を取得

ダメなところ

  1. GoogleAutoPagerの読み込みより速くjを連打すると追加読み込み分にフォーカスできない。
  2. スクロールが汚い。
  3. jを一回打鍵するとスクロール位置にかかわらず一番はじめからフォーカスしていく。

1に関してはrで読み込み直すかゆっくりと適当にjやkを押してたらとりあえず戻りますorz
2に関してははてなみたいにフォーカスするリンクを一番上にスクロールさせるのが個人的にいやだったので100だけ押されるごとにスクロールさせるようにしたのがだめっぽい。モニタとかフォントサイズに依存してると思うのでスクロール量は要調整。
3ホイールスクロールとかで下の方までスクロールさせた状態でjを打鍵すると一気にふりだしに戻ってしまうのがイマイチ。ここをはてなみたいに現在のビュー内の一番上にきているリンクにフォーカスするようにしたいけど実現方法が全く思い浮かばず。ヘルプミー

やりたいこと

  • はてなみたいにPinを立ててまとめて開く。

以下ソース

// ==UserScript==
// @name        Google_jk
// @namespace   original By nagaton    http://d.hatena.ne.jp/nagaton/
// @description    LDRやはてブ風にj/kでフォーカス移動。
// @include     http://www.google.*/search*
// @version     1.00   2007/08/02
// ==/UserScript==

(function() {
	var current = -1;
	var links = 0;
	
	function getElementsByClassName(oElm, strTagName, strClassName){  //どこからかを忘れてしまいましたが頂ものの関数です。感謝。
		var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
		var arrReturnElements = new Array();
		strClassName = strClassName.replace(/\-/g, "\\-");
		var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
		var oElement;
		for(var i=0; i<arrElements.length; i++){
			oElement = arrElements[i];		
			if(oRegExp.test(oElement.className)){
				arrReturnElements.push(oElement);
			}	
		}
		return (arrReturnElements)
	}
	
	function get_links() {
		links = getElementsByClassName(document, "a","l");
	} // End of get_links

	function get_links_alert() {
		links = getElementsByClassName(document, "a","l");
		alert(links.length);
	} // End of get_links_alert

	get_links();
	
	var listeners = {
		'j' : focusNext,
		'k' : focusPrev,
		'r' : get_links_alert
	}
	
	function focusNext() {
		if (++current > links.length - 1) get_links();
		select();
	}
	
	function focusPrev() {
		if (--current < 0) current = links.length - 1;
		select();
	}
	
	function select() {
		var link = links[current];
//		link.parentNode.scrollIntoView(false);
		link.parentNode.scrollIntoView(true);
		window.scrollBy(0, -100);
		if (current == 0) window.scrollBy(0, -100);
		link.focus();
	}
	
	document.attachEvent(
		'onkeypress',
		function(event) {
			var target = event.srcElement;
			if (target.nodeName != 'INPUT' || target.type != 'text') {
				var f = listeners[String.fromCharCode(event.keyCode)];
				if (f) f();
	 		}
		},
	false);
})();

書籍検索スクリプト祭り

昨日のエントリSleipnirを初心者がいじりまくるブログのsidus氏からコメントをいただいたので調子に乗ってみます。

昨日の本やタウン書籍検索(ISBN)の解説

前提

まず全く書いていなかったのですがあのスクリプトはSleipnirScriptとして使うことを前提としています。
右クリックメニューなんかに登録すると便利だと思います。

ISBNってなんなのさ

書籍につけられたIDナンバーみたいなものです。
amazon(書籍)でいうところのASINに相当します。
基本的に同じタイトルの本でも改訂されるとISBNが変わります。
e-honやYahooBooksなどオンライン書店で本の詳細をみるページで「ISBN 〜〜〜〜」といった感じで表示されています。
去年末まで国内の書籍には4から始まる10桁の数字だったのですが、今年からは978から始まる13桁に移行しました。

動作説明

文字列を選択した状態でスクリプトを実行してください。
選択文字列にISBNがあればそのISBNで検索します。
ISBNにハイフンが含まれていても、また含まれていなくても大丈夫です。
選択文字列中のISBNの前に数字とX以外が含まれていても大丈夫です。
選択文字列中のISBNの後ろはどうなっていても選択文字列中の最初に出現するISBNで検索します。
おすすめのISBNの文字列選択の方法があります。ISBN上でダブルクリックしてみてください。多くのサイトでISBNのみを選択できると思います。

応用編

本やタウン書籍検索(ISBN)の18行目の

	pnir.NewWindow("http://www.honya-town.co.jp/hst/HTdispatch?free=&free_andor=0&title=&title_andor=0&title_title=1&title_subtitle=1&title_series=1&title_original=1&author=&author_list=0&publisher=&date_yy_from=&date_mm_from=&date_yy_to=&date_mm_to=&list_kensu=20&stamp_style=0&price_from=&price_to=&isbn_cd="+ISBN+"&vague_search=1&pub_stat=2&nips_cd=&submit.x=0&submit.y=0",true);

の行を

	pnir.NewWindow("http://www.e-hon.ne.jp/bec/SA/Detail?refISBN="+ISBN,true);

に差し替えてもらうとe-honで検索出来ます。

他にも

楽天ブックス

	pnir.NewWindow("http://esearch.rakuten.co.jp/rms/sd/esearch/vc?sv=30&v=2&oid=000&f=A&g=001&p=0&s=0&e=0&sitem="+ISBN,true);

amazon

	pnir.NewWindow("http://www.amazon.co.jp/exec/obidos/ASIN/"+ISBN,true);

YahooBooks

	pnir.NewWindow("http://books.yahoo.co.jp/book_search/isbn?os=1&isbn="+ISBN,true);

さらに応用

感のいい人にはもうおわかりだと思いますが、要するに本の詳細をみるページのURLにその本のISBN(10桁のハイフンなし)が含まれていれば
そこを差し替えてやれば他の本もそこで検索できるわけです。

実際にやって見ました。

自作のスクリプトになかったbk-1でやってみます。

本の詳細をみるページのURLを確認します。

トップページを開いてみます。

トップにはその時期の売れ筋とかが載っていますので今回は「毎日かあさん4」をクリックしてみます。

詳細画面が表示されました。ここでアドレスバーに注目。

一見、ISBNのようなそれらしい数字が並んでいますがこれは違います。本やタウンやYahooBooksなどでも同様のコードが使われています。
僕はこの数字の生成方法がわからないのでこのままでは検索できません。
こういった場合には別の方法があります。
多くの場合「詳細検索」のような細かく検索条件が指定できるところがあるのでそこにいきます。
bk-1でも上部の検索フォームの横に「詳細検索」があります。
「詳細検索」ページでISBNのみを指定して検索してみます。

ここではISBN”4798013951”と入力し検索してみてください。


するとアドレスバーにはさっきとは違ってものすごく長いクエリ文字列がくっついたURLが表示されています。
よ〜く見てみると先ほど入力したISBNが含まれています。
やっと目的のURL発見です。

書き換え作業です。

http://www.bk1.jp/webap/user/SchDetailBibList.do?keyword=&genreCd=&title=&author=&publisher=&isbn=4798013951&searchFlg=2&sortType=00&hdnPageMax=10&hdnPageNo=1&publicationYM=&ageOfUse=&productFlg=1&reviewFlg=9&submit=%E3%80%80%E6%A4%9C%E7%B4%A2%E9%96%8B%E5%A7%8B%E3%80%80&rootType=0&dp18=

この長いクエリ文字列をはじめからISBNまでの部分とISBNより後ろの部分をこのように括ります。

"http://www.bk1.jp/webap/user/SchDetailBibList.do?keyword=&genreCd=&title=&author=&publisher=&isbn="

"&searchFlg=2&sortType=00&hdnPageMax=10&hdnPageNo=1&publicationYM=&ageOfUse=&productFlg=1&reviewFlg=9&submit=%E3%80%80%E6%A4%9C%E7%B4%A2%E9%96%8B%E5%A7%8B%E3%80%80&rootType=0&dp18="


ISBNの数字の部分はスクリプト内では変数ISBNに格納されていますので連結させるとこうなります。

"http://www.bk1.jp/webap/user/SchDetailBibList.do?keyword=&genreCd=&title=&author=&publisher=&isbn="+ISBN+"&searchFlg=2&sortType=00&hdnPageMax=10&hdnPageNo=1&publicationYM=&ageOfUse=&productFlg=1&reviewFlg=9&submit=%E3%80%80%E6%A4%9C%E7%B4%A2%E9%96%8B%E5%A7%8B%E3%80%80&rootType=0&dp18="

後は本やタウン書籍検索(ISBN)の18行目の部分をこのような形式で書き換えればOKです。

pnir.NewWindow(ここにさっき連結させたURLが入る,true);

よって

	pnir.NewWindow("http://www.bk1.jp/webap/user/SchDetailBibList.do?keyword=&genreCd=&title=&author=&publisher=&isbn="+ISBN+"&searchFlg=2&sortType=00&hdnPageMax=10&hdnPageNo=1&publicationYM=&ageOfUse=&productFlg=1&reviewFlg=9&submit=%E3%80%80%E6%A4%9C%E7%B4%A2%E9%96%8B%E5%A7%8B%E3%80%80&rootType=0&dp18=",true);

となります。

終わり

他のオンライン書店に対応させる分にはJavaScriptの知識なしで可能なのでチャレンジしてみてください。
もう眠いので寝ます。