Googleリーダーでチャフから穀物を分離する



グリースモンキー 職場では、Habrや他のテーマサイトを読まないようにしていますが、中毒性が高すぎます。 一日中記事を読むことができますが、仕事については何もできません。 しかし、新しくて面白いものも見逃したくないので、さまざまなRSSフィードを購読しています。 仕事の後、週末には頻繁に、Googleリーダーを開いて、蓄積された投稿のリスト全体を閲覧します。 それらのいくつかは、私にとって興味のあるトピックについて書かれていますが、それ以外は書かれていません。 メールを読んだことを思い出させます。受信したメールとスパムのみが同じフォルダにあります。



最初はこれに我慢しましたが、今週末、Greasemonkeyスクリプトを使用して状況を修正しました。





Google Readerスクリーンショット



Google Readerに「既読としてマークを選択」という新しいボタンが表示され、各記事にはチェックボックスがあります。



今、投稿のリストを見ると、私はすぐに自分にとって面白くないことに気付き、1つのボタンでそれらを「読む」ことができます。 さらに注意深い研究に値するものだけが残っています。



アイデアが気に入ったら Greasemonkeyスクリプトをインストールできます。 Mozilla FirefoxおよびGreasemonkey拡張機能が必要です。



欠点の中でも、スクリプトがGoogle Chromeで動作できないことに注意する価値があります。 この理由は、生成されたKeyboardEventの処理中のブラウザーエラーです。



念のため、スクリプトのソースコードを公開します。

// ==UserScript==

// @name Google Reader - Mark selected items as read

// @namespace twitter.com/rodiontsev

// @description This script adds a button "Mark selected as read" and checkbox for each item.

// @include htt*://www.google.tld/reader/view/*

// ==/UserScript==



/*

Version history



1.0 on 10/01/2009:

- Initial version.

*/



var buttonText = "Mark selected as read" ;

var buttonId = "mark-selected-as-read" ;

var articles = new Array();



document .addEventListener( "DOMNodeInserted" , function ( event ){nodeInserted( event );}, true );



function nodeInserted( event ) {

var entries = document .getElementById( "entries" );

if (entries && matchClass(entries, "list" )) {

var button = document .getElementById(buttonId);

if (!button) {

articles = new Array();

appendButton();

}



var element = event .target;

if (element. className && element.className.match(/entry\s+entry-\d+/) != null ) {

articles.push(element);



var checkbox = document .createElement( "input" );

checkbox.type = "checkbox" ;

checkbox.className = "mark-selected-as-read-checkbox-class" ;

checkbox.style.marginRight = "9px" ;

checkbox.style.verticalAlign = "top" ;

checkbox.addEventListener( "click" , function ( event ) { event .stopPropagation();}, true );

var entrySecondary = element.getElementsByClassName( "entry-secondary" )[0];

entrySecondary.insertBefore(checkbox, entrySecondary.firstChild);

}

}

}



function appendButton() {

var viewerTopControlsId = "viewer-top-controls" ;

var markAllAsReadId = "mark-all-as-read-split-button" ;



var divVewerTopControls = document .getElementById(viewerTopControlsId);

var btnMarkAllAsRead = document .getElementById(markAllAsReadId);



if ((divVewerTopControls != null ) && (btnMarkAllAsRead != null )) {

var button = document .createElement( "div" );

button.className = "goog-button goog-button-base unselectable goog-inline-block goog-button-float-left goog-button-tight scour-disabled viewer-buttons" ;

button.id = buttonId;

button.innerHTML = "<div class=\"goog-button-base-outer-box goog-inline-block\">"

+ "<div class=\"goog-button-base-inner-box goog-inline-block\">"

+ "<div class=\"goog-button-base-pos\">"

+ "<div class=\"goog-button-base-top-shadow\"> </div>"

+ "<div class=\"goog-button-base-content\">"

+ "<div class=\"goog-button-body\">" + buttonText + "</div>"

+ "</div>"

+ "</div>"

+ "</div>"

+ "</div>" ;

button.addEventListener( "click" , markSelectedAsRead, false );

divVewerTopControls.insertBefore(button, btnMarkAllAsRead);

}

}



function matchClass (element, sClassName) {

return (sClassName

&& element.className

&& element.className.length

&& element.className.match( new RegExp( "(^|\\s+)(" + sClassName + ")($|\\s+)" )));

}



function simulateClick(node) {

var event = node.ownerDocument.createEvent( "MouseEvents" );

event .initMouseEvent( "click" , true , true , window, 1, 0, 0, 0, 0, false , false , false , false , 0, null );

node.dispatchEvent( event );

}



function simulateKeypress(node, keyCode) {

var event = node.ownerDocument.createEvent( "KeyboardEvent" );

event .initKeyEvent( "keypress" , true , true , null , false , false , false , false , keyCode, 0);

node.dispatchEvent( event );

}



function simulateRead(node) {

simulateKeypress(node, 77); //"m" button - mark entry as read.

}



function simulateCollapse(node) {

simulateKeypress(node, 79); //"o" button - expand/collapse entry.

}



function getArticleIcon(article) {

var divs = article.getElementsByTagName( "div" );

for ( var i = 0; i < divs.length; i++) {

var div = divs[i];

if (matchClass(div, "entry-icons" )) return div;

}

return null ;

}



function markSelectedAsRead() {

var container = document .getElementById( "entries" );

container.style.display = "none" ;

for ( var i = 0; i < articles.length; i++) {

var article = articles[i];

var checkbox = article.getElementsByTagName( "input" )[0];

if (checkbox. checked ) {

if (!(matchClass(article, "read" ))) {

var articleIcon = getArticleIcon(article);

simulateClick(articleIcon);

if (!(matchClass(article, "read" ))) {

simulateRead(articleIcon);

}

if (matchClass(article, "expanded" )) {

simulateCollapse(articleIcon);

}

}

checkbox. checked = false ;

}

}

container.style.display = "block" ;

}



* This source code was highlighted with Source Code Highlighter .







All Articles