API de acceso a canales

Firefox 2 y Thunderbird 2 introducen una serie de interfaces que  hacen más sencillo que los autores de extensiones accedan a los canales RSS y Atom.

Interfaces del canal

nsIFeed
Representa un canal RSS o Atom.
nsIFeedContainer
Una clase básica subclasificada por varias interfaces relacionadas al canal.
nsIFeedElementBase
Una clase básica subclasificada por varias de las otras interfaces relacionadas con el canal.
nsIFeedEntry
Representa una única entrada en un canal RSS o Atom.
nsIFeedGenerator
Describe el programa que generó un canal RSS o Atom.
nsIFeedPerson
Representa a una persona. Contiene el nombre de la persona, la dirección de correo electrónico, y la dirección de la página personal.
nsIFeedProcessor
Analiza canales RSS y Atom.
nsIFeedProgressListener
Implementada por el programa que quiere analizar un canal RSS o Atom, para recibir mensajes durante el proceso de análisis.
nsIFeedResult
Describe el resultado al analizar un canal.
nsIFeedResultListener
Implementado por el programa que quiere analizar un canal RSS o Atom para recibir avisos cuando el análisis se complete.
nsIFeedTextConstruct
Representa valores de texto en un canal; incluye funciones que permiten traer el texto como texto sin formato o como HTML.
nsIScriptableUnescapeHTML
Una clase de utilidad que elimina las secuencias de escape de las cadenas HTML.

Ejemplo: Leer un canal de la Web

Realmente es bastante fácil leer y analizar un canal: Usa un XMLHttpRequest para cargar el canal, y luego pasa su cadena a un nsIFeedProcessor para analizarlo.

Cargar el canal y enviarlo al analizador sintáxtico se hace usando un código similar a éste:

  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("Error al analizar el canal.");
        }
      }
    }
    
    httpRequest = new XMLHttpRequest();
    
    httpRequest.open("GET", feedUrl, true);
    try {
      httpRequest.onload = infoReceived;
      httpRequest.send(null);
    }
    catch(e) {
      alert(e);
    }
  }

La interfaz nsIFeedProcessor te permite analizar los datos del canal desde varias fuentes distintas; en este caso, estamos cargando un documento en una cadena, para seguidamente analizar la cadena usando su método parseFromString(). Sin embargo, también se podría analizar desde un archivo usando parseFromStream(), o directamente desde una URL usando parseAsync().

El procesamiento real de análisis del canal se hace por un método llamado handleResult() en el objeto FeedTestResultListener. Ese código es similar a éste:

    FeedTestResultListener.prototype = {
      handleResult: function(result) {
        var feed = result.doc;
        
        feed.QueryInterface(Components.interfaces.nsIFeed);
    
        // Abre una nueva ventana
    
        var win = window.open("", "FeedTest_Window");
        var doc = win.document;
    
        doc.open();
        
        // Escribe la cabecera HTML y el título de la página
        
        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;
        
        // Write the article information
        
        if (!numItems) {
          doc.write("<i>¡Que no haya noticias es buena noticia!</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>");
            }
          }
        }
        
        // Cerramos el documento; ¡hemos acabado!
        
        doc.write("</body></html>");
        doc.close();
      }
    }

La función handleResult() recibe como argumento un nsIFeedResult que describe un canal; su propiedad doc es un nsIFeed que contiene todos los datos del canal.

Para obtener el título del canal, se consulta la propiedad feed.title. El título es un nsIFeedTextConstruct que puede representar el texto en varios formatos; obtenemos su propiedad text para representar el título del canal como un texto codificado en HTML. Podríamos, alternativamente, usar su método plainText() para obtener una copia del título traducido a texto sin formato.

Luego examinamos el array (arreglo) de artículos en el canal consultando el feed.items nsIArray. Este array contiene los objetos nsIFeedEntry que describen cada artículo del canal.

Construimos el contenido de los documentos accediendo a las propiedades del título, enlace, resumen y contenido para cada artículo. La URL completa del enlace se recupera usando el método resolve() del enlace.

Para iniciar la lectura de un canal, simplemente llamamos fetch(url). Esto abre una nueva ventana con el contenido del canal, pudiendo hacer clic en cada título de las entradas que nos llevarán al artículo en sí.

Para los detalles de cada uno de las interfaces de acceso al canal, visita sus respectivas páginas de referencia.

Etiquetas y colaboradores del documento

Contributors to this page: teoli, Jeremie, DoctorRomi, RickieesES, Mgjbot, Nukeador, Guis
Última actualización por: teoli,