protected override LavaRenderResult OnRenderTemplate(ILavaTemplate inputTemplate, LavaRenderParameters parameters) { var templateProxy = inputTemplate as FluidTemplateProxy; var template = templateProxy?.FluidTemplate; var templateContext = parameters.Context as FluidRenderContext; if (templateContext == null) { throw new LavaException("Invalid LavaContext parameter. This context type is not compatible with the Fluid templating engine."); } var result = new LavaRenderResult(); var sb = new StringBuilder(); // Set the render options for culture and timezone if they are specified. if (parameters.Culture != null) { templateContext.FluidContext.Options.CultureInfo = parameters.Culture; } if (parameters.TimeZone != null) { templateContext.FluidContext.Options.TimeZone = parameters.TimeZone; } // Set the render options for encoding. System.Text.Encodings.Web.TextEncoder encoder; if (parameters.ShouldEncodeStringsAsXml) { encoder = System.Text.Encodings.Web.HtmlEncoder.Default; } else { encoder = NullEncoder.Default; } var writer = new StringWriter(sb); try { template.Render(templateContext.FluidContext, encoder, writer); writer.Flush(); result.Text = sb.ToString(); } catch (LavaInterruptException) { // The render was terminated intentionally, so return the current buffer content. writer.Flush(); result.Text = sb.ToString(); } finally { writer.Dispose(); } return(result); }
/// <summary> /// Render the Lava template using the DotLiquid rendering engine. /// </summary> /// <param name="inputTemplate"></param> /// <param name="output"></param> /// <param name="context"></param> /// <returns></returns> protected override LavaRenderResult OnRenderTemplate(ILavaTemplate template, LavaRenderParameters parameters) { var result = new LavaRenderResult(); var renderSettings = new RenderParameters(); // Set the flag to rethrow exceptions generated by the DotLiquid framework, so they can be intercepted and handled as Lava errors. // Note that this flag is required in addition to the Context(rethrowErrors) constructor parameter. renderSettings.RethrowErrors = true; var templateContext = parameters.Context as DotLiquidRenderContext; if (templateContext == null) { throw new LavaException("Invalid LavaContext parameter. This context type is not compatible with the DotLiquid templating engine."); } var dotLiquidContext = templateContext.DotLiquidContext; renderSettings.Context = dotLiquidContext; if (parameters.ShouldEncodeStringsAsXml) { renderSettings.ValueTypeTransformers = new Dictionary <Type, Func <object, object> >(); renderSettings.ValueTypeTransformers.Add(typeof(string), EncodeStringTransformer); } // Call the Render method of the underlying DotLiquid template. var templateProxy = template as DotLiquidTemplateProxy; if (templateProxy == null) { throw new Exception("Render failed. The provided template instance is not compatible with the DotLiquid engine."); } result.Text = templateProxy.DotLiquidTemplate.Render(renderSettings); if (renderSettings.Context.Errors != null) { if (renderSettings.Context.Errors.Count > 1) { result.Error = new AggregateException(renderSettings.Context.Errors); } else { result.Error = renderSettings.Context.Errors.FirstOrDefault(); } } return(result); }
/// <summary> /// Render the Lava template using the DotLiquid rendering engine. /// </summary> /// <param name="inputTemplate"></param> /// <param name="output"></param> /// <param name="context"></param> /// <returns></returns> protected override LavaRenderResult OnRenderTemplate(ILavaTemplate template, LavaRenderParameters parameters) { var result = new LavaRenderResult(); try { var renderSettings = new RenderParameters(); // Set the flag to rethrow exceptions generated by the DotLiquid framework, so they can be intercepted and handled as Lava errors. // Note that this flag is required in addition to the Context(rethrowErrors) constructor parameter. renderSettings.RethrowErrors = true; var templateContext = parameters.Context as RockLiquidRenderContext; if (templateContext == null) { throw new LavaException("Invalid LavaContext parameter. This context type is not compatible with the RockLiquid templating engine."); } var dotLiquidContext = templateContext.DotLiquidContext; renderSettings.Context = dotLiquidContext; if (parameters.ShouldEncodeStringsAsXml) { renderSettings.ValueTypeTransformers = new Dictionary <Type, Func <object, object> >(); renderSettings.ValueTypeTransformers.Add(typeof(string), EncodeStringTransformer); } // Call the Render method of the underlying DotLiquid template. var templateProxy = template as DotLiquidTemplateProxy; result.Text = templateProxy.DotLiquidTemplate.Render(renderSettings); if (renderSettings.Context.Errors != null) { if (renderSettings.Context.Errors.Count > 1) { result.Error = new AggregateException(renderSettings.Context.Errors); } else { result.Error = renderSettings.Context.Errors.FirstOrDefault(); } } } catch (LavaInterruptException) { // Ignore this exception, it is thrown by custom Lava components to terminate the render process prematurely. } catch (Exception ex) { string output; ProcessException(ex, parameters.ExceptionHandlingStrategy, out output); result.Text = output; result.Error = ex; } return(result); }