読者です 読者をやめる 読者になる 読者になる

スペースアルク 検索結果のAutoPagerizeとaddDocumentFilter(addFilterとの比較)

AutoPagerize

<
スペースアルクの検索結果はページ遷移のリンクがJavaScriptになっているため、XPathでどう頑張っても対応できないという話がAutoPagerize Wiki: siteinfo requestにあった。
それならと、AutoPagerizeにインクリメントモードとURLフィルターを追加するプラグインを書いてみた - 0xFFにアルク対応を入れてみました。

http://ss-o.net/userjs/test/autoincrementerplugin.user.js

(Minibuffer、AutoPagerizeLDRizeそれぞれの最新版との組み合わせで動作確認しています)
カスタムAutoPagerize - 0xFFをどうぞ。

今回はAutoPagerize.addDocumentFilterを使いました。
AutoPagerize.addDocumentFilterはAutoPagerize.addFilterと少し違っていて、比較してみるとこんな感じ。

filter比較 実行タイミング 引数 用途
addDocumentFilter 次のページの読み込みとhtml作成完了直後で、htmlの切り出し前であり「さらに次のページ」のURL取得前 htmlDoc(GM_xmlhttpRequestで取得したソースを元に作成したDocumentオブジェクト), this.requestURL (次のページとして取得したURL), this.info (使用しているSITEINFO) nextLink、pageElementの取得の補助、SITEINFOの動的な変更など
addFilter 次のページのhtmlを挿入後 page(htmlDocからgetElementsByXPath(this.info.pageElement, htmlDoc)で切り出した要素の配列。要素自身だと間違われやすいがあくまで配列。) 継ぎ足しした部分を他のScriptから操作したい場合など

今回の場合、addDocumentFilterをnextLink取得の補助として使いました。(M.$XはMinibufferの$X関数ですMinibufferに依存しないように修正しました)

if (location.host == 'eow.alc.co.jp' && getElementsByXPath) {
	var alc = function(doc){
		var a = getElementsByXPath('//table[@class="pageNavi"]//td[last()]/a',doc);
		if (a.length) a = a[0];
		else return;
		a.id = 'AutoPagerizeNextLink';
		a.href = a.href.replace(/javascript:goPage\("(\d+)"\)/,'./?pg=$1');
	}
	alc();
	window.AutoPagerize.addDocumentFilter(alc);
}