金利0無利息キャッシング – キャッシングできます

 | 

2008-05-17

LDRでキーワードハイライトしながら読むGreasemonkeyスクリプト

02:19 | LDRでキーワードハイライトしながら読むGreasemonkeyスクリプト - 金利0無利息キャッシング – キャッシングできます を含むブックマーク はてなブックマーク - LDRでキーワードハイライトしながら読むGreasemonkeyスクリプト - 金利0無利息キャッシング – キャッシングできます

動作イメージ

http://gyazo.com/5226b0d4d8206002c12efae02d877592.png

作りかけ。複数語句のキーワードハイライトと、キーワードを含む記事を先頭に表示するようにする。

TODO: ハイライトするキーワードの追加削除インターフェース。購読フィードから検索結果フィード抜き出して勝手にキーワード一覧作っても良いかも。

更新した。

http://la.ma.la/misc/userjs/ldr_keywords_highlight.user.js

  • :keyword で設定できるようにした。
    • GM_setValueがunsafeWindowから呼べなくなってたらしい。setTimeout入れて回避。
  • 個人的にはこんなもんで必要十分かな。Firefoxでしか動作確認してない。
  • 表示速度が若干遅くなるはず。単なる文字列処理だから大したこと無いといえば無い。
// ==UserScript==
// @name           ldr highlight keywords
// @namespace      http://ma.la/
// @include        http://reader.livedoor.com/reader/
// @include        http://fastladder.com/reader/
// ==/UserScript==

var w = (typeof unsafeWindow != "undefined") ? unsafeWindow : window;
var keywords = [];

function load_keywords(){
	keywords = eval("("+GM_getValue("keywords")+")") || [];
	keywords = keywords.sort(function(a,b){return a.length == b.length ? 0 : a.length > b.length ? -1 : 1 });
}

function save_keywords(){
	GM_setValue("keywords", keywords.toSource());
}

function highlight(keywords, input){
	if (typeof keywords == "string") keywords = [keywords];
	var nodes = input.split(/(:?<.*?>)/);
	var text_nodes = nodes.
		filter(function(s){return s.indexOf("<") != 0}).
		join("\u0000").
		replace(new RegExp("("+keywords.join("|")+")", "ig"), '<span class="highlight">$1</span>').
		split("\u0000");
	 return nodes.map(function(v){
	 	return v.indexOf("<") != 0 ? text_nodes.shift() : v;
	 }).join("");
}

load_keywords();

w.LDR_addStyle("span.highlight",[
	"font-weight:bold;",
	"color:black !important;",
	"background-color:yellow !important;"
].join(""));

w.register_hook('BEFORE_PRINTFEED', function(feed){
	if (feed.__highlighted) return;
	var items = feed.items;
	items.forEach(function(item){
		var new_body = highlight(keywords, item.body);
		if (item.body != new_body){
			item.body = new_body;
			item.highlighted = true;
		}
	});
	feed.items = items.filter(function(item){return item.highlighted}).concat(items.filter(function(item){return !item.highlighted}));
	feed.__highlighted = true;
});

// :keyword => keyword list prompt
// TODO :keyword add word,word,word,word => add keyword
// TODO :keyword del|remove|delete|
w.register_command("keyword|keywords",function(mode, word){
	var s = w.prompt('input keywords (separated by ",")', keywords.join(", "));
	if (s){
		keywords = s.split(/\s*,\s*/);
		// Greasemonkey access violation: unsafeWindow cannot call GM_setValue
		w.setTimeout(save_keywords, 0);
		w.message("keywords saved.");
	}
});
トラックバック - http://subtech.g.hatena.ne.jp/mala/20080517
 |