/// <summary>Fills a DasBlog entry from a MetaWeblog Post structure.</summary> /// <param name="entry">DasBlog entry to fill.</param> /// <param name="post">MetaWeblog post structure to fill from.</param> /// <returns>TrackbackInfoCollection of posts to send trackback pings.</returns> private TrackbackInfoCollection FillEntryFromMetaWeblogPost(Entry entry, MetaWeblog.Post post) { // W.Bloggar doesn't pass in the DataCreated, // so we have to check for that if (post.dateCreated != DateTime.MinValue) { entry.CreatedUtc = post.dateCreated.ToUniversalTime(); } //Patched to avoid html entities in title entry.Title = WebUtility.HtmlDecode(post.title); entry.Content = post.description; entry.Description = NoNull(post.mt_excerpt); // If mt_allow_comments is null, then the sender did not specify. Use default dasBlog behavior in that case if (post.mt_allow_comments != null) { int nAllowComments = Convert.ToInt32(post.mt_allow_comments); if (nAllowComments == 0 || nAllowComments == 2) { entry.AllowComments = false; } else { entry.AllowComments = true; } } if (post.categories != null && post.categories.Length > 0) { // handle categories var categories = ""; var sb = new StringBuilder(); var needSemi = false; post.categories = RemoveDups(post.categories, true); foreach (string category in post.categories) { //watch for "" as a category if (category.Length > 0) { if (needSemi) { sb.Append(";"); } sb.Append(category); needSemi = true; } } categories = sb.ToString(); if (categories.Length > 0) { entry.Categories = categories; } } // We'll always return at least an empty collection var trackbackList = new TrackbackInfoCollection(); // Only MT supports trackbacks in the post if (post.mt_tb_ping_urls != null) { foreach (var trackbackUrl in post.mt_tb_ping_urls) { trackbackList.Add(new TrackbackInfo( trackbackUrl, dasBlogSettings.GetPermaLinkUrl(entry.EntryId), entry.Title, entry.Description, dasBlogSettings.SiteConfiguration.Title)); } } return(trackbackList); }
public urlset GetGoogleSiteMap() { urlset root = new urlset(); root.url = new urlCollection(); //Default first... url basePage = new url(_dasBlogSettings.GetBaseUrl(), DateTime.Now, changefreq.daily, 1.0M); root.url.Add(basePage); //Archives next... url archivePage = new url(_dasBlogSettings.RelativeToRoot("archives"), DateTime.Now, changefreq.daily, 1.0M); root.url.Add(archivePage); //All Pages EntryCollection entryCache = _dataService.GetEntries(false); foreach (Entry e in entryCache) { if (e.IsPublic) { //Start with a RARE change freq...newer posts are more likely to change more often. // The older a post, the less likely it is to change... changefreq freq = changefreq.daily; //new stuff? if (e.CreatedLocalTime < DateTime.Now.AddMonths(-9)) { freq = changefreq.yearly; } else if (e.CreatedLocalTime < DateTime.Now.AddDays(-30)) { freq = changefreq.monthly; } else if (e.CreatedLocalTime < DateTime.Now.AddDays(-7)) { freq = changefreq.weekly; } if (e.CreatedLocalTime > DateTime.Now.AddDays(-2)) { freq = changefreq.hourly; } //Add comments pages, since comments have indexable content... // Only add comments if we aren't showing comments on permalink pages already if (_dasBlogSettings.SiteConfiguration.ShowCommentsWhenViewingEntry == false) { url commentPage = new url(_dasBlogSettings.GetCommentViewUrl(e.EntryId), e.CreatedLocalTime, freq, 0.7M); root.url.Add(commentPage); } //then add permalinks url permaPage = new url(_dasBlogSettings.GetPermaLinkUrl(e.EntryId), e.CreatedLocalTime, freq, 0.9M); root.url.Add(permaPage); } } //All Categories CategoryCacheEntryCollection catCache = _dataService.GetCategories(); foreach (CategoryCacheEntry cce in catCache) { if (cce.IsPublic) { url catPage = new url(_dasBlogSettings.GetCategoryViewUrl(cce.Name), DateTime.Now, changefreq.weekly, 0.6M); root.url.Add(catPage); } } return(root); }
private RssRoot GetRssCore(string category, int maxDayCount, int maxEntryCount) { EntryCollection entries = null; //We only build the entries if blogcore doesn't exist and we'll need them later... if (_dataService.GetLastEntryUpdate() == DateTime.MinValue) { entries = BuildEntries(category, maxDayCount, maxEntryCount); } // TODO: Detecting modified data? //DateTime lastModified = this.GetLatestModifedEntryDateTime(entries); //if (SiteUtilities.GetStatusNotModified(lastModified)) // return null; RssRoot documentRoot = new RssRoot();; //However, if we made it this far, the not-modified check didn't work, and we may not have entries... if (entries == null) { entries = BuildEntries(category, maxDayCount, maxEntryCount); } documentRoot.Namespaces.Add("dc", "http://purl.org/dc/elements/1.1/"); documentRoot.Namespaces.Add("trackback", "http://madskills.com/public/xml/rss/module/trackback/"); documentRoot.Namespaces.Add("pingback", "http://madskills.com/public/xml/rss/module/pingback/"); if (_dasBlogSettings.SiteConfiguration.EnableComments) { documentRoot.Namespaces.Add("wfw", "http://wellformedweb.org/CommentAPI/"); documentRoot.Namespaces.Add("slash", "http://purl.org/rss/1.0/modules/slash/"); } if (_dasBlogSettings.SiteConfiguration.EnableGeoRss) { documentRoot.Namespaces.Add("georss", "http://www.georss.org/georss"); } RssChannel ch = new RssChannel(); if (category == null) { ch.Title = _dasBlogSettings.SiteConfiguration.Title; } else { ch.Title = _dasBlogSettings.SiteConfiguration.Title + " - " + category; } if (_dasBlogSettings.SiteConfiguration.Description == null || _dasBlogSettings.SiteConfiguration.Description.Trim().Length == 0) { ch.Description = _dasBlogSettings.SiteConfiguration.Subtitle; } else { ch.Description = _dasBlogSettings.SiteConfiguration.Description; } ch.Link = _dasBlogSettings.GetBaseUrl(); ch.Copyright = _dasBlogSettings.SiteConfiguration.Copyright; if (_dasBlogSettings.SiteConfiguration.RssLanguage != null && _dasBlogSettings.SiteConfiguration.RssLanguage.Length > 0) { ch.Language = _dasBlogSettings.SiteConfiguration.RssLanguage; } ch.ManagingEditor = _dasBlogSettings.SiteConfiguration.Contact; ch.WebMaster = _dasBlogSettings.SiteConfiguration.Contact; ch.Image = null; if (_dasBlogSettings.SiteConfiguration.ChannelImageUrl != null && _dasBlogSettings.SiteConfiguration.ChannelImageUrl.Trim().Length > 0) { newtelligence.DasBlog.Web.Services.Rss20.ChannelImage channelImage = new newtelligence.DasBlog.Web.Services.Rss20.ChannelImage(); channelImage.Title = ch.Title; channelImage.Link = ch.Link; if (_dasBlogSettings.SiteConfiguration.ChannelImageUrl.StartsWith("http")) { channelImage.Url = _dasBlogSettings.SiteConfiguration.ChannelImageUrl; } else { channelImage.Url = _dasBlogSettings.RelativeToRoot(_dasBlogSettings.SiteConfiguration.ChannelImageUrl); } ch.Image = channelImage; } documentRoot.Channels.Add(ch); foreach (Entry entry in entries) { if (entry.IsPublic == false || entry.Syndicated == false) { continue; } XmlDocument doc2 = new XmlDocument(); List <XmlElement> anyElements = new List <XmlElement>(); RssItem item = new RssItem(); item.Title = entry.Title; item.Guid = new newtelligence.DasBlog.Web.Services.Rss20.Guid(); item.Guid.IsPermaLink = false; item.Guid.Text = _dasBlogSettings.GetPermaLinkUrl(entry.EntryId); item.Link = _dasBlogSettings.GetPermaLinkUrl(entry.EntryId); User user = _dasBlogSettings.GetUser(entry.Author); XmlElement trackbackPing = doc2.CreateElement("trackback", "ping", "http://madskills.com/public/xml/rss/module/trackback/"); trackbackPing.InnerText = _dasBlogSettings.GetTrackbackUrl(entry.EntryId); anyElements.Add(trackbackPing); XmlElement pingbackServer = doc2.CreateElement("pingback", "server", "http://madskills.com/public/xml/rss/module/pingback/"); pingbackServer.InnerText = _dasBlogSettings.RelativeToRoot("pingback"); anyElements.Add(pingbackServer); XmlElement pingbackTarget = doc2.CreateElement("pingback", "target", "http://madskills.com/public/xml/rss/module/pingback/"); pingbackTarget.InnerText = _dasBlogSettings.GetPermaLinkUrl(entry.EntryId); anyElements.Add(pingbackTarget); XmlElement dcCreator = doc2.CreateElement("dc", "creator", "http://purl.org/dc/elements/1.1/"); if (user != null) { dcCreator.InnerText = user.DisplayName; } anyElements.Add(dcCreator); // Add GeoRSS if it exists. if (_dasBlogSettings.SiteConfiguration.EnableGeoRss) { Nullable <double> latitude = new Nullable <double>(); Nullable <double> longitude = new Nullable <double>(); if (entry.Latitude.HasValue) { latitude = entry.Latitude; } else { if (_dasBlogSettings.SiteConfiguration.EnableDefaultLatLongForNonGeoCodedPosts) { latitude = _dasBlogSettings.SiteConfiguration.DefaultLatitude; } } if (entry.Longitude.HasValue) { longitude = entry.Longitude; } else { if (_dasBlogSettings.SiteConfiguration.EnableDefaultLatLongForNonGeoCodedPosts) { longitude = _dasBlogSettings.SiteConfiguration.DefaultLongitude; } } if (latitude.HasValue && longitude.HasValue) { XmlElement geoLoc = doc2.CreateElement("georss", "point", "http://www.georss.org/georss"); geoLoc.InnerText = String.Format(CultureInfo.InvariantCulture, "{0:R} {1:R}", latitude, longitude); anyElements.Add(geoLoc); } } if (_dasBlogSettings.SiteConfiguration.EnableComments) { if (entry.AllowComments) { XmlElement commentApi = doc2.CreateElement("wfw", "comment", "http://wellformedweb.org/CommentAPI/"); commentApi.InnerText = _dasBlogSettings.GetCommentViewUrl(entry.EntryId); anyElements.Add(commentApi); } XmlElement commentRss = doc2.CreateElement("wfw", "commentRss", "http://wellformedweb.org/CommentAPI/"); commentRss.InnerText = _dasBlogSettings.GetEntryCommentsRssUrl(entry.EntryId); anyElements.Add(commentRss); //for RSS conformance per FeedValidator.org int commentsCount = _dataService.GetPublicCommentsFor(entry.EntryId).Count; if (commentsCount > 0) { XmlElement slashComments = doc2.CreateElement("slash", "comments", "http://purl.org/rss/1.0/modules/slash/"); slashComments.InnerText = commentsCount.ToString(); anyElements.Add(slashComments); } item.Comments = _dasBlogSettings.GetCommentViewUrl(entry.EntryId); } item.Language = entry.Language; if (entry.Categories != null && entry.Categories.Length > 0) { if (item.Categories == null) { item.Categories = new RssCategoryCollection(); } string[] cats = entry.Categories.Split(';'); foreach (string c in cats) { RssCategory cat = new RssCategory(); string cleanCat = c.Replace('|', '/'); cat.Text = cleanCat; item.Categories.Add(cat); } } if (entry.Attachments.Count > 0) { // RSS currently supports only a single enclsoure so we return the first one item.Enclosure = new Enclosure(); item.Enclosure.Url = entry.Attachments[0].Name; item.Enclosure.Type = entry.Attachments[0].Type; item.Enclosure.Length = entry.Attachments[0].Length.ToString(); } item.PubDate = entry.CreatedUtc.ToString("R"); if (ch.LastBuildDate == null || ch.LastBuildDate.Length == 0) { ch.LastBuildDate = item.PubDate; } if (!_dasBlogSettings.SiteConfiguration.AlwaysIncludeContentInRSS && entry.Description != null && entry.Description.Trim().Length > 0) { item.Description = PreprocessItemContent(entry.EntryId, entry.Description); } else { if (_dasBlogSettings.SiteConfiguration.HtmlTidyContent == false) { item.Description = "<div>" + PreprocessItemContent(entry.EntryId, entry.Content) + "</div>"; } else { item.Description = ContentFormatter.FormatContentAsHTML(PreprocessItemContent(entry.EntryId, entry.Content)); try { string xhtml = ContentFormatter.FormatContentAsXHTML(PreprocessItemContent(entry.EntryId, entry.Content)); doc2.LoadXml(xhtml); anyElements.Add((XmlElement)doc2.SelectSingleNode("//*[local-name() = 'body'][namespace-uri()='http://www.w3.org/1999/xhtml']")); } catch //(Exception ex) { //Debug.Write(ex.ToString()); // absorb } } } item.anyElements = anyElements.ToArray(); ch.Items.Add(item); } return(documentRoot); }
private EntrySaveState InternalSaveEntry(Entry entry, TrackbackInfoCollection trackbackList, CrosspostInfoCollection crosspostList) { EntrySaveState rtn = EntrySaveState.Failed; // we want to prepopulate the cross post collection with the crosspost footer if (dasBlogSettings.SiteConfiguration.EnableCrossPostFooter && dasBlogSettings.SiteConfiguration.CrossPostFooter != null && dasBlogSettings.SiteConfiguration.CrossPostFooter.Length > 0) { foreach (CrosspostInfo info in crosspostList) { info.CrossPostFooter = dasBlogSettings.SiteConfiguration.CrossPostFooter; } } // now save the entry, passign in all the necessary Trackback and Pingback info. try { // if the post is missing a title don't publish it if (entry.Title == null || entry.Title.Length == 0) { entry.IsPublic = false; } // if the post is missing categories, then set the categories to empty string. if (entry.Categories == null) { entry.Categories = ""; } rtn = dataService.SaveEntry(entry, (dasBlogSettings.SiteConfiguration.PingServices.Count > 0) ? new WeblogUpdatePingInfo(dasBlogSettings.SiteConfiguration.Title, dasBlogSettings.GetBaseUrl(), dasBlogSettings.GetBaseUrl(), dasBlogSettings.RsdUrl, dasBlogSettings.SiteConfiguration.PingServices) : null, (entry.IsPublic) ? trackbackList : null, dasBlogSettings.SiteConfiguration.EnableAutoPingback && entry.IsPublic ? new PingbackInfo( dasBlogSettings.GetPermaLinkUrl(entry.EntryId), entry.Title, entry.Description, dasBlogSettings.SiteConfiguration.Title) : null, crosspostList); //TODO: SendEmail(entry, siteConfig, logService); } catch (Exception ex) { //TODO: Do something with this???? // StackTrace st = new StackTrace(); // logService.AddEvent(new EventDataItem(EventCodes.Error, ex.ToString() + Environment.NewLine + st.ToString(), "")); LoggedException le = new LoggedException("file failure", ex); var edi = new EventDataItem(EventCodes.Error, null , "Failed to Save a Post on {date}", System.DateTime.Now.ToShortDateString()); logger.LogError(edi, le); } // we want to invalidate all the caches so users get the new post // TODO: BreakCache(entry.GetSplitCategories()); return(rtn); }