private void NewsletterFeed(string newsletterName, XmlTextWriter newsletter) { NewsletterManager nm = new NewsletterManager(Federation, TheLinkMaker); TopicVersionInfo info = Federation.GetTopicInfo(newsletterName); if (!info.Exists) { throw new Exception("Newsletter " + newsletterName + " does not exist."); } if (!info.HasProperty("Topics")) { throw new Exception("Topic " + newsletterName + " is not a newsletter; no Topics property defined."); } string desc = info.GetProperty("Description"); if (desc == null) { desc = ""; } newsletter.WriteStartDocument(); newsletter.WriteStartElement("rss"); newsletter.WriteAttributeString("version", "2.0"); newsletter.WriteStartElement("channel"); newsletter.WriteElementString("title", newsletterName); newsletter.WriteElementString("description", desc); Uri link = new Uri(new Uri(FullRootUrl(Request)), TheLinkMaker.LinkToTopic(info.TopicRevision, true)); newsletter.WriteElementString("link", link.AbsoluteUri); DateTime last = DateTime.MinValue; foreach (QualifiedTopicName topic in nm.AllTopicsForNewsletter(info.TopicRevision.AsQualifiedTopicName())) { FormatRssItem(topic, newsletter); TopicVersionInfo each = new TopicVersionInfo(Federation, topic.AsQualifiedTopicRevision()); DateTime lm = each.LastModified; if (lm > last) { last = lm; } } newsletter.WriteElementString("lastBuildDate", last.ToUniversalTime().ToString("r")); newsletter.WriteEndElement(); newsletter.WriteEndElement(); }
public void BuildFeed() { QualifiedTopicRevision topic = GetTopicVersionKey(); NamespaceManager storeManager = Federation.NamespaceManagerForTopic(topic); LinkMaker lm = TheLinkMaker; ArrayList entryList = new ArrayList(); StringBuilder feed = new StringBuilder(); StringBuilder errFeed = new StringBuilder(); StringBuilder errEntry = new StringBuilder(); bool feedInit = false; bool feedError = false; bool entryError = false; string author = ""; string feedTitle = ""; string feedUUID = ""; string feedLogo = ""; string feedIcon= ""; string blogCategory =""; feed.AppendLine(@"<?xml version=""1.0"" encoding=""utf-8""?>"); feed.AppendLine(@"<!DOCTYPE message ["); feed.AppendLine("<!ENTITY nbsp \" \"> ]>"); feed.AppendLine(@"<feed xmlns=""http://www.w3.org/2005/Atom"">"); errFeed.AppendLine(@"<pre id=""Error"" class=""Error"" style=""background: #F00;"">"); errFeed.AppendLine("The Feed errors described below need to be corrected"); if (storeManager.GetTopicInfo(topic.LocalName).HasProperty("Title")) { feedTitle = storeManager.GetTopicProperty(topic.LocalName, "Title").LastValue; } else { feedError = true; } if (storeManager.GetTopicInfo(topic.LocalName).HasProperty("Creator")) { author = storeManager.GetTopicProperty(topic.LocalName, "Creator").LastValue; } string feedLink = BaseUrl + lm.LinkToTopic(topic); if (storeManager.GetTopicInfo(topic.LocalName).HasProperty("FeedUUID")) { feedUUID = storeManager.GetTopicProperty(topic.LocalName, "FeedUUID").LastValue; } else { feedError = true; } if (storeManager.GetTopicInfo(topic.LocalName).HasProperty("FeedLogo")) { feedLogo = storeManager.GetTopicProperty(topic.LocalName, "FeedLogo").LastValue; } if (storeManager.GetTopicInfo(topic.LocalName).HasProperty("FeedIcon")) { feedIcon = storeManager.GetTopicProperty(topic.LocalName, "FeedIcon").LastValue; } if (storeManager.GetTopicInfo(topic.LocalName).HasProperty("BlogCategory")) { blogCategory = storeManager.GetTopicProperty(topic.LocalName, "BlogCategory").LastValue; } if (storeManager.GetTopicInfo(topic.LocalName).HasProperty("BlogTopics")) { entryList = storeManager.GetTopicInfo(topic.LocalName).GetListProperty("BlogTopics"); } ParserEngine _parser = new ParserEngine(storeManager.Federation); errEntry.AppendLine(@"<pre id=""Error"" class=""Error"" style=""background: #F00;"">"); errEntry.AppendLine("The Entry errors described below need to be corrected"); if (entryList.Count > 0) { foreach (string entryTopicName in entryList) { string entryTitle = ""; string entryAuthor = ""; string entryLink = ""; string entryUUID = ""; string entryContent = ""; System.DateTime lastModified = new DateTime(); QualifiedTopicRevision entryTopicRev = new QualifiedTopicRevision(entryTopicName, storeManager.Namespace); TopicVersionInfo topicVerInfo = new TopicVersionInfo(storeManager.Federation, entryTopicRev); if (topicVerInfo.Exists) { if (storeManager.GetTopicInfo(entryTopicName).HasProperty("Creator")) { entryAuthor = storeManager.GetTopicProperty(entryTopicName, "Creator").LastValue; if (String.IsNullOrEmpty(author)) { author = entryAuthor; } } else { if (!String.IsNullOrEmpty(author)) { entryAuthor = author; } else { feedError = true; errFeed.AppendLine(" Error: The feed does not have a property named 'Creator' or the property does not contain a value."); author = "Author Unspecified"; entryAuthor = author; } } if (storeManager.GetTopicInfo(entryTopicName).HasProperty("Title")) { entryTitle = storeManager.GetTopicProperty(entryTopicName, "Title").LastValue; } else { entryTitle = storeManager.GetTopicInfo(entryTopicName).ExposedFormattedName; } lastModified = storeManager.GetTopicLastModificationTime(entryTopicName).ToUniversalTime(); if (!feedInit) { if (feedError) { feedError = true; if (entryList.Count == 0) { errFeed.AppendLine("Error: Feed does not have a property 'BlogTopics' or that property value is empty"); } if (!String.IsNullOrEmpty(feedTitle)) { feed.AppendFormat(@"<title>{0}</title>", feedTitle); } else { feed.AppendLine("<title>Feed title Unspecified</title>"); errFeed.AppendLine("Error: Feed does not have a property 'Title' or value is empty."); } feed.AppendLine(@"<author>"); feed.AppendFormat(@"<name>{0}</name>", author); feed.AppendLine(@"</author>"); if (!String.IsNullOrEmpty(feedUUID)) { feed.AppendFormat(@"<id>urn:uuid:{0}</id>", feedUUID); } else { feed.AppendFormat(@"<id>urn:uuid:{0}</id>", System.Guid.NewGuid().ToString()); errFeed.AppendLine("Error: Feed does not have a property 'FeedUUID' or value is empty. A temporary value has been assigned"); } feed.AppendFormat(@"<updated>{0:s}Z</updated>", lastModified); if (!String.IsNullOrEmpty(feedLogo)) { feed.AppendFormat(@"<logo>{0}</logo>", feedLogo); } if (!String.IsNullOrEmpty(feedIcon)) { feed.AppendFormat(@"<icon>{0}</icon>", feedIcon); } if (!String.IsNullOrEmpty(blogCategory)) { feed.AppendFormat(@"<category term=""{0}"" />", blogCategory); } errFeed.AppendLine("</pre>"); } else { feed.AppendFormat(@"<title>{0}</title>", feedTitle); feed.AppendFormat(@"<link href=""{0}"" rel=""self"" type=""application/atom+xml"" />", feedLink); feed.AppendFormat(@"<updated>{0:s}Z</updated>", lastModified); feed.AppendFormat(@"<icon>{0}</icon>", feedIcon); feed.AppendFormat(@"<logo>{0}</logo>", feedLogo); feed.AppendLine(@"<author>"); feed.AppendFormat(@"<name>{0}</name>", author); feed.AppendLine(@"</author>"); feed.AppendFormat(@"<id>urn:uuid:{0}</id>", feedUUID); if (!String.IsNullOrEmpty(blogCategory)) { feed.AppendFormat(@"<category term=""{0}"" />", blogCategory); } } feedInit = true; } if (storeManager.GetTopicInfo(entryTopicName).HasProperty("EntryUUID")) { entryUUID = storeManager.GetTopicProperty(entryTopicName, "EntryUUID").LastValue; } else { entryError = true; entryUUID = System.Guid.NewGuid().ToString(); errEntry.AppendLine("Error: Entry does not have a property 'EntryUUID' or value is empty. A temporary value has been assigned"); } entryLink = BaseUrl + lm.LinkToTopic(entryTopicRev); errEntry.AppendLine("</pre>"); string body = storeManager.GetTopicInfo(entryTopicName).GetProperty("_Body").ToString(); WomDocument xmldoc = new WomDocument(null); xmldoc = _parser.FormatTextFragment(body, entryTopicRev, storeManager, true, 600); xmldoc.ParsedDocument = @"<?xml version=""1.0"" encoding=""utf-8""?> <!DOCTYPE message [ <!ENTITY nbsp "" ""> ]> <div id=""womDocRoot"">" + xmldoc.ParsedDocument + "</div>"; entryContent = _parser.WikiToPresentation(xmldoc.XmlDoc); //string entryContent = Formatter.FormattedTopic(entryTopicRev, OutputFormat.HTML, null, storeManager.Federation, lm); feed.AppendLine(@"<entry>"); feed.AppendFormat(@"<title>{0}</title>", entryTitle); feed.AppendFormat(@"<link href=""{0}"" />", entryLink); feed.AppendFormat(@"<id>urn:uuid:{0}</id>", entryUUID); feed.AppendFormat(@"<updated>{0:s}Z</updated>", lastModified); //feed.AppendLine(@"<content>"); feed.AppendLine(@"<content type=""xhtml"">"); feed.AppendLine(@"<div xmlns=""http://www.w3.org/1999/xhtml"">"); if (feedError) { feed.Append(errFeed.ToString()); } if (entryError) { feed.Append(errEntry.ToString()); } feed.Append(entryContent); feed.AppendLine("</div>"); feed.AppendLine("</content>"); if (storeManager.GetTopicInfo(entryTopicName).HasProperty("Keywords")) { ArrayList keywordsList = storeManager.GetTopicInfo(entryTopicName).KeywordsList; foreach (string keyword in keywordsList) { feed.AppendFormat(@"<category term=""{0}"" />", keyword); } } feed.AppendLine("</entry>"); } else { entryError = true; errEntry.AppendLine("Error: The topic specified in the property 'BlogContents' does not exist."); if (feedError) { feedError = true; if (entryList.Count == 0) { errFeed.AppendLine("Error: Feed does not have a property 'BlogTopics' or that property value is empty"); } if (!String.IsNullOrEmpty(feedTitle)) { feed.AppendFormat(@"<title>{0}</title>", feedTitle); } else { feed.AppendLine("<title>Feed title Unspecified</title>"); errFeed.AppendLine("Error: Feed does not have a property 'Title' or value is empty."); } if (!String.IsNullOrEmpty(author)) { feed.AppendLine(@"<author>"); feed.AppendFormat(@"<name>{0}</name>", author); feed.AppendLine(@"</author>"); } else { feed.AppendLine(@"<author>"); feed.AppendFormat(@"<name>{0}</name>", "Author Unspecified"); feed.AppendLine(@"</author>"); errFeed.AppendLine("Error: Feed does not have a property 'Creator' or value is empty. This may occur as there was no valid entry found to provide a 'Creator' property."); } if (!String.IsNullOrEmpty(feedUUID)) { feed.AppendFormat(@"<id>urn:uuid:{0}</id>", feedUUID); } else { feed.AppendFormat(@"<id>urn:uuid:{0}</id>", System.Guid.NewGuid().ToString()); errFeed.AppendLine("Error: Feed does not have a property 'FeedUUID' or value is empty. A temporary value has been assigned"); } feed.AppendFormat(@"<updated>{0:s}Z</updated>", lastModified); if (!String.IsNullOrEmpty(feedLogo)) { feed.AppendFormat(@"<logo>{0}</logo>", feedLogo); } if (!String.IsNullOrEmpty(feedIcon)) { feed.AppendFormat(@"<icon>{0}</icon>", feedIcon); } if (!String.IsNullOrEmpty(blogCategory)) { feed.AppendFormat(@"<category term=""{0}"" />", blogCategory); } errFeed.AppendLine("</pre>"); } else { feed.AppendFormat(@"<title>{0}</title>", feedTitle); feed.AppendFormat(@"<link href=""{0}"" rel=""self"" type=""application/atom+xml"" />", feedLink); feed.AppendFormat(@"<updated>{0:s}Z</updated>", lastModified); feed.AppendFormat(@"<icon>{0}</icon>", feedIcon); feed.AppendFormat(@"<logo>{0}</logo>", feedLogo); feed.AppendLine(@"<author>"); feed.AppendFormat(@"<name>{0}</name>", author); feed.AppendLine(@"</author>"); feed.AppendFormat(@"<id>urn:uuid:{0}</id>", feedUUID); if (!String.IsNullOrEmpty(blogCategory)) { feed.AppendFormat(@"<category term=""{0}"" />", blogCategory); } } errEntry.AppendLine("</pre>"); feed.AppendLine(@"<entry>"); feed.AppendFormat(@"<title>{0}</title>", entryTitle); feed.AppendFormat(@"<link href=""{0}"" />", entryLink); feed.AppendFormat(@"<id>urn:uuid:{0}</id>", entryUUID); feed.AppendFormat(@"<updated>{0:s}Z</updated>", lastModified); //feed.AppendLine(@"<content>"); feed.AppendLine(@"<content type=""xhtml"">"); feed.AppendLine(@"<div xmlns=""http://www.w3.org/1999/xhtml"">"); if (feedError) { feed.Append(errFeed.ToString()); } if (entryError) { feed.Append(errEntry.ToString()); } feed.Append(entryContent); feed.AppendLine("</div>"); feed.AppendLine("</content>"); if (storeManager.GetTopicInfo(entryTopicName).HasProperty("Keywords")) { ArrayList keywordsList = storeManager.GetTopicInfo(entryTopicName).KeywordsList; foreach (string keyword in keywordsList) { feed.AppendFormat(@"<category term=""{0}"" />", keyword); } } feed.AppendLine("</entry>"); } //end topicVerInfo does not exist } } else { feedError = true; if (entryList.Count == 0) { errFeed.AppendLine("Error: Feed does not have a property 'BlogTopics' or that property value is empty"); } if (!String.IsNullOrEmpty(feedTitle)) { feed.AppendFormat(@"<title>{0}</title>", feedTitle); } else { feed.AppendLine("<title>Feed title Unspecified</title>"); errFeed.AppendLine("Error: Feed does not have a property 'Title' or value is empty."); } if (!String.IsNullOrEmpty(author)) { feed.AppendLine(@"<author>"); feed.AppendFormat(@"<name>{0}</name>", author); feed.AppendLine(@"</author>"); } else { feed.AppendLine(@"<author>"); feed.AppendFormat(@"<name>{0}</name>", "Author Unspecified"); feed.AppendLine(@"</author>"); errFeed.AppendLine("Error: Feed does not have a property 'Creator' or value is empty. This may occur as there was no valid entry found to provide a 'Creator' property."); } if (!String.IsNullOrEmpty(feedUUID)) { feed.AppendFormat(@"<id>urn:uuid:{0}</id>", feedUUID); } else { feed.AppendFormat(@"<id>urn:uuid:{0}</id>", System.Guid.NewGuid().ToString()); errFeed.AppendLine("Error: Feed does not have a property 'FeedUUID' or value is empty. A temporary value has been assigned"); } feed.AppendFormat(@"<updated>{0:s}Z</updated>", System.DateTime.Now.ToUniversalTime()); if (!String.IsNullOrEmpty(feedLogo)) { feed.AppendFormat(@"<logo>{0}</logo>", feedLogo); } if (!String.IsNullOrEmpty(feedIcon)) { feed.AppendFormat(@"<icon>{0}</icon>", feedIcon); } if (!String.IsNullOrEmpty(blogCategory)) { feed.AppendFormat(@"<category term=""{0}"" />", blogCategory); } errFeed.AppendLine("</pre>"); feed.AppendLine(@"<entry>"); feed.AppendLine(@"<title>Error Information</title>"); feed.AppendLine(@"<content type=""xhtml"">"); feed.AppendLine(@"<div xmlns=""http://www.w3.org/1999/xhtml"">"); feed.Append(errFeed.ToString()); feed.AppendLine("</div>"); feed.AppendLine("</content>"); feed.AppendLine(@"</entry>"); } feed.AppendLine("</feed>"); Response.Write(feed.ToString()); }