public static GetFormattedPageContent ( System.PageInfo page, bool cached ) : string | ||
page | System.PageInfo | The Page to get the formatted Content of. |
cached | bool | Specifies whether the formatted content has to be cached or not. |
return | string |
/// <summary> /// Prints the content. /// </summary> public void PrintContent() { StringBuilder sb = new StringBuilder(5000); string title = FormattingPipeline.PrepareTitle(content.Title, false, FormattingContext.PageContent, page); if (Request["Discuss"] == null) { string[] categories = (from c in Pages.GetCategoriesForPage(page) select NameTools.GetLocalName(c.FullName)).ToArray(); UserInfo user = Users.FindUser(content.User); sb.Append(@"<h1 class=""pagetitle"">"); sb.Append(title); sb.Append("</h1>"); sb.AppendFormat("<small>{0} {1} {2} {3} — {4}: {5}</small><br /><br />", Properties.Messages.ModifiedOn, Preferences.AlignWithTimezone(content.LastModified).ToString(Settings.DateTimeFormat), Properties.Messages.By, user != null ? Users.GetDisplayName(user) : content.User, Properties.Messages.CategorizedAs, categories.Length == 0 ? Properties.Messages.Uncategorized : string.Join(", ", categories)); sb.Append(Content.GetFormattedPageContent(page, true)); } else { sb.Append(@"<h1 class=""pagetitle"">"); sb.Append(title); sb.Append(" - Discussion</h1>"); PrintDiscussion(sb); } lblContent.Text = sb.ToString(); }
/// <summary> /// Verifies the need for a page redirection, and performs it when appropriate. /// </summary> private void VerifyAndPerformPageRedirection() { if (currentPage == null) { return; } // Force formatting so that the destination can be detected Content.GetFormattedPageContent(currentPage, true); PageInfo dest = Redirections.GetDestination(currentPage, out var fragment); if (dest == null) { return; } if (dest != null) { if (Request["NoRedirect"] != "1") { var fullUrl = dest.FullName + Settings.PageExtension + "?From=" + currentPage.FullName; if (!string.IsNullOrEmpty(fragment)) { fullUrl += "#" + fragment; } UrlTools.Redirect(fullUrl, false); } else { // Write redirection hint var sb = new StringBuilder(); sb.Append(@"<div id=""RedirectionDiv"">"); sb.Append(Properties.Messages.ThisPageRedirectsTo); sb.Append(": "); sb.Append(@"<a href="""); var fullUrl = UrlTools.BuildUrl("++", Tools.UrlEncode(dest.FullName), Settings.PageExtension, "?From=", Tools.UrlEncode(currentPage.FullName)); if (!string.IsNullOrEmpty(fragment)) { fullUrl += "#" + fragment; } sb.Append(fullUrl); sb.Append(@""">"); PageContent k = Content.GetPageContent(dest, true); sb.Append(FormattingPipeline.PrepareTitle(k.Title, false, FormattingContext.PageContent, currentPage)); sb.Append("</a></div>"); var literal = new Literal(); literal.Text = sb.ToString(); plhContent.Controls.Add(literal); } } }
/// <summary> /// Sets the actual page content, based on the current view mode (normal, discussion, view code). /// </summary> /// <param name="canPostMessages">A value indicating whether the current user can post messages.</param> /// <param name="canManageDiscussion">A value indicating whether the current user can manage the discussion.</param> private void SetupPageContent(bool canPostMessages, bool canManageDiscussion) { if (!discussMode && !viewCodeMode) { var literal = new Literal(); var html = Content.GetFormattedPageContent(currentPage, true); // Nettoyage HTML //var sanitizer = new Html.HtmlSanitizer(); //sanitizer.AllowedAttributes = sanitizer.AllowedAttributes.Concat(new[] { "class" }).ToList(); //html = sanitizer.Sanitize(html); literal.Text = html; plhContent.Controls.Add(literal); } else if (!discussMode && viewCodeMode) { if (Settings.EnableViewPageCodeFeature) { var literal = new Literal(); var sb = new StringBuilder(currentContent.Content.Length + 100); sb.Append(@"<textarea style=""width: 98%; height: 500px;"" readonly=""true"">"); sb.Append(Server.HtmlEncode(currentContent.Content)); sb.Append("</textarea>"); sb.Append("<br /><br />"); sb.Append(Properties.Messages.MetaKeywords); sb.Append(": <b>"); sb.Append(PrintKeywords(currentContent.Keywords)); sb.Append("</b><br />"); sb.Append(Properties.Messages.MetaDescription); sb.Append(": <b>"); sb.Append(currentContent.Description); sb.Append("</b><br />"); sb.Append(Properties.Messages.ChangeComment); sb.Append(": <b>"); sb.Append(currentContent.Comment); sb.Append("</b>"); literal.Text = sb.ToString(); plhContent.Controls.Add(literal); } } else if (discussMode && !viewCodeMode) { var discussion = LoadControl("~/PageDiscussion.ascx") as PageDiscussion; discussion.CurrentPage = currentPage; discussion.CanPostMessages = canPostMessages; discussion.CanManageDiscussion = canManageDiscussion; plhContent.Controls.Add(discussion); } }
/// <summary> /// Sets the actual page content, based on the current view mode (normal, discussion, view code). /// </summary> /// <param name="canPostMessages">A value indicating whether the current user can post messages.</param> /// <param name="canManageDiscussion">A value indicating whether the current user can manage the discussion.</param> private void SetupPageContent(bool canPostMessages, bool canManageDiscussion) { if (!discussMode && !viewCodeMode) { Literal literal = new Literal(); literal.Text = Content.GetFormattedPageContent(currentPage, true); plhContent.Controls.Add(literal); } else if (!discussMode && viewCodeMode) { if (Settings.EnableViewPageCodeFeature) { Literal literal = new Literal(); StringBuilder sb = new StringBuilder(currentContent.Content.Length + 100); sb.Append(@"<textarea style=""width: 98%; height: 500px;"" readonly=""true"">"); sb.Append(Server.HtmlEncode(currentContent.Content)); sb.Append("</textarea>"); sb.Append("<br /><br />"); sb.Append(Properties.Messages.MetaKeywords); sb.Append(": <b>"); sb.Append(PrintKeywords(currentContent.Keywords)); sb.Append("</b><br />"); sb.Append(Properties.Messages.MetaDescription); sb.Append(": <b>"); sb.Append(currentContent.Description); sb.Append("</b><br />"); sb.Append(Properties.Messages.ChangeComment); sb.Append(": <b>"); sb.Append(currentContent.Comment); sb.Append("</b>"); literal.Text = sb.ToString(); plhContent.Controls.Add(literal); } } else if (discussMode && !viewCodeMode) { PageDiscussion discussion = LoadControl("~/PageDiscussion.ascx") as PageDiscussion; discussion.CurrentPage = currentPage; discussion.CanPostMessages = canPostMessages; discussion.CanManageDiscussion = canManageDiscussion; plhContent.Controls.Add(discussion); } }
protected void Page_Load(object sender, EventArgs e) { rssFeedsMode = Settings.RssFeedsMode; if (rssFeedsMode == RssFeedsMode.Disabled) { Response.Clear(); Response.StatusCode = 404; Response.End(); return; } string currentUsername = SessionFacade.GetCurrentUsername(); string[] currentGroups = SessionFacade.GetCurrentGroupNames(); currentNamespace = DetectNamespace(); if (string.IsNullOrEmpty(currentNamespace)) { currentNamespace = null; } if (SessionFacade.LoginKey == null) { // Look for username/password in the query string if (Request["Username"] != null && Request["Password"] != null) { // Try to authenticate UserInfo u = Users.FindUser(Request["Username"]); if (u != null) { // Very "dirty" way - pages should not access Providers if (u.Provider.TestAccount(u, Request["Password"])) { // Valid account currentUsername = Request["Username"]; currentGroups = Users.FindUser(currentUsername).Groups; } } else { // Check for built-in admin account if (Request["Username"].Equals("admin") && Request["Password"].Equals(Settings.MasterPassword)) { currentUsername = "******"; currentGroups = new string[] { Settings.AdministratorsGroup }; } } } } Response.ClearContent(); Response.ContentType = "text/xml;charset=UTF-8"; Response.ContentEncoding = System.Text.UTF8Encoding.UTF8; if (Request["Page"] != null) { PageInfo page = Pages.FindPage(Request["Page"]); if (page == null) { return; } PageContent content = Content.GetPageContent(page, true); if (Request["Discuss"] == null) { // Check permission for the page bool canReadPage = AuthChecker.CheckActionForPage(page, Actions.ForPages.ReadPage, currentUsername, currentGroups); if (!canReadPage) { Response.StatusCode = 401; return; } // Start an XML writer for the output stream using (XmlWriter rss = XmlWriter.Create(Response.OutputStream)) { // Build an RSS header BuildRssHeader(rss); // Build the channel element BuildChannelHead(rss, Settings.WikiTitle + " - " + Formatter.StripHtml(FormattingPipeline.PrepareTitle(content.Title, false, FormattingContext.PageContent, page)), Settings.MainUrl + page.FullName + Settings.PageExtension, Settings.MainUrl + UrlTools.BuildUrl("RSS.aspx?Page=", page.FullName), Formatter.StripHtml(content.Title) + " - " + Properties.Messages.PageUpdates); // Write the item element rss.WriteStartElement("item"); rss.WriteStartElement("title"); rss.WriteCData(Formatter.StripHtml(FormattingPipeline.PrepareTitle(content.Title, false, FormattingContext.PageContent, page))); rss.WriteEndElement(); rss.WriteElementString("link", Settings.MainUrl + page.FullName + Settings.PageExtension); UserInfo user = Users.FindUser(content.User); string username = user != null?Users.GetDisplayName(user) : content.User; // Create the description tag rss.WriteStartElement("description"); if (rssFeedsMode == RssFeedsMode.Summary) { rss.WriteCData(Formatter.StripHtml(content.Title) + ": " + Properties.Messages.ThePageHasBeenUpdatedBy + " " + username + (content.Comment.Length > 0 ? ".<br />" + content.Comment : ".")); } else { rss.WriteCData(Content.GetFormattedPageContent(page, false)); } rss.WriteEndElement(); // Write the remaining elements rss.WriteElementString("author", username); rss.WriteElementString("pubDate", content.LastModified.ToUniversalTime().ToString("R")); rss.WriteStartElement("guid"); rss.WriteAttributeString("isPermaLink", "false"); rss.WriteString(GetGuid(page.FullName, content.LastModified)); rss.WriteEndElement(); // Complete the item element CompleteCurrentElement(rss); // Complete the channel element CompleteCurrentElement(rss); // Complete the rss element CompleteCurrentElement(rss); // Finish off rss.Flush(); rss.Close(); } } else { // Check permission for the discussion bool canReadDiscussion = AuthChecker.CheckActionForPage(page, Actions.ForPages.ReadDiscussion, currentUsername, currentGroups); if (!canReadDiscussion) { Response.StatusCode = 401; return; } List <Message> messages = new List <Message>(Pages.GetPageMessages(page)); // Un-tree Messages messages = UnTreeMessages(messages); // Sort from newer to older messages.Sort(new MessageDateTimeComparer(true)); // Start an XML writer for the output stream using (XmlWriter rss = XmlWriter.Create(Response.OutputStream)) { // Build an RSS header BuildRssHeader(rss); // Build the channel element BuildChannelHead(rss, Settings.WikiTitle + " - " + Formatter.StripHtml(FormattingPipeline.PrepareTitle(content.Title, false, FormattingContext.PageContent, page)) + " - Discussion Updates", Settings.MainUrl + page.FullName + Settings.PageExtension + "?Discuss=1", Settings.MainUrl + UrlTools.BuildUrl("RSS.aspx?Page=", page.FullName, "&Discuss=1"), Settings.WikiTitle + " - " + Formatter.StripHtml(FormattingPipeline.PrepareTitle(content.Title, false, FormattingContext.PageContent, page)) + " - Discussion Updates"); for (int i = 0; i < messages.Count; i++) { // Write the item element rss.WriteStartElement("item"); rss.WriteStartElement("title"); rss.WriteCData(Formatter.StripHtml(FormattingPipeline.PrepareTitle(messages[i].Subject, false, FormattingContext.MessageBody, page))); rss.WriteEndElement(); rss.WriteElementString("link", Settings.MainUrl + page.FullName + Settings.PageExtension + "?Discuss=1"); UserInfo user = Users.FindUser(messages[i].Username); string username = user != null?Users.GetDisplayName(user) : messages[i].Username; // Create the description tag rss.WriteStartElement("description"); if (rssFeedsMode == RssFeedsMode.Summary) { rss.WriteCData(Properties.Messages.AMessageHasBeenPostedBy.Replace("##SUBJECT##", messages[i].Subject) + " " + username + "."); } else { rss.WriteCData(FormattingPipeline.FormatWithPhase3(FormattingPipeline.FormatWithPhase1And2(messages[i].Body, false, FormattingContext.MessageBody, page), FormattingContext.MessageBody, page)); } rss.WriteEndElement(); // Write the remaining elements rss.WriteElementString("author", username); rss.WriteElementString("pubDate", messages[i].DateTime.ToUniversalTime().ToString("R")); rss.WriteStartElement("guid"); rss.WriteAttributeString("isPermaLink", "false"); rss.WriteString(GetGuid(page.FullName + "-" + messages[i].ID, messages[i].DateTime)); rss.WriteEndElement(); // Complete the item element CompleteCurrentElement(rss); } // Complete the channel element CompleteCurrentElement(rss); // Complete the rss element CompleteCurrentElement(rss); // Finish off rss.Flush(); rss.Close(); } } } else { if (Request["Discuss"] == null) { // All page updates // Start an XML writer for the output stream using (XmlWriter rss = XmlWriter.Create(Response.OutputStream)) { // Build an RSS header BuildRssHeader(rss); bool useCat = false; string cat = ""; if (Request["Category"] != null) { useCat = true; cat = Request["Category"]; } // Build the channel element BuildChannelHead(rss, Settings.WikiTitle + " - " + Properties.Messages.PageUpdates, Settings.MainUrl, Settings.MainUrl + UrlTools.BuildUrl("RSS.aspx", (useCat ? ("?Category=" + cat) : "")), Properties.Messages.RecentPageUpdates); RecentChange[] ch = RecentChanges.GetAllChanges(); Array.Reverse(ch); for (int i = 0; i < ch.Length; i++) { // Suppress this entry if we've already reported this page (so we don't create duplicate entries in the feed page) bool duplicateFound = false; for (int j = 0; j < i; j++) { if (ch[j].Page == ch[i].Page) { duplicateFound = true; break; } } if (duplicateFound) { continue; } // Skip message-related entries if (!IsPageChange(ch[i].Change)) { continue; } PageInfo p = Pages.FindPage(ch[i].Page); if (p != null) { // Check permissions for every page bool canReadThisPage = AuthChecker.CheckActionForPage(p, Actions.ForPages.ReadPage, currentUsername, currentGroups); if (!canReadThisPage) { continue; } if (useCat) { CategoryInfo[] infos = Pages.GetCategoriesForPage(p); if (infos.Length == 0 && cat != "-") { continue; } if (infos.Length != 0) { bool found = false; for (int k = 0; k < infos.Length; k++) { if (infos[k].FullName == cat) { found = true; break; } } if (!found) { continue; } } } } // Check namespace if (p != null && NameTools.GetNamespace(p.FullName) != currentNamespace) { continue; } // Skip deleted pages as their category binding is unknown if (p == null && useCat) { continue; } // Write the item element rss.WriteStartElement("item"); rss.WriteStartElement("title"); rss.WriteCData(Formatter.StripHtml(FormattingPipeline.PrepareTitle(ch[i].Title, false, FormattingContext.PageContent, p))); rss.WriteEndElement(); if (ch[i].Change != Change.PageDeleted && p != null) { rss.WriteElementString("link", Settings.MainUrl + ch[i].Page + Settings.PageExtension); } else { rss.WriteElementString("link", Settings.MainUrl); } UserInfo user = Users.FindUser(ch[i].User); string username = user != null?Users.GetDisplayName(user) : ch[i].User; rss.WriteElementString("author", username); // Create the description tag StringBuilder sb = new StringBuilder(); if (rssFeedsMode == RssFeedsMode.Summary || p == null) { switch (ch[i].Change) { case Change.PageUpdated: sb.Append(Properties.Messages.ThePageHasBeenUpdatedBy); break; case Change.PageDeleted: sb.Append(Properties.Messages.ThePageHasBeenDeletedBy); break; case Change.PageRenamed: sb.Append(Properties.Messages.ThePageHasBeenRenamedBy); break; case Change.PageRolledBack: sb.Append(Properties.Messages.ThePageHasBeenRolledBackBy); break; } sb.Append(" " + username + (ch[i].Description.Length > 0 ? ".<br />" + ch[i].Description : ".")); } else { // p != null sb.Append(Content.GetFormattedPageContent(p, false)); } rss.WriteStartElement("description"); rss.WriteCData(sb.ToString()); rss.WriteEndElement(); // Write the remaining elements rss.WriteElementString("pubDate", ch[i].DateTime.ToUniversalTime().ToString("R")); rss.WriteStartElement("guid"); rss.WriteAttributeString("isPermaLink", "false"); rss.WriteString(GetGuid(ch[i].Page, ch[i].DateTime)); rss.WriteEndElement(); // Complete the item element rss.WriteEndElement(); } // Complete the channel element CompleteCurrentElement(rss); // Complete the rss element CompleteCurrentElement(rss); // Finish off rss.Flush(); rss.Close(); } } else { // All discussion updates // Start an XML writer for the output stream using (XmlWriter rss = XmlWriter.Create(Response.OutputStream)) { // Build an RSS header BuildRssHeader(rss); bool useCat = false; string cat = ""; if (Request["Category"] != null) { useCat = true; cat = Request["Category"]; } // Build the channel element BuildChannelHead(rss, Settings.WikiTitle + " - " + Properties.Messages.DiscussionUpdates, Settings.MainUrl, Settings.MainUrl + UrlTools.BuildUrl("RSS.aspx", (useCat ? ("?Category=" + cat) : "")), Properties.Messages.RecentDiscussionUpdates); RecentChange[] ch = RecentChanges.GetAllChanges(); Array.Reverse(ch); for (int i = 0; i < ch.Length; i++) { // Skip page-related entries if (!IsMessageChange(ch[i].Change)) { continue; } PageInfo p = Pages.FindPage(ch[i].Page); if (p != null) { // Check permissions for every page bool canReadThisPageDiscussion = AuthChecker.CheckActionForPage(p, Actions.ForPages.ReadDiscussion, currentUsername, currentGroups); if (!canReadThisPageDiscussion) { continue; } if (useCat) { CategoryInfo[] infos = Pages.GetCategoriesForPage(p); if (infos.Length == 0 && cat != "-") { continue; } if (infos.Length != 0) { bool found = false; for (int k = 0; k < infos.Length; k++) { if (infos[k].FullName == cat) { found = true; break; } } if (!found) { continue; } } } // Check namespace if (NameTools.GetNamespace(p.FullName) != currentNamespace) { continue; } // Write the item element rss.WriteStartElement("item"); rss.WriteStartElement("title"); rss.WriteCData(Properties.Messages.Discussion + ": " + Formatter.StripHtml(FormattingPipeline.PrepareTitle(ch[i].Title, false, FormattingContext.PageContent, p))); rss.WriteEndElement(); string id = Tools.GetMessageIdForAnchor(ch[i].DateTime); if (ch[i].Change != Change.MessageDeleted) { rss.WriteElementString("link", Settings.MainUrl + ch[i].Page + Settings.PageExtension + "?Discuss=1#" + id); } else { rss.WriteElementString("link", Settings.MainUrl + ch[i].Page + Settings.PageExtension + "?Discuss=1"); } string messageContent = FindMessageContent(ch[i].Page, id); UserInfo user = Users.FindUser(ch[i].User); string username = user != null?Users.GetDisplayName(user) : ch[i].User; // Create the description tag StringBuilder sb = new StringBuilder(); if (rssFeedsMode == RssFeedsMode.Summary || messageContent == null) { switch (ch[i].Change) { case Change.MessagePosted: sb.Append(Properties.Messages.AMessageHasBeenPostedBy.Replace("##SUBJECT##", ch[i].MessageSubject)); break; case Change.MessageEdited: sb.Append(Properties.Messages.AMessageHasBeenEditedBy.Replace("##SUBJECT##", ch[i].MessageSubject)); break; case Change.MessageDeleted: sb.Append(Properties.Messages.AMessageHasBeenDeletedBy.Replace("##SUBJECT##", ch[i].MessageSubject)); break; } sb.Append(" " + username + (ch[i].Description.Length > 0 ? ".<br />" + ch[i].Description : ".")); } else { sb.Append(FormattingPipeline.FormatWithPhase3(FormattingPipeline.FormatWithPhase1And2(messageContent, false, FormattingContext.MessageBody, null), FormattingContext.MessageBody, null)); } rss.WriteStartElement("description"); rss.WriteCData(sb.ToString()); rss.WriteEndElement(); // Write the remaining elements rss.WriteElementString("author", username); rss.WriteElementString("pubDate", ch[i].DateTime.ToUniversalTime().ToString("R")); rss.WriteStartElement("guid"); rss.WriteAttributeString("isPermaLink", "false"); rss.WriteString(GetGuid(ch[i].Page, ch[i].DateTime)); rss.WriteEndElement(); // Complete the item element rss.WriteEndElement(); } } // Complete the channel element CompleteCurrentElement(rss); // Complete the rss element CompleteCurrentElement(rss); // Finish off rss.Flush(); rss.Close(); } } } }