Advertisement
Guest User

Feeds

a guest
Oct 24th, 2013
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rails 5.59 KB | None | 0 0
  1. require "gtk3"
  2. require "webkit-gtk"
  3. require "rss"
  4. require "open-uri"
  5. require "forwardable"
  6.  
  7. class FeedCollector
  8.     attr_reader :feeds
  9.     def initialize
  10.         feeds = %w(
  11.             http://hosted.ap.org/lineups/TOPHEADS.rss?SITE=AP&SECTION=HOME
  12.             http://feeds.feedburner.com/cnet/tcoc?format=xml
  13.             http://www.google.com/doodles/doodles.xml
  14.         )
  15.         feed = nil
  16.         threads = []
  17.         for uri in feeds
  18.             threads << Thread.new(uri) do |u|
  19.                 text = ""
  20.                 open(u) do |f|
  21.                     text = f.read
  22.                 end
  23.                 rss = RSS::Parser.parse(text, false)
  24.                 Thread.current[:feed] = rss
  25.             end
  26.         end
  27.         @feeds = []
  28.         threads.each do |t|
  29.             t.join
  30.             @feeds.push t[:feed]
  31.         end
  32.     end
  33. end
  34.  
  35. class MainWindow < Gtk::Window
  36.     def initialize
  37.         super
  38.         Gtk.init
  39.         self.signal_connect "destroy" do
  40.             Gtk.main_quit
  41.         end
  42.         @layout = Gtk::Box.new(Gtk::Orientation::HORIZONTAL)
  43.         self.add(@layout)
  44.     end
  45.  
  46.     def l_add(widget)
  47.         @layout.add(widget)
  48.     end
  49.  
  50.     def pack_start(widget)
  51.         @layout.pack_start(widget)
  52.     end
  53.  
  54.     def pack_end(widget)
  55.         @layout.pack_end(widget)
  56.     end
  57. end
  58.  
  59. class FeedList < Gtk::ScrolledWindow
  60.     def initialize(feeds, parent)
  61.         super()
  62.         @feeds = feeds
  63.         @layout = Gtk::Box.new(Gtk::Orientation::VERTICAL)
  64.         @feeds.each do |feed|
  65.             @layout.add(FeedListItem.new(feed, parent))
  66.         end
  67.         self.add(@layout)
  68.     end
  69.  
  70.     class FeedListItem < Gtk::Button
  71.         def initialize(feed, parent)
  72.             super()
  73.             @layout = Gtk::Box.new(Gtk::Orientation::HORIZONTAL)
  74.             @feed, @title, @count = feed, feed.channel.title, feed.items.size
  75.             @f_name = Gtk::Label.new
  76.             @f_name.set_wrap(true)
  77.             @f_name.set_alignment(0, 0)
  78.             @f_name.set_markup "<b>#{@title}</b>"
  79.             @f_count = Gtk::Label.new
  80.             @f_count.set_wrap(true)
  81.             @f_count.set_alignment(1, 0)
  82.             @f_count.set_markup "<b>#{@count}</b>"
  83.             @layout.pack_start(@f_name)
  84.             @layout.pack_end(@f_count)
  85.             self.add(@layout)
  86.             self.signal_connect "clicked" do
  87.                 parent.feed = feed
  88.             end
  89.         end
  90.     end
  91. end
  92.  
  93. class FeedListWindow < Gtk::Box
  94.     def initialize(feeds, parent)
  95.         super(Gtk::Orientation::VERTICAL)
  96.         @label = Gtk::Label.new
  97.         @label.set_markup "<b>Feeds</b>"
  98.         self.add(@label)
  99.         self.pack_end(FeedList.new(feeds, parent))
  100.         self.set_size_request(200, -1)
  101.     end
  102. end
  103.  
  104. class FeedItems < Gtk::ScrolledWindow
  105.     def initialize(items, parent = nil)
  106.         super()
  107.         @items = items
  108.         @layout = Gtk::Box.new(Gtk::Orientation::VERTICAL)
  109.         @items.each do |item|
  110.             item = FeedItem.new(parent, item.title, item.link, item.date, item.description)
  111.             @layout.add(item)
  112.         end
  113.         self.add(@layout)
  114.     end
  115.  
  116.     class FeedItem < Gtk::ToggleButton
  117.         attr_reader :title, :link, :date, :description
  118.         attr :timestamp
  119.         def initialize(parent, title, link, date, description)
  120.             super()
  121.             @layout = Gtk::Box.new(Gtk::Orientation::VERTICAL)
  122.             @timestamp = Date.new
  123.             @title, @link, @date ,@description = title, link, date, description
  124.             @short_desc = @description[0..100] + "..."
  125.             @header = Gtk::Label.new
  126.             @header.set_wrap(true)
  127.             @header.set_alignment(0, 0)
  128.             @header.set_markup "<b>#{@title}</b>"
  129.             @desc = Gtk::Label.new
  130.             @desc.set_wrap(true)
  131.             @desc.set_alignment(0, 1)
  132.             @desc.set_text "#{@short_desc}"
  133.             @layout.pack_start(@header)
  134.             @layout.pack_end(@desc)
  135.             self.add(@layout)
  136.             self.signal_connect "clicked" do
  137.                 parent.load_html(@description, "./")
  138.             end
  139.         end
  140.     end
  141. end
  142.  
  143. class FeedWindow < Gtk::Box
  144.     def initialize(feed, parent)
  145.         super(Gtk::Orientation::VERTICAL)
  146.         @parent = parent
  147.         @title, @count = feed.channel.title, feed.items.size
  148.         @label = Gtk::Label.new
  149.         @label.set_markup "<b>#{@title} (#{@count} articles)</b>"
  150.         self.add(@label)
  151.         @feed = FeedItems.new(feed.items, @parent)
  152.         self.pack_end(@feed)
  153.         self.set_size_request(375, -1)
  154.     end
  155.  
  156.     def feed=(feed)
  157.         @feed.destroy()
  158.         @title, @count = feed.channel.title, feed.items.size
  159.         @label.set_markup "<b>#{@title} (#{@count} articles)</b>"
  160.         @feed = FeedItems.new(feed.items, @parent)
  161.         self.pack_end(@feed)
  162.         @feed.show()
  163.     end
  164. end
  165.  
  166. class Browser < Gtk::ScrolledWindow
  167.     extend Forwardable
  168.     def_delegator :@browser, :load_html_string, :load_html
  169.     def initialize
  170.         super()
  171.         @browser = WebKitGtk::WebView.new
  172.         self.add(@browser)
  173.     end
  174. end
  175.  
  176.  
  177. if __FILE__ == $PROGRAM_NAME
  178.     window = MainWindow.new
  179.     uri = "http://hosted.ap.org/lineups/TOPHEADS.rss?SITE=AP&SECTION=HOME"
  180.     text = ""
  181.     open(uri) do |f|
  182.         text = f.read
  183.     end
  184.     rss = RSS::Parser.parse(text, false)
  185.     collector = FeedCollector.new
  186.     web = Browser.new
  187.     feed = FeedWindow.new(rss, web)
  188.     list = FeedListWindow.new(collector.feeds, feed)
  189.     window.l_add(list)
  190.     window.l_add(feed)
  191.     window.pack_end(web)
  192.     window.show_all
  193.     Gtk.main
  194. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement