googleリーダーではてブの内容を表示します…のグリースモンキースクリプト
はてブをgoogleリーダーで読んでも、タイトルとコメントだけであまりうれしくない。ので、フィードから内容を取得するものを作ってみた。
使ってみると、すごく便利!!
でもなくて、結構フィードがないサイトが多いのと、古い内容のものはフィードに含まれてないやらで、ちょっとがっかりです。なので、たまに取得できるとくじが当たったみたいで幸せな気分になれます。…たぶん。
はじめて作ったので、出来が悪いと思います。こうしたほうがいいぞとか言ってもらえるとうれしいです。
(追記)大事なこと忘れてた。ショートカットキーで操作したときのみ取得します。
// ==UserScript== // @name Show Bookmark Feed Content // @namespace http://www.google.co.jp/reader // @description Show Bookmark Feed Content // @include http://www.google.co.jp/reader/* // ==/UserScript== function getElementByClass(obj,cla){ if(obj&&obj.hasChildNodes()){ var nodes=obj.childNodes,len=obj.childNodes.length; for(var ind=0;ind<len;ind++){ if(nodes[ind].nodeType==1 && (new RegExp(cla)).test(nodes[ind].className)){ return nodes[ind]; } else{ var ret=getElementByClass(nodes[ind],cla); if(ret!=undefined)return ret; } } } }; function checkLinkTag(details){ if (details.readyState == 4) { if (details.status == 200) { var text = details.responseText.match (/<link([\s\t]*\w+\=\"[^>]*\"[\s\t]*[\n]*)+[\/]*>/g); try{ text.forEach(function(linktag){ if(/type\=\"[\w]+\/rss\+[\w]+\"/i.test(linktag) ){ var href = linktag.match(/(href\=\")(.*)\"/); getFeedDescription(href[2]); throw StopIteration; } }); }catch(e){ } } } insertDescription(''); } var title; var itemb; function insertDescription(d){ var insert = document.createElement('div'); insert.className='inserted'; insert.innerHTML = d; var bq = itemb.getElementsByTagName('blockquote'); bq[0].appendChild(insert); } var xmlns = new Namespace("http://purl.org/rss/1.0/"); function getFeedDescription(url){ GM_xmlhttpRequest({ method:'GET', url:url, headers:{ 'User-Agent':'monkeyagent', 'Accept':'text/monkey,text/xml', }, onload:function(details){ if (details.readyState == 4) { if (details.status == 200) { var xml = new XML(details.responseText.replace (/^<\?.*?\?>/,'')); var channeltitle = xml..xmlns::channel; channeltitle.xmlns::title.toString()==title[0] ? title=title[1] : title=title[0]; var items = xml..xmlns::item ; if(items.length()==0)items = xml.channel.item; var titles=[]; for(var i=0,l=items.length();i<l;i++){ var item = items[i]; var itemtitle = item.xmlns::title; if(!(itemtitle.length()>0))itemtitle = item.title; if((new RegExp(title)).test(itemtitle)){ var des = item.xmlns::description; if(des.length==0)des.item.description; insertDescription(des); titles=null; break; } titles.push(itemtitle); } //if(titles)alert(title + '\n' + titles); } } } }); } function checkItem(){ var selectedfeed = getElementByClass(document.getElementById('sub-tree'), 'link selected cursor|link cursor'); if(/.*http%3A%2F%2Fb\.hatena\.ne\.jp%2F[^%]*%2Frss/.test( selectedfeed.getAttribute('href'))){ var cent = document.getElementById('current-entry'); if(cent){ var entrytl = getElementByClass(cent,'entry-title-link'); var link = entrytl.getAttribute('href'); title = entrytl.childNodes[0].nodeValue.match( /([^-]*)\s-\s([^-]*)|([^:]*):\s([^:]*)|([^\|]*)\s\|\s([^\|]*)/); if(title){ var title2=[]; title.forEach(function(t,i){ if(i>0 && t)title2.push(t); }); title=title2; }else{ title = entrytl.childNodes[0].nodeValue; } itemb = getElementByClass(cent,'item-body'); var ins = getElementByClass(itemb,'inserted'); if(!ins){ GM_xmlhttpRequest({ method:'GET', url:link, headers:{ 'User-Agent':'monkeyagent', 'Accept':'text/monkey,text/xml', }, onload:checkLinkTag}); } } } } document.addEventListener('keyup', checkItem,false);
つまづいたのがサイトのタイトルと記事のタイトルの並びと区切り。前後バラバラで、コロンやら縦棒やら丸括弧などでくぎられているので統一されていたらいいなーと思いました。