alexbm8_p5_ruby

code format="ruby"
 * 1) !/usr/bin/ruby

require 'rss/1.0' require 'rss/2.0' require 'open-uri' # Librería para trabajar con URLs require 'rexml/document' # Librería para el manejo de XML
 * 1) Incluimos las librerias que necesitamos

include REXML # La añadimos al espacio de nombre local

class Crea_html def initialize(rss,num_titulares,num_carac) @rss = rss @num_titulares = num_titulares @num_carac = num_carac end
 * 1) Clase que permite crear código HTML con la información parseada del RSS

# Método que genera la página web def escribe

# Establecemos el máximo de caracteres para la descripción del RSS max_description_length = @num_carac

# Mostramos el título del canal con su enlace html = " #{@rss.channel.title} " # Fecha de actualización (si existe) html << " Actualizado el #{@rss.channel.date.strftime('%m/%d/%Y')} " \ if @rss.channel.date # Descripción del canal html << " #{@rss.channel.description} " html << ""

# Recorremos todos los titulares del feed @rss.channel.items.each do |i|

if @num_titulares > 0

# Creación de la lista numerada de noticias, cada una con su correspondiente enlace html << " #{i.title} " # Fecha de publicación html << " Publicado el #{i.date.strftime("%m/%d/%Y")} at \         #{i.date.strftime("%I:%M%p")} " if i.date # Descripción de la noticia (eliminando caracteres inválidos) desc_text = i.description.gsub(/<[^>]+>/,"").squeeze(" ").strip if desc_text.length > max_description_length desc_text = desc_text[0,max_description_length] + "&hellip;" else desc_text = i.description end html << "#{desc_text}" html << "" # Fin de la lista numerada

@num_titulares = @num_titulares - 1

end

end

html << "" # Fin de la lista

# Creamos el fichero HTML escribiendo el contenido de la variable html a partir del final del mismo File.open("RSS.html","a") do |f| f.write(html) end

end # Fin del método escribe

end # Final de la clase Crea_html



sources = ["http://feeds.feedburner.com/idg/es/computerworld?format=xml","http://feeds2.feedburner.com/CienciaKanija","http://feeds.feedburner.com/vnunet/es/GizmodoES","http://www.futurdigital.com/es/feed/","http://feeds2.feedburner.com/microsiervos","http://feeds.feedburner.com/microsiervos/wtf"] descripcion = ["Computer world", "Ciencia Kanija", "Gizmodo", "Futuro Digital", "Microsiervos", "WTF? Microsiervos"]
 * 1) Definimos el vector de URLs con los feeds RSS que el programa incluye por defecto

content = "" # El contenido del feed RSS "en crudo" (sin parsear) se cargará en esta variable

print "\n************************\n" print "*                     *\n" print "*  alexbm8 PLANET     *\n" print "*                     *\n" print "************************\n\n"

# Cargamos los nuevos feeds añadidos por el usuario (en caso de que haya añadido algunos) leyendo del documento RSS.xml documento = 'RSS.xml' file = File.new(documento) doc = Document.new(file)

# Obtenemos las URLs de los feeds así como los títulos elegidos por el usuario doc.root.elements['URL'].each_element('direccion') { |direc| sources[sources.length] = direc.text }   doc.root.elements['Descripcion'].each_element('titulo') { |desc| descripcion[descripcion.length] = desc.text }

# Cerramos el fichero para poder modificarlo después file.close

print "=> RSS's disponibles <=\n" print "************************\n"

cont = 1 descripcion.each do |aux| print cont print ") " + aux + "\n"   cont = cont + 1 end
 * 1) Mostramos los feeds disponibles (los incluídos por defecto más los añadidos por el usuario)

print "\n-Desea agregar una fuente que no aparezca en la lista?(1 = si, 0 = no): " var = gets.to_i
 * 1) Damos al usuario la opción de añadir nuevos feeds. Éstos no se perderán con una nueva ejecución del programa

if (var == 1)

print "\n-Introduca la URL del feed RSS: " nueva_url = gets print "\n-Introduca un nombre para la RSS: " nueva_descripcion = gets

# Añadimos el nuevo feed y su descripción a los vectores correspondientes sources[sources.length] = nueva_url descripcion[descripcion.length] = nueva_descripcion

# Creamos el documento xml donde almacenaremos únicamente los feeds extra añadidos por el usuario xml = "\n" xml << "\n"

xml << "\n" cont = 0 # Almacenamos todas las URLs una detrás de otra, al igual que las descripciones, para que sea más fácil acceder a las mismas sources.each do |aux| if (cont > 5) # Usamos > 5 porque en la aplicación hay 6 RSS disponibles por decfecto y sólo almacenamos los nuevos xml << " " xml << aux xml << " \n" end cont = cont + 1 end xml << "\n"

xml << "\n" cont = 0 descripcion.each do |aux| if (cont > 5) xml << " " xml << aux xml << " \n" end cont = cont + 1 end xml << "\n"

xml << ""

# Borramos el fichero previo sin que se pierda información, ya que el contenido del fichero anterior ha sido salvado en los correspondientes vectores (sources y descripcion) File.delete("RSS.xml")

# Creamos el nuevo fichero xml con todos los nuevos feeds File.open("RSS.xml","a") do |f| f.write(xml) end

# Mostramos de nuevo todos los feeds disponibles cont = 1 descripcion.each do |aux| print cont print ") " + aux + "\n"       cont = cont + 1    end

end

cont = 0 vector_RSS = [] elegidas = [] print "\nIntroduzca la RSS a mostrar: " var = gets.to_i
 * 1) Seleccionamos los RSS que queremos ver en el planet

while var != 0 vector_RSS[cont] = sources[var-1] elegidas [cont] = descripcion [var-1] cont = cont + 1 print "\n-Desea agregar otra fuente de la lista?(para terminar pulse 0): " var = gets.to_i end
 * 1) Podemos seleccionar los RSS que deseemos, en el orden que queramos, uno a uno

print "\nHa elegido las fuentes siguientes:\n" elegidas.each do |aux| print aux + "\n" end
 * 1) Mostramos las RSS's elegidas

print "\nIntroduzca el numero de titulares que desea: " n_title = gets.to_i
 * 1) Insertamos el nº de titulares por RSS

print "\nIntroduzca el numero de caracteres de la noticia que desee que aparezcan en el planet (recomendado 100): " n_carac = gets.to_i
 * 1) Insertamos la extensión de la descripción de cada noticia

File.delete("RSS.html")
 * 1) Borramos  el fichero HTML resultado de la anterior ejecución

cabecera = "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>" cabecera << "\n" cabecera << " \n" cabecera << "<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />\n" cabecera << "<meta http-equiv='content-language' content='es' />" cabecera << " Planet de Alejandro Barea Montoya \n" cabecera << "<link href='estilos_alexbm8.css' rel='stylesheet' type='text/css'>" cabecera << " \n" cabecera << " \n" cabecera << " <font color='#00FF00'>Planet alexbm8 \n"
 * 1) Creamos el planet como página HTML

File.open("RSS.html","a") do |f| f.write(cabecera) end
 * 1) Escribimos la cabecera de la página HTML

vector_RSS.each do |source|

# Abrimos la URL del feed y accedemos a su contenido open(source) do |s| content = s.read end # Parseamos el contenido a formato RSS rss = RSS::Parser.parse(content, false) # Creamos el código HTML perteneciente al feed elegido con las opciones pertinentes pagina = Crea_html.new(rss,n_title,n_carac) pagina.escribe

end

cierre = " \n" cierre << " \n"
 * 1) Añadimos a la página el cierre de la etiquetas finales

File.open("RSS.html","a") do |f| f.write(cierre) end

code