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.