柔軟なフィード表示ライブラリ「feedrenderer.js」を作りました
今週の話題にも書きましたが、サイドバーの Twitter ウィジェットを表示していたところを Google Buzz ウィジェットに差し替えてみました。私は tweet_amplifier.rb でつぶやきも Google Buzz に転送しているので、結果的に Twitter と Buzz 双方の発言が表示されます。
現在のところ、公式な Google Buzz ウィジェットは公開されていないので、このウィジェットは私の Google プロフィールにある Buzz のフィードを読み込んで表示しています。それを実現するために、汎用的なフィード読み込み & HTML レンダリングライブラリ「feedrenderer.js」を作りましたので、本日はそれを公開します。特徴は以下のとおりです。
- Google AJAX Feed API を利用して、 JavaScript のみでフィードを読み込む。
- 多数のフィード形式を統一して扱える。
- RESTful 形式の API を利用してるので、 Google AJAX Feed API の JavaScript ライブラリを読み込む必要がない。
- Closure Library のモジュールとしても、独立したライブラリとしても利用できる。
- HTML のテンプレートを指定するだけで、簡単に表示形式をカスタマイズできる。
- JavaScript により、各フィールドの表示フォーマットや全体の表示をより細かくカスタマイズできる。
商用利用も含めて、ご自由にご利用ください。ただし、利用に際して発生した問題に関しては、あくまで自己責任でお願いします。
基本的な使い方
それでは、使い方をご紹介します。ライブラリの JavaScript は以下の場所にあるので、ダウンロードして適切な場所に保存してください。
http://webos-goodies.googlecode.com/svn/trunk/prod...
そして、 HTML ファイルに以下のように記述すれば、フィードの最新 4 つのエントリを表示できます。
<ul id="feed"></ul>
<script type="text/javascript" src="feedrenderer.js"></script>
<script type="text/javascript">
window.onload = function() {
var renderer = new FeedRenderer({ template:'<li><a href="%url%">%title%</a></li>' });
renderer.render('http://webos-goodies.jp/atom.xml', 'feed');
};
</script>
以下、実行結果です。ライブでこのブログのフィードを表示しています。
HTML コードでだいたいおわかりかと思いますが、 FeedRenderer クラスのコンストラクタに渡している template パラメータが各エントリを HTML に挿入する際のテンプレート文字列になっています。この中の「%〜%」という部分が、対応するフィールドに置き換えられます。
実際のリクエストは render メソッドによって行われ、第 1 引数のフィードの内容を第 2 引数で指定した要素にテンプレートに沿った形式で挿入します。
テンプレートを変更するだけで表示方法を簡単に変更できるので、テーブル、リストなど、その場に応じた形式でフィードを表示できます。テンプレートで使えるフィールド名は AJAX Feed API が返す JSON そのままですので、詳細は AJAX Feed API のリファレンスをご参照ください。
カスタマイズ
表示するデータの見た目などは、コンストラクタや render メソッドに渡す引数によって柔軟にカスタマイズできます。以下、可能なカスタマイズをご紹介します。
各フィールドの出力フォーマットの変換
テンプレート文字列内のプレースホルダを各フィールドの値で置き換える際、デフォルトでは単純に HTML エスケープをかけただけのものを使います。この動作を変更したいときは、必要なフィールドごとの変換関数を格納したオブジェクトを用意し、それを setFormatter メソッド(もしくはコンストラクタの formatter パラメータ)に渡してください。
以下はフィードの日付を表示する例です。
<ul id="feed"></ul>
<script type="text/javascript" src="feedrenderer.js"></script>
<script type="text/javascript">
window.onload = function() {
var template = '<li><a href="%url%">%title%</a> (%publishedDate%)</li>';
var formatter = {
'publishedDate': function(value, entry) {
var date = new Date(value);
return date.getMonth() + '/' + date.getDate();
}
};
var renderer = new FeedRenderer();
renderer.setTemplate(template);
renderer.setFormatter(formatter);
/* 上の3行は以下と等価
var renderer = new FeedRenderer({ template:template, formatter:formatter }); */
renderer.render('http://webos-goodies.jp/atom.xml', 'feed');
};
</script>
実行例
変換関数は 2 つの引数をとり、変換結果(テンプレートのプレースホルダを置換する文字列)を返す関数です。
format_func(value, entry)
- value
- フィールドの値です。値の形式は AJAX Feed API のレスポンスそのままです。
- entry
- AJAX Feed API が返す JSON データの json['feed']['entries'] 配列内の、現在処理中のフィールドを含む要素です。これを使って他のフィールドの値を参照した条件分岐(link が設定されている時のみ contentSnippet にリンクを設定するなど)が行えます。
最終出力のカスタマイズ
フィールドごとのカスタマイズのほか、最終的に HTML をドキュメントに挿入する部分の処理も差し替え可能です。これにより、フィードのソートや行ごとに異なったスタイルを設定するなどの処理が可能です。
最終出力のカスタマイズは、 render メソッドの第 2 引数に文字列の代わりに関数を指定することで行います。以下は背景色を交互に変更する例です。
<div id="feed"></div>
<script type="text/javascript" src="feedrenderer.js"></script>
<script type="text/javascript">
window.onload = function() {
function output(html, json) {
for(var i = 0 ; i < html.length ; ++i) {
html[i] = html[i].replace('<c>', (i & 1) ? '#cef' : '#efc');
}
document.getElementById('feed').innerHTML = html.join('');
}
var renderer = new FeedRenderer({ template:'<div style="background-color:<c>">%title%</div>' });
renderer.render('http://webos-goodies.jp/atom.xml', output);
};
</script>
実行例
出力関数は 2 つの引数をとる関数です。戻り値は無視されますので、関数内でドキュメントへの HTML の挿入まで行う必要があります。
output_func(html, json);
- html
- 各エントリごとの HTML への変換結果(formatter_func の返り値)の配列です。これを加工することで表示のカスタマイズが可能です。
- json
- AJAX Feed API が返す JSON オブジェクトです。例えばフィードのタイトルは json.feed.title でアクセスできます。
その他のカスタマイズ
render メソッドの第 3 引数にオブジェクトを指定することで、 AJAX Feed API のオプションが指定できます。指定できるフィールドは以下のとおりです。
| フィールド名 | 機能 |
|---|---|
| num | 取得するフィードの最大数を指定します。デフォルトは 4 。 |
| scoring | 'h' を指定することで、フィードから取り除かれた過去のエントリも含めて取得します。 |
以下はフィードの取得数を 8 に増やした例です。
<ul id="page_example4"></ul>
<script type="text/javascript" src="feedrenderer.js"></script>
<script type="text/javascript">
window.onload = function() {
var renderer = new FeedRenderer({ template:'<li><a href="%url%">%title%</a></li>' });
renderer.render('http://webos-goodies.jp/atom.xml', 'page_example4', { 'num': 8 });
};
</script>
実行例
API キーの指定
必須ではありませんが、 AJAX Feed API を利用する際は API キーの指定が推奨されています。こちらのページで API キーを取得し、 FeedRenderer クラスのコンストラクタで以下のように指定してください。
new FeedRenderer({ key: '取得したAPIキー', template:'<div>%title%</div>', ... });
Closure Library での利用
FeedRenderer クラスは Closure Library で構築されており、同様に Closure Library を利用したプロジェクトではモジュールとして組み込むことが可能です。 Closure Library については、 こちらの記事をご参照ください。
以下にソースがありますので、これをアプリケーションの中に組み込んでください。
http://webos-goodies.googlecode.com/svn/trunk/cms/...
これで、 wg.FeedRenderer のクラス名で前述の機能が利用できます。ただし、 Closure Compiler による最適化に対応するため、多少の注意が必要です。まず、正常に JSONP のレスポンスを受け取るため、以下のようにレスポンスの処理関数をエクスポートし、コールバック名を指定してください。
goog.exportSymbol('wg.FeedRenderer.processResponse', wg.FeedRenderer.processResponse);
wg.FeedRenderer.setDefaultCallbackName('wg.FeedRenderer.processResponse');
そして、コンストラクタや render メソッドに渡すオプションのオブジェクトのキーは、必ずダブルクォーテーションもしくはシングルクォーテーションで囲ってください。
new wg.FeedRenderer({ 'template': '<div>%title%</div' });
/* これではダメ
new wg.FeedRenderer({ template: '<div>%title%</div' }); */
formatter のフィールド名なども同様です。忘れやすいのでご注意ください。
以上、本日は Web ページ中に簡単にフィードのエントリを表示できる JavaScript ライブラリ「feedrenderer.js」をご紹介しました。フィード形式で入手できるデータは毎日凄まじい勢いで増加しているので、ぜひこのライブラリを活用して、皆さんのサイトにさまざまなデータを取り込んでみてください。
詳しくはこちらの記事をどうぞ!

この記事にコメントする