/// <inheritdoc/> protected override void Write(StringRender renderer, SectionToken obj, Context context) { var value = context.Lookup(obj.SectionName); if (!context.IsTruthyValue(value)) { return; } if (value is IEnumerable && !context.RendererSettings.SectionBlacklistTypes.Any(x => x.IsInstanceOfType(value))) { var arrayValue = value as IEnumerable; foreach (var v in arrayValue) { renderer.Render(obj, context.Push(v)); } } else if (value is IEnumerator) { var enumeratorValue = value as IEnumerator; while (enumeratorValue.MoveNext()) { renderer.Render(obj, context.Push(enumeratorValue.Current)); } enumeratorValue.Reset(); } else if (LambdaTypes.Contains(value.GetType())) { var sectionContent = obj.SectionContent.ToString(); switch (value) { case Func <dynamic, string, object> func: value = func(context.View, sectionContent); break; case Func <string, object> func: value = func(sectionContent); break; case Func <dynamic, string, Func <string, string>, object> func: value = func(context.View, sectionContent, RenderInContext(context, obj.Tags)); break; case Func <string, Func <string, string>, object> func: value = func(sectionContent, RenderInContext(context, obj.Tags)); break; } var valueString = value?.ToString() ?? string.Empty; renderer.Render(context.RendererSettings.Parser.Parse(valueString, obj.Tags), context); } else if (value is IDictionary || value != null) { renderer.Render(obj, context.Push(value)); } }
/// <inheritdoc/> protected override void Write(StringRender renderer, InterpolationToken obj, Context context) { var value = context.Lookup(obj.Content.ToString()); var functionValueDynamic = value as Func <dynamic, object>; var functionValue = value as Func <object>; if (functionValueDynamic != null || functionValue != null) { object functionResult = functionValueDynamic != null?functionValueDynamic.Invoke(context.View) : functionValue.Invoke(); var resultString = functionResult.ToString(); if (resultString.Contains("{{")) { renderer.Render(context.RendererSettings.Parser.Parse(resultString), context); return; } value = resultString; } if (obj.EscapeResult && value != null) { value = WebUtility.HtmlEncode(value.ToString()); } if (obj.Indent > 0) { renderer.Write(' ', obj.Indent); } renderer.Write(value?.ToString()); }
/// <inheritdoc/> public string Render(string template, object view, IDictionary <string, string> partials, RenderSettings settings) { var loadedTemplate = RendererSettings.TemplateLoader.Load(template); if (loadedTemplate == null) { throw new UnknownTemplateException("No template was found with the name '" + template + "'"); } var document = RendererSettings.Parser.Parse(loadedTemplate, RendererSettings.DefaultTags, pipeline: RendererSettings.ParserPipeline); var textwriter = new StringWriter(); var renderer = new StringRender(textwriter, RendererSettings.RendererPipeline, RendererSettings.MaxRecursionDepth); var partialsLoader = RendererSettings.PartialTemplateLoader; if (partials != null && partials.Keys.Count > 0) { partialsLoader = new CompositeLoader(new DictionaryLoader(partials), RendererSettings.PartialTemplateLoader); } renderer.Render(document, new Context(view, RendererSettings, partialsLoader, settings ?? RendererSettings.RenderSettings)); renderer.Writer.Flush(); return(((StringWriter)renderer.Writer).ToString()); }
/// <inheritdoc/> protected override void Write(StringRender renderer, SectionToken obj, Context context) { var value = context.Lookup(obj.SectionName); if (!context.IsTruthyValue(value)) { return; } if (value is IEnumerable && !context.RendererSettings.SectionBlacklistTypes.Any(x => x.IsInstanceOfType(value))) { var arrayValue = value as IEnumerable; foreach (var v in arrayValue) { renderer.Render(obj, context.Push(v)); } } else if (value is IEnumerator) { var enumeratorValue = value as IEnumerator; while (enumeratorValue.MoveNext()) { renderer.Render(obj, context.Push(enumeratorValue.Current)); } enumeratorValue.Reset(); } else if (value is Func <dynamic, string, object> || value is Func <string, object> ) { var functionDynamicValue = value as Func <dynamic, string, object>; var functionStringValue = value as Func <string, object>; var sectionContent = obj.SectionContent; value = functionDynamicValue != null ? functionDynamicValue.Invoke(context.View, sectionContent.ToString()) : functionStringValue.Invoke(sectionContent.ToString()); renderer.Render(context.RendererSettings.Parser.Parse(value.ToString(), obj.Tags), context); } else if (value is IDictionary || value != null) { renderer.Render(obj, context.Push(value)); } }
/// <inheritdoc/> protected override void Write(StringRender renderer, InvertedSectionToken obj, Context context) { var value = context.Lookup(obj.SectionName); if (!context.IsTruthyValue(value)) { renderer.Render(obj, context); } }
/// <inheritdoc/> protected override void Write(StringRender renderer, PartialToken obj, Context context) { var partialName = obj.Content; string template = null; if (context.PartialLoader != null) { template = context.PartialLoader.Load(partialName.ToString()); } if (template != null) { renderer.Render(context.RendererSettings.Parser.Parse(template, lineIndent: obj.LineIndent), context); } }
/// <inheritdoc /> protected override void Write(StringRender renderer, InterpolationToken obj, Context context) { var content = obj.Content.ToString(); string format = null; var pos = content.IndexOf(':'); if (pos > 0) { format = content.Substring(pos + 1); content = content.Substring(0, pos); } var value = context.Lookup(content); var functionValueDynamic = value as Func <dynamic, object>; var functionValue = value as Func <object>; if (functionValueDynamic != null || functionValue != null) { object functionResult = functionValueDynamic != null?functionValueDynamic.Invoke(context.View) : functionValue.Invoke(); var resultString = functionResult.ToString(); if (resultString.Contains("{{")) { renderer.Render(context.RendererSettings.Parser.Parse(resultString), context); return; } value = resultString; } var formattedValue = ApplyFormat(value, format); if (!context.RenderSettings.SkipHtmlEncoding && obj.EscapeResult && value != null) { formattedValue = WebUtility.HtmlEncode(formattedValue); } if (obj.Indent > 0) { renderer.Write(' ', obj.Indent); } renderer.Write(formattedValue); }
private Func <string, string> RenderInContext(Context context, Classes.Tags tags) { return((str) => { if (!str.Contains(tags.StartTag)) { return str; } using var writer = new StringWriter(); var blockRenderer = new StringRender(writer, context.RendererSettings.RendererPipeline); var parsed = context.RendererSettings.Parser.Parse(str, tags); blockRenderer.Render(parsed, context); return writer.ToString(); }); }