旧札幌市西区

http://d.hatena.ne.jp/kei-s/ だったもの

Google Readerでfaviconを表示

Google Readerを使い始めました。まだまだなイマイチなところはあるけれど、Labs入りなのでお試し中ですね。
で、

にインスパイアされて、Google Readerfaviconを表示させるGreasemonkeyスクリプトを作りました。


faviconwithgooglereader.user.jsをインストール

『no title』の改良 - ドレッシングのようなを参考に、faviconが無い場合にデフォルトアイコンを表示できるようにもしました。

	var showBlankIcon = true;

にしてください。
上記の3名様、Google Reader開発者、Greasemonkey開発者、Firefox開発者、そしてすべてのひとに感謝を。
いちおソースは以下。コピペがばれます。

更新

.com以外のドメインにも対応しました.Yasimaさんありがとうございます。

更新

表示を修正しました。id:turipatさんありがとうございます。

// ==UserScript==
// @name          Favicon with Google Reader
// @namespace     http://libelabo.jp/
// @description   A script to add favicons next to links on Google Reader
// @include       http://www.google.tld/reader/view/*
// @include       https://www.google.tld/reader/view/*
// ==/UserScript==

(function() {
	
	var showBlankIcon = false;
	
	
	
	var timerID = null;
	
	function findNode(root, xpath) {
		var result = document.evaluate(xpath, root, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
		if (! result.snapshotLength) return null;
		return result.snapshotItem(0);
	}
  
	function addFaviconToNode(link,node) {
		var favicon = document.createElement('img');
		favicon.setAttribute('class', 'entry-favicon');
		favicon.src = "http://" + link.hostname + "/favicon.ico";
		favicon.width = 16;
		favicon.alt   = "";
		favicon.style.border = "0";
		favicon.align = "top";

		if( showBlankIcon ){
			var g = link.parentNode;
			
			var favicon_container = document.createElement('div');
			favicon_container.style.cssFloat = 'left';
			favicon_container.style.minWidth = '16px';
			favicon_container.style.minHeight = '16px';
			favicon_container.style.backgroundImage = 'url("chrome://global/skin/icons/folder-item.png")';
			
			favicon_container.appendChild(favicon);
			node.parentNode.insertBefore(favicon_container,node);
		}
		else{
			favicon.style.marginRight = "1ex";
			node.parentNode.insertBefore(favicon,node);
		}
	}
	
	function getFaviconImg(node){
		return findNode(node,'.//img[@class="entry-favicon"]');
	}
	
	function addFavicons() {
		var entries = document.getElementById('entries');
		for (var i=0; i< entries.childNodes.length; i++) {
			var entry = entries.childNodes[i];
			var collapsedTitle = findNode(entry, './/div[@class="collapsed"]//h2');
			var entryContainerTitle = findNode(entry, './/div[@class="entry-container"]//h2');
			
			var link = null;
			var title = null;
			if (entryContainerTitle != null) {
				link = entryContainerTitle.firstChild;
				title = link.firstChild.textContent;
			} else if (collapsedTitle != null) {
				link = collapsedTitle.parentNode.parentNode.firstChild;
				title = collapsedTitle.textContent;
			}
			if ( link != null ){
				if ( entryContainerTitle != null && getFaviconImg(entryContainerTitle) == null ){
					addFaviconToNode(link,link.firstChild);
				}
				else if (collapsedTitle != null && getFaviconImg(link.parentNode) == null){
					addFaviconToNode(link,collapsedTitle);
				}
			}
		}
	}

timerID = setInterval(addFavicons, 3000);

})();