private static void WriteAtomEntry(XmlWriter writer, IPublishable publishable)
{
var post = publishable as Post;
// var comment = publishable as Comment;
// ------------------------------------------------------------
// Raise serving event
// ------------------------------------------------------------
var arg = new ServingEventArgs(publishable.Content, ServingLocation.Feed);
publishable.OnServing(arg);
if (arg.Cancel)
{
return;
}
// ------------------------------------------------------------
// Modify publishable content to make references absolute
// ------------------------------------------------------------
var content = Utils.ConvertPublishablePathsToAbsolute(arg.Body, publishable);
writer.WriteStartElement("entry");
// ------------------------------------------------------------
// Write required entry elements
// ------------------------------------------------------------
writer.WriteElementString("id", publishable.AbsoluteLink.ToString());
writer.WriteElementString("title", publishable.Title);
writer.WriteElementString("updated", ToW3CDateTime(publishable.DateCreated.ToUniversalTime()));
// ------------------------------------------------------------
// Write recommended entry elements
// ------------------------------------------------------------
writer.WriteStartElement("link");
writer.WriteAttributeString("rel", "self");
writer.WriteAttributeString("href", GetPermaLink(publishable).ToString());
writer.WriteEndElement();
writer.WriteStartElement("link");
writer.WriteAttributeString("href", publishable.AbsoluteLink.ToString());
writer.WriteEndElement();
writer.WriteStartElement("author");
writer.WriteElementString("name", publishable.Author);
writer.WriteEndElement();
writer.WriteStartElement("summary");
writer.WriteAttributeString("type", "html");
writer.WriteString(content);
writer.WriteEndElement();
// ------------------------------------------------------------
// Write optional entry elements
// ------------------------------------------------------------
writer.WriteElementString("published", ToW3CDateTime(publishable.DateCreated.ToUniversalTime()));
writer.WriteStartElement("link");
writer.WriteAttributeString("rel", "related");
writer.WriteAttributeString("href", String.Concat(publishable.AbsoluteLink.ToString(),
BlogSettings.Instance.ModerationType == BlogSettings.Moderation.Disqus ? "#disqus_thread" : "#comment"));
writer.WriteEndElement();
// ------------------------------------------------------------
// Write enclosure tag for podcasting support
// ------------------------------------------------------------
if (BlogSettings.Instance.EnableEnclosures)
{
var encloser = GetEnclosure(content, publishable);
if (!string.IsNullOrEmpty(encloser))
{
writer.WriteRaw(encloser);
}
}
// ------------------------------------------------------------
// Write entry category elements
// ------------------------------------------------------------
if (publishable.Categories != null)
{
foreach (var category in publishable.Categories)
{
writer.WriteStartElement("category");
writer.WriteAttributeString("term", category.Title);
writer.WriteEndElement();
}
}
// ------------------------------------------------------------
// Write Dublin Core syndication extension elements
// ------------------------------------------------------------
if (!String.IsNullOrEmpty(publishable.Author))
{
writer.WriteElementString("dc", "publisher", "http://purl.org/dc/elements/1.1/", publishable.Author);
}
if (!String.IsNullOrEmpty(publishable.Description))
{
writer.WriteElementString(
"dc", "description", "http://purl.org/dc/elements/1.1/", publishable.Description);
}
// ------------------------------------------------------------
// Write pingback syndication extension elements
// ------------------------------------------------------------
Uri pingbackServer;
if (Uri.TryCreate(
String.Concat(publishable.Blog.AbsoluteWebRoot.ToString().TrimEnd('/'), "/pingback.axd"),
UriKind.RelativeOrAbsolute,
out pingbackServer))
{
writer.WriteElementString(
"pingback",
"server",
"http://madskills.com/public/xml/rss/module/pingback/",
pingbackServer.ToString());
writer.WriteElementString(
"pingback",
"target",
"http://madskills.com/public/xml/rss/module/pingback/",
GetPermaLink(publishable).ToString());
}
// ------------------------------------------------------------
// Write slash syndication extension elements
// ------------------------------------------------------------
if (post != null && post.Comments != null)
{
writer.WriteElementString(
"slash",
"comments",
"http://purl.org/rss/1.0/modules/slash/",
post.Comments.Count.ToString(CultureInfo.InvariantCulture));
}
// ------------------------------------------------------------
// Write trackback syndication extension elements
// ------------------------------------------------------------
if (post != null && post.TrackbackLink != null)
{
writer.WriteElementString(
"trackback",
"ping",
"http://madskills.com/public/xml/rss/module/trackback/",
post.TrackbackLink.ToString());
}
// ------------------------------------------------------------
// Write well-formed web syndication extension elements
// ------------------------------------------------------------
writer.WriteElementString(
"wfw",
"comment",
"http://wellformedweb.org/CommentAPI/",
String.Concat(publishable.AbsoluteLink.ToString(),
BlogSettings.Instance.ModerationType == BlogSettings.Moderation.Disqus ? "#disqus_thread" : "#comment"));
writer.WriteElementString(
"wfw",
"commentRss",
"http://wellformedweb.org/CommentAPI/",
string.Format("{0}/syndication.axd?post={1}", publishable.Blog.AbsoluteWebRoot.ToString().TrimEnd('/'), publishable.Id));
// ------------------------------------------------------------
// Write </entry> element
// ------------------------------------------------------------
writer.WriteEndElement();
}