PageRenderTime 24ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/src/FunnelWeb.Web/Controllers/FeedController.cs

https://bitbucket.org/FunnelWeb/release/
C# | 159 lines | 140 code | 19 blank | 0 comment | 3 complexity | 09f15dd01f07ac2e2c5daf56f5c1e6f9 MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-2.1
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Linq;
  6. using System.ServiceModel.Syndication;
  7. using System.Web.Mvc;
  8. using FunnelWeb.Filters;
  9. using FunnelWeb.Model;
  10. using FunnelWeb.Settings;
  11. using FunnelWeb.Utilities;
  12. using FunnelWeb.Web.Application.Markup;
  13. using FunnelWeb.Web.Application.Markup.Macros;
  14. using FunnelWeb.Web.Application.Mvc.ActionResults;
  15. using FunnelWeb.Repositories;
  16. using FunnelWeb.Repositories.Queries;
  17. namespace FunnelWeb.Web.Controllers
  18. {
  19. [FunnelWebRequest]
  20. public class FeedController : Controller
  21. {
  22. public IRepository Repository { get; set; }
  23. public IContentRenderer Renderer { get; set; }
  24. public ISettingsProvider Settings { get; set; }
  25. private FeedResult FeedResult(IList<SyndicationItem> items)
  26. {
  27. var settings = Settings.GetSettings<FunnelWebSettings>();
  28. Debug.Assert(Request.GetOriginalUrl() != null, "Request.GetOriginalUrl() != null");
  29. var baseUri = Request.GetOriginalUrl();
  30. var feedUrl = new Uri(baseUri, Url.Action("Recent", "Wiki"));
  31. return new FeedResult(
  32. new Atom10FeedFormatter(
  33. new SyndicationFeed(settings.SiteTitle, settings.SearchDescription, feedUrl, items)
  34. {
  35. Id = baseUri.ToString(),
  36. Links =
  37. {
  38. new SyndicationLink(baseUri)
  39. {
  40. RelationshipType = "self"
  41. }
  42. },
  43. LastUpdatedTime = items.Count() == 0 ? DateTime.Now : items.First().LastUpdatedTime
  44. }), items.Max(i => i.LastUpdatedTime.LocalDateTime))
  45. {
  46. ContentType = "application/atom+xml"
  47. };
  48. }
  49. public virtual ActionResult Feed()
  50. {
  51. var settings = Settings.GetSettings<FunnelWebSettings>();
  52. var entries = Repository.Find(new GetFullEntriesQuery(entryStatus: EntryStatus.PublicBlog), 0, 20);
  53. var baseUri = Request.GetOriginalUrl();
  54. var items =
  55. from e in entries
  56. let itemUri = new Uri(baseUri, Url.Action("Page", "Wiki", new { page = e.Name }))
  57. let viaFeedUri = new Uri(baseUri, "/via-feed" + Url.Action("Page", "Wiki", new { page = e.Name }))
  58. orderby e.Published descending
  59. let content = SyndicationContent.CreateHtmlContent(BuildFeedItemBody(itemUri, viaFeedUri, e))
  60. select new
  61. {
  62. Item = new SyndicationItem
  63. {
  64. Id = itemUri.ToString(),
  65. Title = SyndicationContent.CreatePlaintextContent(e.Title),
  66. Summary = content,
  67. Content = content,
  68. LastUpdatedTime = e.Revised,
  69. PublishDate = e.Published,
  70. Links =
  71. {
  72. new SyndicationLink(itemUri)
  73. },
  74. Authors =
  75. {
  76. new SyndicationPerson {Name = settings.Author}
  77. },
  78. },
  79. Keywords = e.TagsCommaSeparated.Split(',')
  80. };
  81. return FeedResult(items.Select(i =>
  82. {
  83. var item = i.Item;
  84. foreach (var k in i.Keywords)
  85. item.Categories.Add(new SyndicationCategory(k.Trim()));
  86. return item;
  87. }).ToList());
  88. }
  89. private string BuildFeedItemBody(Uri itemUri, Uri viaFeedUri, EntryRevision latestRevision)
  90. {
  91. var result =
  92. Renderer.RenderTrusted(latestRevision.Body, latestRevision.Format, CreateHelper())
  93. + string.Format("<img src=\"{0}\" />", viaFeedUri);
  94. if (Settings.GetSettings<FunnelWebSettings>().FacebookLike)
  95. {
  96. var facebook = string.Format(@" <div class='facebook'>
  97. <iframe src='http://www.facebook.com/plugins/like.php?href={0}&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:450px; height:80px;' allowTransparency='true'></iframe>
  98. </div>", Url.Encode(itemUri.AbsoluteUri));
  99. result += facebook;
  100. }
  101. return result;
  102. }
  103. private HtmlHelper CreateHelper()
  104. {
  105. return new HtmlHelper(new ViewContext(ControllerContext, new DummyView(), new ViewDataDictionary(), new TempDataDictionary(), new StringWriter()), new CustomViewDataContainer());
  106. }
  107. public virtual ActionResult CommentFeed()
  108. {
  109. var comments = Repository.Find(new GetCommentsQuery(), 0, 20);
  110. var baseUri = Request.GetOriginalUrl();
  111. var items =
  112. from e in comments
  113. let itemUri = new Uri(baseUri, Url.Action("Page", "Wiki", new { page = e.Entry.Name }) + "#comment-" + e.Id)
  114. select new SyndicationItem
  115. {
  116. Id = itemUri.ToString(),
  117. Title = SyndicationContent.CreatePlaintextContent(e.AuthorName + " on " + e.Entry.Title),
  118. Summary = SyndicationContent.CreateHtmlContent(Renderer.RenderUntrusted(e.Body, Formats.Markdown, CreateHelper())),
  119. Content = SyndicationContent.CreateHtmlContent(Renderer.RenderUntrusted(e.Body, Formats.Markdown, CreateHelper())),
  120. LastUpdatedTime = e.Posted,
  121. PublishDate = e.Posted,
  122. Links =
  123. {
  124. new SyndicationLink(itemUri)
  125. },
  126. Authors =
  127. {
  128. new SyndicationPerson { Name = e.AuthorName, Uri = e.AuthorUrl }
  129. },
  130. };
  131. return FeedResult(items.ToList());
  132. }
  133. internal class DummyView : IView
  134. {
  135. public void Render(ViewContext viewContext, TextWriter writer)
  136. {
  137. }
  138. }
  139. }
  140. }