|
|
||
動作イメージ
作りかけ。複数語句のキーワードハイライトと、キーワードを含む記事を先頭に表示するようにする。
TODO: ハイライトするキーワードの追加削除インターフェース。購読フィードから検索結果フィード抜き出して勝手にキーワード一覧作っても良いかも。
更新した。
http://la.ma.la/misc/userjs/ldr_keywords_highlight.user.js
// ==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."); } });