Пример #1
0
        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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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);
        }