RSS renderer



'allo.

I've attached a renderer for RSS feeds.  It's still pretty rough, but
I'm hoping to get some feedback on how the RSS feeds should be
displayed.

Thanks!

-- 
Kevin Godby <godbyk yahoo com>
--- dashboard-pristine/backends/RSSBackend.cs	2004-02-20 16:14:26.000000000 -0600
+++ dashboard/backends/RSSBackend.cs	2004-02-23 12:57:50.000000000 -0600
@@ -34,6 +34,9 @@
 
 		protected override ArrayList ProcessClueSimple (Clue clue)
 		{
+			DateTime StartExec = DateTime.Now;
+			Console.WriteLine ("..Backend: RSS.. starting at {0}", StartExec);
+
 			ArrayList matches = new ArrayList();
 
 			XmlDocument xml = this.GetRSS (clue.Text);
@@ -113,9 +116,15 @@
 				if (guid != null)
 					match ["GUID"] = guid;
 
+				// Added by godbyk -- we'll see if this is all I need to do.  <crosses fingers>
+				match ["PubDate"] = item.PubDate;
+
 				matches.Add (match);
 			}
 
+			Console.WriteLine ("..Backend: RSS.. stopping at {0}", DateTime.Now);
+			Console.WriteLine ("..Backend: RSS.. elapsed time {0}", DateTime.Now - StartExec);
+
 			return matches;
 		}
 
@@ -148,7 +157,6 @@
 			ArrayList items = new ArrayList ();
 			XmlNodeList items_xml = xml.SelectNodes ("//item");
 			foreach (XmlNode item_xml in items_xml) {
-Console.WriteLine("1");
 				string guid    = this.GetXmlNodeText (item_xml, "guid");
 				string link    = this.GetXmlNodeText (item_xml, "link");
 				string title   = this.GetXmlNodeText (item_xml, "title");
//
// GNOME Dashboard
//
// RSSMatchRenderer.cs: Knows how to render RSS matches.
//
// Author:
//   Kevin Godby <godbyk yahoo com>
//

using System;
using System.Collections;
using System.Xml;
using System.IO;

namespace Dashboard {

	class RSSMatchRenderer : MatchRenderer {

		public int MaxEntries = -1;	// The max number of entries to show (per feed)
		public int MatchNumber = 0;	// This is used later on..

		public override void Startup ()
		{
			Type = "RSS";
		}

		public override string HTMLRenderMatches (ArrayList matches)
		{
			DateTime StartExec = DateTime.Now;
			Console.WriteLine ("..Renderer: RSS.. starting at {0}", StartExec);

			StringWriter sw = new StringWriter ();
			XmlWriter xw = new XmlTextWriter (sw);

			xw.WriteStartElement ("div");	// Start the rss results block
			// xw.WriteElementString ("u", "RSS Feed");	// Print the title
			// xw.WriteStartElement ("br");
			// xw.WriteEndElement ();	// br

			ArrayList Titles = new ArrayList ();
	
			// Get all the unique rss feed titles
			foreach (Match m in matches) {
				string Title = Convert.ToString (m ["Title"]);

				if (!Titles.Contains (Title))
					Titles.Add (Title);
			}

			// Let's display some output already!
			foreach (string title in Titles)
				HTMLRenderSingleRSSTitle (title, matches, xw);

			xw.WriteEndElement ();	// End rss results block

			xw.Close ();

			Console.WriteLine ("..Renderer: RSS.. stopping at {0}", DateTime.Now);
			Console.WriteLine ("..Renderer: RSS.. elapsed time {0}", DateTime.Now - StartExec);

			return sw.ToString ();
		}

		private void HTMLRenderSingleRSSTitle (string Title, ArrayList matches, XmlWriter xw)
		{
			string Icon = "internal:rss.png";

			// xw.WriteStartElement ("img");	// rss icon
			// xw.WriteAttributeString ("src", Icon);

			xw.WriteStartElement ("font");	// Make the font smaller to fit window width
			xw.WriteAttributeString ("size", "+0");

			xw.WriteString (" " + Title + " (RSS feed)");
			xw.WriteStartElement ("br");
			xw.WriteEndElement ();	// br

			xw.WriteStartElement ("ul");

			MatchNumber = 0;
			int NumEntries = 0;
			foreach (Match m in matches) {
				NumEntries++;
				if ((NumEntries <= MaxEntries) || (MaxEntries == 0) || (MaxEntries == -1))
					HTMLRenderSingleRSSItem (m, xw);
			}

			xw.WriteEndElement ();	// ul
			xw.WriteEndElement ();	// font

		}

		private void HTMLRenderSingleRSSItem (Match m, XmlWriter xw)
		{
			string Title       = Convert.ToString (m ["Title"]);
			string Description = Convert.ToString (m ["Description"]);
			string ItemTitle   = Convert.ToString (m ["ItemTitle"]);
			string Weblink     = Convert.ToString (m ["Weblink"]);
			string GUID        = Convert.ToString (m ["GUID"]);
			DateTime PubDate   = DateTime.Parse (Convert.ToString (m ["PubDate"]));
			string Icon        = "internal:rss.png";

			// Console.WriteLine ("..Renderer: RSS.. PubDate = {0}", PubDate);

			// Grab first sentence from Description
			string BareDescription = StripHTML (Description);
			string Sentence = BareDescription.Substring (0, BareDescription.IndexOf (".") + 1) + " . .";

			xw.WriteStartElement ("li");
			xw.WriteStartElement ("a");
			xw.WriteAttributeString ("href", Weblink);
			xw.WriteAttributeString ("style", "text-decoration: none;");
			xw.WriteString (ItemTitle);
			xw.WriteEndElement ();	// a href

			// If it's an entry from today, or the most recent entry show a short intro
			if ((PubDate == DateTime.Today) || (MatchNumber == 0)) {
				xw.WriteStartElement ("br");
				xw.WriteEndElement ();	// br

				xw.WriteStartElement ("font");
				xw.WriteAttributeString ("size", "-1");
				xw.WriteAttributeString ("color", "#666666");
				xw.WriteRaw (Sentence);
				xw.WriteEndElement ();	// font
				xw.WriteStartElement ("br");
				xw.WriteEndElement ();	// br
			}

			xw.WriteEndElement ();	// li

			MatchNumber++;
		}

		private string StripHTML (string myhtml) {
			// I'm sure there's a better regex or builtin function for this..
			System.Text.RegularExpressions.Regex tags = new System.Text.RegularExpressions.Regex(@"<[^>]+>|</[^>]+>");
			return tags.Replace(myhtml, "");
		}
	}
}

Attachment: rss-renderer.png
Description: PNG image



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]