/// <summary> /// Appends the content of the required header. /// </summary> /// <param name="stringBuilder">The string builder.</param> /// <exception cref="System.InvalidOperationException">Invalid SiteMap node specified. Either the current group node doesn't have child nodes or the current user does not have rights to view any of the child nodes.</exception> private void AppendRequiredHeaderContent(StringBuilder stringBuilder, bool setTitle = true) { var pageData = MasterPageBuilder.GetRequestedPageData(); if (pageData != null) { stringBuilder.Append(this.ResourceRegistrations()); var robotsTag = this.GetRobotsMetaTag(pageData); if (!string.IsNullOrEmpty(robotsTag)) { stringBuilder.Append("\r\n\t" + robotsTag); } if (setTitle) { stringBuilder.Append("\r\n\t<title>" + pageData.HtmlTitle.ToString() + "\r\n\t</title>"); } var descriptionTag = this.GetDescriptionTag(pageData); if (!string.IsNullOrEmpty(descriptionTag)) { stringBuilder.Append("\r\n\t" + descriptionTag); } var keywordsTag = this.GetKeywordsTag(pageData); if (!string.IsNullOrEmpty(keywordsTag)) { stringBuilder.Append("\r\n\t" + keywordsTag); } } }
/// <summary> /// Appends the content of the required header. /// </summary> /// <param name="stringBuilder">The string builder.</param> /// <param name="setTitle">if set to <c>true</c> will set the title.</param> /// <exception cref="System.InvalidOperationException">Invalid SiteMap node specified. Either the current group node doesn't have child nodes or the current user does not have rights to view any of the child nodes.</exception> private void AppendRequiredHeaderContent(StringBuilder stringBuilder, bool setTitle = true) { var pageData = MasterPageBuilder.GetRequestedPageData(); if (pageData != null && setTitle) { stringBuilder.Append("\r\n\t<title>" + pageData.HtmlTitle.ToString() + "\r\n\t</title>"); } }
public void AddMasterPageDirectives_CustomString_AppendsMasterDirective() { //Arrange var layoutTemplateHtmlProcessor = new MasterPageBuilder(); var htmlString = "Some html string"; //Act htmlString = layoutTemplateHtmlProcessor.AddMasterPageDirectives(htmlString); //Assert Assert.IsTrue(htmlString.StartsWith(MasterPageBuilderTests.masterPageDirective), "Master page doesn't start with" + MasterPageBuilderTests.masterPageDirective); }
/// <summary> /// Gets the layout template. /// </summary> /// <param name="templateName"></param> /// <param name="model">The model.</param> /// <param name="isPartial">if set to <c>true</c> requested view is partial.</param> /// <returns></returns> public virtual string GetLayoutTemplate(string templateName, object model = null, bool isPartial = false) { var genericController = this.CreateController(); var layoutHtmlString = this.RenderViewToString(genericController.ControllerContext, templateName, model, isPartial); if (!layoutHtmlString.IsNullOrEmpty()) { var htmlProcessor = new MasterPageBuilder(); layoutHtmlString = htmlProcessor.ProcessLayoutString(layoutHtmlString); layoutHtmlString = htmlProcessor.AddMasterPageDirectives(layoutHtmlString); } return(layoutHtmlString); }
/// <summary> /// Gets the layout template. /// </summary> /// <param name="templateName">The name of the layout template to render.</param> /// <param name="placeholdersOnly">When true the method returns a master page containing only content placeholders.</param> /// <returns></returns> public virtual string GetLayoutTemplate(string templateName, bool placeholdersOnly = false) { var genericController = this.CreateController(); var layoutHtmlString = this.RenderViewToString(genericController.ControllerContext, templateName, placeholdersOnly); if (!layoutHtmlString.IsNullOrEmpty() && !placeholdersOnly) { var htmlProcessor = new MasterPageBuilder(); layoutHtmlString = htmlProcessor.ProcessLayoutString(layoutHtmlString); layoutHtmlString = htmlProcessor.AddMasterPageDirectives(layoutHtmlString); } return(layoutHtmlString); }
/// <summary> /// Gets the layout template. /// </summary> /// <param name="templateName"></param> /// <param name="model">The model.</param> /// <param name="partial">if set to <c>true</c> requested view is partial.</param> /// <returns></returns> public virtual string GetLayoutTemplate(string templateName, object model = null, bool partial = false) { var genericController = this.CreateController(); var layoutHtmlString = this.RenderViewToString(genericController.ControllerContext, templateName, model, partial); if (!layoutHtmlString.IsNullOrEmpty()) { var htmlProcessor = new MasterPageBuilder(); layoutHtmlString = htmlProcessor.ProcessLayoutString(layoutHtmlString); layoutHtmlString = htmlProcessor.AddMasterPageDirectives(layoutHtmlString); } return layoutHtmlString; }
/// <summary> /// Gets the requested page data. /// </summary> /// <returns></returns> /// <exception cref="System.InvalidOperationException">Invalid SiteMap node specified. Either the current group node doesn't have child nodes or the current user does not have rights to view any of the child nodes.</exception> internal static PageData GetRequestedPageData() { var node = MasterPageBuilder.GetRequestedPageNode(); if (node != null) { var siteMap = (SiteMapBase)node.Provider; var pageManager = PageManager.GetManager(siteMap.PageProviderName); var pageData = pageManager.GetPageData(node.PageId); return(pageData); } else { return(null); } }
/// <summary> /// Adds variable parameters to the virtual path to allow caching of multiple versions based on parameters. /// </summary> /// <param name="layoutVirtualPath">The layout virtual path.</param> /// <returns>The path with appended variables.</returns> protected virtual string AddVariablesToPath(string layoutVirtualPath) { var varies = new List <string>(); var packagesManager = new PackageManager(); var currentPackage = packagesManager.GetCurrentPackage(); if (!currentPackage.IsNullOrEmpty()) { varies.Add(currentPackage); } if (SystemManager.CurrentContext.AppSettings.Multilingual) { varies.Add(CultureInfo.CurrentUICulture.Name); } if (MasterPageBuilder.IsFormTagRequired()) { varies.Add("form"); } else { varies.Add("noform"); } var pageData = MasterPageBuilder.GetRequestedPageData(); if (pageData != null) { varies.Add(pageData.Id.ToString()); varies.Add(pageData.Version.ToString(CultureInfo.InvariantCulture)); } layoutVirtualPath = (new VirtualPathBuilder()).AddParams(layoutVirtualPath, string.Join("_", varies)); return(layoutVirtualPath); }
/// <summary> /// Gets the layout template. /// </summary> /// <param name="templateName">The name of the layout template to render.</param> /// <param name="placeholdersOnly">When true the method returns a master page containing only content placeholders.</param> /// <returns></returns> public virtual string GetLayoutTemplate(string templateName, bool placeholdersOnly = false) { var genericController = this.CreateController(); var layoutHtmlString = this.RenderViewToString(genericController.ControllerContext, templateName, placeholdersOnly); if (!layoutHtmlString.IsNullOrEmpty() && !placeholdersOnly) { var htmlProcessor = new MasterPageBuilder(); layoutHtmlString = htmlProcessor.ProcessLayoutString(layoutHtmlString); layoutHtmlString = htmlProcessor.AddMasterPageDirectives(layoutHtmlString); } return layoutHtmlString; }
/// <summary> /// Processes the layout string adding the required attributes to the head tag /// and also adding the required form tag. /// </summary> /// <param name="targetTemplate">The template.</param> /// <returns></returns> public virtual string ProcessLayoutString(string targetTemplate) { var includeFormTag = MasterPageBuilder.IsFormTagRequired(); StringBuilder outPut = new StringBuilder(); HtmlChunk chunk = null; using (HtmlParser parser = new HtmlParser(targetTemplate)) { parser.SetChunkHashMode(false); parser.AutoExtractBetweenTagsOnly = false; parser.CompressWhiteSpaceBeforeTag = false; parser.KeepRawHTML = true; bool setTitle = true; bool modified; bool isOpenBodyTag; bool isCloseBodyTag; bool isClosedHeadTag; while ((chunk = parser.ParseNext()) != null) { modified = false; isOpenBodyTag = false; isCloseBodyTag = false; isClosedHeadTag = false; if (chunk.Type == HtmlChunkType.OpenTag) { if (chunk.TagName.Equals("head", StringComparison.OrdinalIgnoreCase)) { if (!chunk.HasAttribute("runat")) { chunk.SetAttribute("runat", "server"); modified = true; } } else if (chunk.TagName.Equals("body", StringComparison.OrdinalIgnoreCase)) { isOpenBodyTag = true; } else if (chunk.TagName.Equals("title", StringComparison.OrdinalIgnoreCase)) { setTitle = false; } } else if (chunk.Type == HtmlChunkType.CloseTag) { if (chunk.TagName.Equals("body", StringComparison.OrdinalIgnoreCase)) { isCloseBodyTag = true; } if (chunk.TagName.Equals("head", StringComparison.OrdinalIgnoreCase)) { isClosedHeadTag = true; } } if (includeFormTag && isCloseBodyTag) { outPut.Append("</form>"); } else if (!includeFormTag && isClosedHeadTag) { this.AppendRequiredHeaderContent(outPut, setTitle); } if (modified) { outPut.Append(chunk.GenerateHtml()); } else { outPut.Append(chunk.Html); } if (includeFormTag && isOpenBodyTag) { outPut.Append("<form runat='server'>"); } } } return(outPut.ToString()); }