public void Can_Render_MarkdownPage_with_comments() { var template = @"# Dynamic If Markdown Template Hello @Model.FirstName, @if (Model.FirstName == ""Bellot"") { * @Model.FirstName } @* @if (Model.LastName == ""Bellot"") { * @Model.LastName } *@ @* Plain text in a comment *@ ### heading 3"; var expectedHtml = @"<h1>Dynamic If Markdown Template</h1> <p>Hello Demis,</p> <h3>heading 3</h3> ".NormalizeNewLines(); var dynamicPage = new MarkdownPage(markdownFormat, "/path/to/tpl", "DynamicIfTpl", template); dynamicPage.Compile(); var templateOutput = dynamicPage.RenderToHtml(templateArgs); Console.WriteLine(templateOutput); Assert.That(templateOutput, Is.EqualTo(expectedHtml)); }
public void Does_handle_foreach_when_enumerable_is_empty_first_time() { var content = (string)dynamicListPageContent.Clone(); var markdownPage = new MarkdownPage(new MarkdownFormat(), dynamicListPagePath, "", content); markdownPage.Compile(); var model = new Person { Links = new List <Link>() }; var scopeArgs = new Dictionary <string, object> { { "Model", model } }; markdownPage.RenderToHtml(scopeArgs); // First time the list is empty var expected = "A new list item"; model.Links.Add(new Link { Name = expected }); var html = markdownPage.RenderToHtml(scopeArgs); // Second time the list has 1 item Console.WriteLine(html); Assert.That(html, Contains.Substring(expected)); }
public void Can_inherit_from_CustomViewPage_using_inherits_directive() { var template = @"@inherits ServiceStack.ServiceHost.Tests.Formats.TemplateTests+CustomMarkdownViewBase<ServiceStack.ServiceHost.Tests.Formats.TemplateTests+Person> # Generic View Page ## Form fields @Html.LabelFor(m => m.FirstName) @Html.TextBoxFor(m => m.FirstName) ## Person Table @Table(Model) "; var expectedHtml = @"<h1>Generic View Page</h1> <h2>Form fields</h2> <label for=""FirstName"">FirstName</label> <input id=""FirstName"" name=""FirstName"" type=""text"" value=""Demis"" /><h2>Person Table</h2> <table><caption>Demis's Links</caption><thead><tr><th>Name</th><th>Link</th></tr></thead> <tbody> <tr><td>ServiceStack</td><td>http://www.servicestack.net</td></tr><tr><td>AjaxStack</td><td>http://www.ajaxstack.com</td></tr></tbody> </table> ".NormalizeNewLines(); var dynamicPage = new MarkdownPage(markdownFormat, "/path/to/tpl", "DynamicModelTpl", template); dynamicPage.Compile(); var templateOutput = dynamicPage.RenderToHtml(templateArgs); templateOutput = templateOutput.Replace("\r\n", "\n"); Assert.That(dynamicPage.ExecutionContext.BaseType, Is.EqualTo(typeof(CustomMarkdownViewBase <>))); Console.WriteLine(templateOutput); Assert.That(templateOutput, Is.EqualTo(expectedHtml)); }
public void Can_Render_MarkdownPage_with_external_helper_using_helper_directive() { var template = @"@helper Ext: ServiceStack.ServiceHost.Tests.Formats.TemplateTests+CustomMarkdownHelper # View Page with Custom Helper ## External Helper ![inline-img](path/to/img) @Ext.InlineBlock(Model.FirstName, ""first-name"") "; var expectedHtml = @"<h1>View Page with Custom Helper</h1> <h2>External Helper</h2> <p><img src=""path/to/img"" alt=""inline-img"" /> <div id=""first-name""><div class=""inner inline-block"">Demis</div></div>".NormalizeNewLines(); var dynamicPage = new MarkdownPage(markdownFormat, "/path/to/tpl", "DynamicModelTpl", template); dynamicPage.Compile(); var templateOutput = dynamicPage.RenderToHtml(templateArgs); templateOutput = templateOutput.Replace("\r\n", "\n"); Assert.That(dynamicPage.ExecutionContext.BaseType, Is.EqualTo(typeof(MarkdownViewBase))); Console.WriteLine(templateOutput); Assert.That(templateOutput, Is.EqualTo(expectedHtml)); }
public void Can_Render_MarkdownPage_with_IF_statement() { var template = @"# Dynamic If Markdown Template Hello @Model.FirstName, @if (Model.FirstName == ""Bellot"") { * @Model.FirstName } @if (Model.LastName == ""Bellot"") { * @Model.LastName } ### heading 3"; var expected = @"# Dynamic If Markdown Template Hello Demis, * Bellot ### heading 3"; var expectedHtml = markdownFormat.Transform(expected); var dynamicPage = new MarkdownPage(markdownFormat, "/path/to/tpl", "DynamicIfTpl", template); dynamicPage.Compile(); var templateOutput = dynamicPage.RenderToHtml(templateArgs); Console.WriteLine(templateOutput); Assert.That(templateOutput, Is.EqualTo(expectedHtml)); }
public void Can_inherit_from_Generic_view_page_from_model_directive() { var template = @"@model ServiceStack.ServiceHost.Tests.Formats.TemplateTests+Person # Generic View Page ## Form fields @Html.LabelFor(m => m.FirstName) @Html.TextBoxFor(m => m.FirstName) "; var expectedHtml = @"<h1>Generic View Page</h1> <h2>Form fields</h2> <label for=""FirstName"">FirstName</label> <input id=""FirstName"" name=""FirstName"" type=""text"" value=""Demis"" />".NormalizeNewLines(); var dynamicPage = new MarkdownPage(markdownFormat, "/path/to/tpl", "DynamicModelTpl", template); dynamicPage.Compile(); var templateOutput = dynamicPage.RenderToHtml(templateArgs); templateOutput = templateOutput.Replace("\r\n", "\n"); Assert.That(dynamicPage.ExecutionContext.BaseType, Is.EqualTo(typeof(MarkdownViewBase <>))); Console.WriteLine(templateOutput); Assert.That(templateOutput, Is.EqualTo(expectedHtml)); }
public void Can_Render_MarkdownPage_with_foreach() { var dynamicPage = new MarkdownPage(markdownFormat, dynamicListPagePath, "DynamicListTpl", dynamicListPageContent); dynamicPage.Compile(); Assert.That(dynamicPage.HtmlBlocks.Length, Is.EqualTo(11)); var expectedMarkdown = dynamicListPageContent .Replace("@Model.FirstName", person.FirstName) .Replace("@Model.LastName", person.LastName); var foreachLinks = " - ServiceStack - http://www.servicestack.net\r\n" + " - AjaxStack - http://www.ajaxstack.com\r\n"; expectedMarkdown = expectedMarkdown.ReplaceForeach(foreachLinks); var expectedHtml = markdownFormat.Transform(expectedMarkdown); Console.WriteLine("ExpectedHtml: " + expectedHtml); var templateOutput = dynamicPage.RenderToHtml(templateArgs); Console.WriteLine("Template Output: " + templateOutput); Assert.That(templateOutput, Is.EqualTo(expectedHtml)); }
public void AddPage(MarkdownPage page) { try { page.Compile(); AddViewPage(page); } catch (Exception ex) { Log.Error("AddViewPage() page.Prepare(): " + ex.Message, ex); } try { var templatePath = page.Template; if (page.Template == null) { return; } if (MasterPageTemplates.ContainsKey(templatePath)) { return; } var templateFile = VirtualPathProvider.GetFile(templatePath); var templateContents = GetPageContents(templateFile); AddTemplate(templatePath, templateContents); } catch (Exception ex) { Log.Error("Error compiling template " + page.Template + ": " + ex.Message, ex); } }
public void Can_Render_Markdown_with_variable_statements() { var template = @"## Welcome to Razor! @var lastName = Model.LastName; Hello @Upper(lastName), @Model.FirstName ### Breadcrumbs @Combine("" / "", Model.FirstName, lastName) @var links = Model.Links ### Menus @foreach (var link in links) { - @link.Name - @link.Href @var labels = link.Labels @foreach (var label in labels) { - @label } }".NormalizeNewLines(); var expectedHtml = @"## Welcome to Razor! Hello BELLOT, Demis ### Breadcrumbs Demis / Bellot ### Menus - ServiceStack - http://www.servicestack.net - REST - JSON - XML - AjaxStack - http://www.ajaxstack.com - HTML5 - AJAX - SPA ".NormalizeNewLines(); var dynamicPage = new MarkdownPage(markdownFormat, "/path/to/tpl", "DynamicModelTpl", template); dynamicPage.Compile(); var templateOutput = dynamicPage.RenderToMarkdown(templateArgs); templateOutput = templateOutput.Replace("\r\n", "\n"); Assert.That(dynamicPage.ExecutionContext.BaseType, Is.EqualTo(typeof(MarkdownViewBase))); Console.WriteLine(templateOutput); Assert.That(templateOutput, Is.EqualTo(expectedHtml)); }
public void Can_Render_Markdown_with_Nested_Statements() { var template = @"# @Model.FirstName Dynamic Nested Markdown Template # heading 1 @foreach (var link in Model.Links) { @if (link.Name == ""AjaxStack"") { - @link.Name - @link.Href } } @if (Model.Links.Count == 2) { ## Haz 2 links @foreach (var link in Model.Links) { - @link.Name - @link.Href @foreach (var label in link.Labels) { - @label } } } ### heading 3".NormalizeNewLines(); var expected = @"# Demis Dynamic Nested Markdown Template # heading 1 - AjaxStack - http://www.ajaxstack.com ## Haz 2 links - ServiceStack - http://www.servicestack.net - REST - JSON - XML - AjaxStack - http://www.ajaxstack.com - HTML5 - AJAX - SPA ### heading 3".NormalizeNewLines(); var expectedHtml = markdownFormat.Transform(expected); var dynamicPage = new MarkdownPage(markdownFormat, "/path/to/tpl", "DynamicNestedTpl", template); dynamicPage.Compile(); var templateOutput = dynamicPage.RenderToHtml(templateArgs); Console.WriteLine(templateOutput); Assert.That(templateOutput, Is.EqualTo(expectedHtml)); }
public void Can_Render_MarkdownPage() { var dynamicPage = new MarkdownPage(markdownFormat, dynamicPageContent, "DynamicTpl", dynamicPageContent); dynamicPage.Compile(); Assert.That(dynamicPage.HtmlBlocks.Length, Is.EqualTo(9)); var expectedHtml = markdownFormat.Transform(dynamicPageContent) .Replace("@Model.FirstName", person.FirstName) .Replace("@Model.LastName", person.LastName); var templateOutput = dynamicPage.RenderToHtml(templateArgs); Console.WriteLine("Template Output: " + templateOutput); Assert.That(templateOutput, Is.EqualTo(expectedHtml)); }
public void Can_Render_MarkdownPage_with_unmatching_escaped_braces() { var template = @"# Dynamic If Markdown Template Hello @Model.FirstName, { -- unmatched, leave unescaped outside statement { -- inside matching braces, outside statement -- } @if (Model.LastName == ""Bellot"") { * @Model.LastName {{ -- inside matching braces, escape inside statement -- }} {{ -- unmatched } ### heading 3"; var expectedHtml = @"<h1>Dynamic If Markdown Template</h1> <p>Hello Demis, { -- unmatched, leave unescaped outside statement</p> <p>{ -- inside matching braces, outside statement -- }</p> <ul> <li>Bellot</li> </ul> <p>{ -- inside matching braces, escape inside statement -- }</p> <p>{ -- unmatched</p> <h3>heading 3</h3> ".NormalizeNewLines(); var dynamicPage = new MarkdownPage(markdownFormat, "/path/to/tpl", "DynamicIfTpl", template); dynamicPage.Compile(); var templateOutput = dynamicPage.RenderToHtml(templateArgs); Console.WriteLine(templateOutput); Assert.That(templateOutput, Is.EqualTo(expectedHtml)); }
public void Can_capture_Section_statements_and_store_them_in_scopeargs() { var template = @"## Welcome to Razor! @var lastName = Model.LastName; @section Salutations { Hello @Upper(lastName), @Model.FirstName } @section Breadcrumbs { ### Breadcrumbs @Combine("" / "", Model.FirstName, lastName) } @var links = Model.Links @section Menus { ### Menus @foreach (var link in links) { - @link.Name - @link.Href @var labels = link.Labels @foreach (var label in labels) { - @label } } } ## Captured Sections <div id='breadcrumbs'>@Breadcrumbs</div> @Menus ## Salutations @Salutations".NormalizeNewLines(); var expectedHtml = @"<h2>Welcome to Razor!</h2> <h2>Captured Sections</h2> <div id='breadcrumbs'><h3>Breadcrumbs</h3> <p>Demis / Bellot</p> </div> <p><h3>Menus</h3> <ul> <li> ServiceStack - http://www.servicestack.net <ul> <li>REST</li> <li>JSON</li> <li>XML</li> </ul> </li> <li> AjaxStack - http://www.ajaxstack.com <ul> <li>HTML5</li> <li>AJAX</li> <li>SPA</li> </ul> </li> </ul> </p> <h2>Salutations</h2> <p><p>Hello BELLOT, Demis</p> </p> ".NormalizeNewLines(); var dynamicPage = new MarkdownPage(markdownFormat, "/path/to/tpl", "DynamicModelTpl", template); dynamicPage.Compile(); var templateOutput = dynamicPage.RenderToHtml(templateArgs); templateOutput = templateOutput.Replace("\r\n", "\n"); Assert.That(dynamicPage.ExecutionContext.BaseType, Is.EqualTo(typeof(MarkdownViewBase))); Console.WriteLine(templateOutput); Assert.That(templateArgs["Salutations"].ToString(), Is.EqualTo("<p>Hello BELLOT, Demis</p>\n")); Assert.That(templateOutput, Is.EqualTo(expectedHtml)); }
public void Can_Render_page_to_Markdown_only() { var headerTemplate = @"## Header Links! - [Google](http://google.com) - [Bing](http://bing.com) "; var template = @"## Welcome to Razor! @Html.Partial(""HeaderLinks"", Model) Hello @Upper(Model.LastName), @Model.FirstName ### Breadcrumbs @Combine("" / "", Model.FirstName, Model.LastName) ### Menus @foreach (var link in Model.Links) { - @link.Name - @link.Href @foreach (var label in link.Labels) { - @label } }".NormalizeNewLines(); var expectedHtml = @"## Welcome to Razor! ## Header Links! - [Google](http://google.com) - [Bing](http://bing.com) Hello BELLOT, Demis ### Breadcrumbs Demis / Bellot ### Menus - ServiceStack - http://www.servicestack.net - REST - JSON - XML - AjaxStack - http://www.ajaxstack.com - HTML5 - AJAX - SPA ".NormalizeNewLines(); markdownFormat.RegisterMarkdownPage(new MarkdownPage(markdownFormat, "/path/to/page", "HeaderLinks", headerTemplate)); var dynamicPage = new MarkdownPage(markdownFormat, "/path/to/tpl", "DynamicModelTpl", template); dynamicPage.Compile(); var templateOutput = dynamicPage.RenderToMarkdown(templateArgs); templateOutput = templateOutput.Replace("\r\n", "\n"); Assert.That(dynamicPage.ExecutionContext.BaseType, Is.EqualTo(typeof(MarkdownViewBase))); Console.WriteLine(templateOutput); Assert.That(templateOutput, Is.EqualTo(expectedHtml)); }
public void Can_Render_Markdown_with_StaticMethods() { var headerTemplate = @"## Header Links! - [Google](http://google.com) - [Bing](http://bing.com)"; var template = @"## Welcome to Razor! @Html.Partial(""HeaderLinks"", Model) Hello @Upper(Model.LastName), @Model.FirstName ### Breadcrumbs @Combine("" / "", Model.FirstName, Model.LastName) ### Menus @foreach (var link in Model.Links) { - @link.Name - @link.Href @foreach (var label in link.Labels) { - @label } } ### HTML Table @Table(Model) ".NormalizeNewLines(); var expectedHtml = @"<h2>Welcome to Razor!</h2> <h2>Header Links!</h2> <ul> <li><a href=""http://google.com"">Google</a></li> <li><a href=""http://bing.com"">Bing</a></li> </ul> <p>Hello BELLOT, Demis</p> <h3>Breadcrumbs</h3> Demis / Bellot<h3>Menus</h3> <ul> <li> ServiceStack - http://www.servicestack.net <ul> <li>REST</li> <li>JSON</li> <li>XML</li> </ul> </li> <li> AjaxStack - http://www.ajaxstack.com <ul> <li>HTML5</li> <li>AJAX</li> <li>SPA</li> </ul> </li> </ul> <h3>HTML Table</h3> <table><caption>Demis's Links</caption><thead><tr><th>Name</th><th>Link</th></tr></thead> <tbody> <tr><td>ServiceStack</td><td>http://www.servicestack.net</td></tr><tr><td>AjaxStack</td><td>http://www.ajaxstack.com</td></tr></tbody> </table> ".NormalizeNewLines(); markdownFormat.MarkdownBaseType = typeof(CustomMarkdownViewBase); markdownFormat.MarkdownGlobalHelpers = new Dictionary <string, Type> { { "Ext", typeof(CustomMarkdownHelper) } }; markdownFormat.RegisterMarkdownPage(new MarkdownPage(markdownFormat, "/path/to/page", "HeaderLinks", headerTemplate)); var dynamicPage = new MarkdownPage(markdownFormat, "/path/to/tpl", "DynamicIfTpl", template); dynamicPage.Compile(); var templateOutput = dynamicPage.RenderToHtml(templateArgs); templateOutput = templateOutput.Replace("\r\n", "\n"); templateOutput.Print(); Assert.That(templateOutput, Is.EqualTo(expectedHtml)); }