#!/usr/bin/env ruby # This code comes from http://ruby-it.org/pages/Codice+LunaRss+0_5 # Check the page for copyright notice and explanations def rss_data @data ||= get_raw_data end require 'net/http' FeedData = Struct.new :channel, :titles, :descriptions, :links class Rss_parser def initialize(url, proxy=nil) @url_completo = url @url_no_http = @url_completo.gsub(/http\:\/\//,'') @url_http = @url_no_http.gsub(/\/.*/,'') @url_pagina = "/" + @url_completo.gsub(%r{http:\/\/.*?\/},'') @http_proxy = proxy end def esegui_parsing return FeedData.new( parse( channel_title_pattern ), parse( item_title_pattern ), parse( item_description_pattern ), parse( item_links_pattern ) ) end private def get_raw_data() if @http_proxy.nil? h = Net::HTTP.new(@url_http) else proxy_uri = URI.parse(@http_proxy) h = Net::HTTP::Proxy(proxy_uri.host, proxy_uri.port).new(@url_http) end resp,data = h.get(@url_pagina,nil) data.gsub!(/\0/,'') return data end def rss_data @data ||= get_raw_data end def parse pattern output_data = [] rss_data.scan pattern do |x| output_data << x end return output_data end def channel_title_pattern %r{.*?(?:(?:<!\[CDATA\[)*(.*?)(?:\]\]>)*.*?)?}m end def item_title_pattern %r{.*?(?:(?:<!\[CDATA\[)*(.*?)(?:\]\]>)*.*?)?}m end def item_links_pattern %r{.*?(?:(?:)*.*?)?}m end def item_description_pattern %r{.*?(?:(?:)*.*?)?}m end end ############################## def align text text.gsub(/^\s*\./m, '') end ############################## class RssMaker def header align <<-HTML .Content-type: text/html\r\n\r\n . . HTML end def footer align <<-HTML . . HTML end def channel name align <<-HTML .

#{name}

HTML end def entry titolo, descrizione, link align <<-HTML . . #{titolo} .
. . #{descrizione} .

HTML end end ############################## # Configurations feeds=[ 'http://www.repubblica.it/rss/scienza_e_tecnologia/rss2.0.xml', 'http://programmazione.it/rss.xml', 'http://www.hwupgrade.it/rss_news.xml', 'http://www.hwupgrade.it/rss_articoli.xml', 'http://www.beppegrillo.it/index.xml' ] NEED_PROXY = false #switch this if you have a proxy proxy_url = "http://10.0.0.2:8080" #put here your proxy, if you have one ############################## rss_make = RssMaker.new puts rss_make.header feeds.each do |feed| if NEED_PROXY parser = Rss_parser.new feed, proxy_url else parser = Rss_parser.new feed end data = parser.esegui_parsing puts rss_make.channel( data.channel ) 0.upto data.titles.length do|i| puts rss_make.entry( data.titles[i], data.descriptions[i], data.links[i] ) end end puts rss_make.footer