Beispiel #1
0
        public HandlebarsTemplate <TextWriter, object, object> Compile(TextReader template)
        {
            using var container = AmbientContext.Use(_ambientContext);

            var configuration = CompiledConfiguration ?? new HandlebarsConfigurationAdapter(Configuration);

            var formatterProvider       = new FormatterProvider(configuration.FormatterProviders);
            var objectDescriptorFactory = new ObjectDescriptorFactory(configuration.ObjectDescriptorProviders);

            var localContext = AmbientContext.Create(
                _ambientContext,
                formatterProvider: formatterProvider,
                descriptorFactory: objectDescriptorFactory
                );

            using var localContainer = AmbientContext.Use(localContext);

            var compilationContext = new CompilationContext(configuration);

            using var reader = new ExtendedStringReader(template);
            var compiledTemplate = HandlebarsCompiler.Compile(reader, compilationContext);

            return((writer, context, data) =>
            {
                using var disposableContainer = AmbientContext.Use(localContext);

                if (writer is EncodedTextWriterWrapper encodedTextWriterWrapper)
                {
                    var encodedTextWriter = encodedTextWriterWrapper.UnderlyingWriter;
                    if (context is BindingContext bindingContext)
                    {
                        compiledTemplate(encodedTextWriter, bindingContext);
                        return;
                    }

                    using var newBindingContext = BindingContext.Create(configuration, context);
                    newBindingContext.SetDataObject(data);

                    compiledTemplate(encodedTextWriter, newBindingContext);
                }
                else
                {
                    if (context is BindingContext bindingContext)
                    {
                        var config = bindingContext.Configuration;
                        using var encodedTextWriter = new EncodedTextWriter(writer, config.TextEncoder, formatterProvider, config.NoEscape);
                        compiledTemplate(encodedTextWriter, bindingContext);
                    }
                    else
                    {
                        using var newBindingContext = BindingContext.Create(configuration, context);
                        newBindingContext.SetDataObject(data);

                        using var encodedTextWriter = new EncodedTextWriter(writer, configuration.TextEncoder, formatterProvider, configuration.NoEscape);
                        compiledTemplate(encodedTextWriter, newBindingContext);
                    }
                }
            });
        }
Beispiel #2
0
        private HandlebarsTemplate <TextWriter, object, object> CompileViewInternal(string templatePath, ViewReaderFactory readerFactoryFactory)
        {
            using var container = AmbientContext.Use(_ambientContext);

            var configuration = CompiledConfiguration ?? new HandlebarsConfigurationAdapter(Configuration);

            var formatterProvider       = new FormatterProvider(configuration.FormatterProviders);
            var objectDescriptorFactory = new ObjectDescriptorFactory(configuration.ObjectDescriptorProviders);

            var localContext = AmbientContext.Create(
                _ambientContext,
                formatterProvider: formatterProvider,
                descriptorFactory: objectDescriptorFactory
                );

            using var localContainer = AmbientContext.Use(localContext);

            var createdFeatures = configuration.Features;

            for (var index = 0; index < createdFeatures.Count; index++)
            {
                createdFeatures[index].OnCompiling(configuration);
            }

            var compilationContext = new CompilationContext(configuration);
            var compiledView       = HandlebarsCompiler.CompileView(readerFactoryFactory, templatePath, compilationContext);

            for (var index = 0; index < createdFeatures.Count; index++)
            {
                createdFeatures[index].CompilationCompleted();
            }

            return((writer, context, data) =>
            {
                using var disposableContainer = AmbientContext.Use(localContext);

                if (context is BindingContext bindingContext)
                {
                    bindingContext.Extensions["templatePath"] = templatePath;
                    var config = bindingContext.Configuration;
                    using var encodedTextWriter = new EncodedTextWriter(writer, config.TextEncoder, formatterProvider, config.NoEscape);
                    compiledView(encodedTextWriter, bindingContext);
                }
                else
                {
                    using var newBindingContext = BindingContext.Create(configuration, context);
                    newBindingContext.Extensions["templatePath"] = templatePath;
                    newBindingContext.SetDataObject(data);

                    using var encodedTextWriter = new EncodedTextWriter(writer, configuration.TextEncoder, formatterProvider, configuration.NoEscape);
                    compiledView(encodedTextWriter, newBindingContext);
                }
            });
        }