Feed content access API
Firefox 2 と Thunderbird 2 は拡張製作者に RSS と Atom フィードへのアクセスを簡単にする一連のインターフェースを導入します。
フィードインタフェース
nsIFeed-
RSS あるいは Atom フィードを表します。
nsIFeedContainer-
サブクラスされたフィード関連の様々なインタフェースのベースクラス。
nsIFeedElementBase-
サブクラスされたフィード関連の他の様々なインタフェースのベースクラス。
nsIFeedEntry-
RSS あるいは Atom フィードの単一のエントリを表します。
nsIFeedGenerator-
RSS あるいは Atom フィードを生成したソフトウェアを記述します。
nsIFeedPerson-
人を表します。人の名前とメールアドレス及びホームページアドレスを含んでいます。
nsIFeedProcessor-
RSS と Atom フィードをパースします。
nsIFeedProgressListener-
パース処理中にメッセージを受け取るために RSS あるいは Atom フィードをパースしたいプログラムによって実装されます。
nsIFeedResult-
フィードのパースの結果を表現します。
nsIFeedResultListener-
パースが完了したときに通知を受け取るために RSS あるいは Atom フィードをパースしたいプログラムによって実装されます。
nsIFeedTextConstruct-
フィードのテキストを表します: テキストをプレーンテキストあるいは HTML でフェッチするための関数を含んでいます。
nsIScriptableUnescapeHTML-
HTML 文字列をアンエスケープするためのユーティリティクラス。
例: Web からフィードを読む
フィードを読み込みパースすることは本当に簡単です。 フィードを読み込むために XMLHttpRequest を使い、次にフィードをパースするためにその文字列を nsIFeedProcessor に渡します。
フィードを読み込み、パーサにそれを渡すことはこのようなコードを使って行うことができます:
fetch: function(feedUrl)
{
var httpRequest = null;
function infoReceived() {
var data = httpRequest.responseText;
var ioService = Components.classes['@mozilla.org/network/io-service;1']
.getService(Components.interfaces.nsIIOService);
var uri = ioService.newURI(feedUrl, null, null);
if (data.length) {
var parser = Components.classes["@mozilla.org/feed-processor;1"]
.createInstance(Components.interfaces.nsIFeedProcessor);
var listener = new FeedTestResultListener();
try {
parser.listener = listener;
parser.parseFromString(data, uri);
}
catch(e) {
alert("フィードのパースでエラーが発生しました。");
}
}
}
httpRequest = new XMLHttpRequest();
httpRequest.open("GET", feedUrl, true);
try {
httpRequest.onload = infoReceived;
httpRequest.send(null);
}
catch(e) {
alert(e);
}
}
nsIFeedProcessor インタフェースであなたはいくつかの可能なソースからフィードデータをパースできます; この場合、ドキュメントを文字列に読み込み、次に parseFromString() メソッドを使ってパースしています。しかし parseFromStream() を使ってファイルから、parseAsync() を使って直接 URL からパースすることもできます。
パースされたフィードの実際の処理は FeedTestResultListener オブジェクトの handleResult() を使って行われます。そのコードはこのようになります:
FeedTestResultListener.prototype = {
handleResult: function(result) {
var feed = result.doc;
feed.QueryInterface(Components.interfaces.nsIFeed);
// 新しいウィンドウを開く
var win = window.open("", "FeedTest_Window");
var doc = win.document.wrappedJSObject;
doc.open();
// HTML ヘッダとページタイトルを書き込む
doc.write("<html><head><title>Feed: " + feed.title.text + "</title></head><body>");
doc.write("<h1>" + feed.title.text + "</h1><p>");
var itemArray = feed.items;
var numItems = itemArray.length;
// 記事の情報を書き込む
if (!numItems) {
doc.write("<i>便りのないのは良い便り!</i>");
}
else {
var i;
var theEntry;
var theUrl;
var info;
for (i=0; i<numItems; i++) {
theEntry = itemArray.queryElementAt(i, Components.interfaces.nsIFeedEntry);
if (theEntry) {
theUrl =
doc.write('<b><a href="' + theEntry.link.resolve("") + '">' + theEntry.title.text + '</a></b><br>');
if (theEntry.summary) {
info = theEntry.summary.text + "</p><hr><p>";
}
else {
info = theEntry.content.text + "</p><hr><p>";
}
doc.write("<blockquote>" + info);
doc.write("</blockquote><p>");
}
}
}
// ドキュメントを閉じる; 完了!
doc.write("</body></html>");
doc.close();
}
}
handleResult() 関数はフィードを表現している nsIFeedResult を引数として受け取ります。doc プロパティは全てのフィードデータを含んだ nsIFeed です。
フィードのタイトルを得るためには、feed.title プロパティを見てください。タイトルは様々なフォーマットのテキストを表す nsIFeedTextConstruct です。HTML エンコードされたテキストとしてフィードのタイトルを得るために、その text プロパティを取得します。代りに plainText() メソッドを使うことで、プレーンテキストに変換されたタイトルのコピーを得ることができます。
次に、feed.items nsIArray を見ることでフィードのアイテムの配列をスキャンしています。この配列はそれぞれのフィードアイテムを表す nsIFeedEntry オブジェクトを含んでいます。
それぞれのアイテムの title と link、summary そして content プロパティをみることでドキュメントのコンテンツを作り上げています。 link の完全な URL は link の resolve() メソッドを使うことで得ることができます。
フィードのフェッチを初期化するには、単に fetch(url) と呼びます。これはフィードコンテンツを含む新しいウィンドウを開ききます。それはそれぞれのアイテムのタイトル(記事自体へのクリック可能なリンクを持っています)を持っています。
フィードアクセスインタフェースそれぞれの詳細は、個別のリファレンスページを見てください。