Hace un tiempo hice un lector de sindicación o RSS para poner noticias en una web en Ruby on Rails y me gustó la simpleza con la que se analizan los códigos y se pueden presentar las noticias. Sin mucho esfuerzo. Apenas unas líneas de código. Unos días más tarde me tocó hacerlo también en PHP. Aquí un ejemplo de simpleza de un framework, frente a un lenguaje.
Versión PHP
Empezaremos con la complicada. Este código se encarga de descargar el código del RSS y deserializar el XML en un array, para poder tratarlo a posteriori. El tratamiento lo haré en plan cutre, ya que me intentaré, sobretodo, basar en el proceso de descarga y deserialización.
Para esto, se requiere de una librería que no suele venir con PHP, pero sí está en PEAR, con lo que, se puede instalar fácilmente ejecutando la siguiente línea de comandos:
pear install XML_Serializer
Con esto, el código, en plan simple, sería el siguiente:
<?php
include 'XML/Unserializer.php';
function xml_to_array( $data ) {
$options = array(
"addDecl" => true,
"encoding" => "utf-8",
"mode" => XML_SERIALIZER_MODE_SIMPLEXML,
"indent" => " ",
"linebreak" => "\n",
"scalarAsAttributes" => true,
"attributesArray" => '_a',
"contentName" => '_c',
"rootName" => 'rss'
);
$unserializer = new XML_Unserializer($options);
$unserializer->unserialize($data);
$doc = $unserializer->getUnserializedData();
return $doc;
}
$data = xml_to_array(file_get_contents('http://www.debian.org/News/news'));
?>
<html>
<body>
<? foreach ($data["item"] as $noticia) { ?>
<h1><a href="<?=$noticia["link"]?>"><?=$noticia["title"]?></a></h1>
<p class="date"><?=date("d/m/Y H:i", strtotime($noticia["dc:date"]))?></p>
<p class="desc"><?=$noticia['description']?></p>
<? } ?>
</body>
</html>
No pinta mal, conseguimos lo que nos proponemos sin tener muchas complicaciones.
Ahora la versión bonita
En Rails las cosas siempre tienden a ser más simples, o al menos mucho más cortas, muestra de ello, es la versión del código anterior en versión Rails. Este sería:
def noticias
require 'rss/1.0'
require 'rss/2.0'
require 'open-uri'
source = "http://www.debian.org/News/news"
content = ""
open(source) do |s| content = s.read end
@rss = RSS::Parser.parse(content, false)
end
Aunque he puesto los require dentro de la función, realmente podrían ponerse en otro sitio (como en environment.rb) y no requieren de la instalación de ninguna gema extra. En la vista sería tan solo usar el código de la siguiente forma:
<% @rss.items.each do |i| %>
<h1><%= link_to i.title, i.link %></h1>
<p class="date"><%=i.date.strftime("%d/%m/%Y %H:%M")%></p>
<p class="desc"><%=simple_format(i.description)%></p>
<% end %>
Los helpers ayudan bastante en la creación del código, haciendo que los enlaces se hagan de forma simple, así como el formateado de la fecha, y el análisis del texto para HTML.
Conclusiones
He estado revisando el repositorio PEAR, donde he podido ver que había un par de paquetes de RSS, uno de ellos sin mantenimiento ya (XML_RSS), y el resto de blogs que he visitado lo hacen como he mencionado, por lo que, obliga a conocer los distintos formatos de los que se van a rescatar noticias, ya sean Atom, RSS (la versión que corresponda), etc. Me parece que en este sentido Rails ha demostrado ser más serio o aplicado.