mozilla

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 ) と呼びます。これはフィードコンテンツを含む新しいウィンドウを開ききます。それはそれぞれのアイテムのタイトル(記事自体へのクリック可能なリンクを持っています)を持っています。

フィードアクセスインタフェースそれぞれの詳細は、個別のリファレンスページを見てください。

ドキュメントのタグと貢献者

タグ: 
Contributors to this page: teoli, Mgjbot, Taken, Gomita
最終更新者: teoli,