コード例 #1
0
ファイル: Render.cs プロジェクト: rdingwall/Nustache
 public static string StringToString(string template, object data, TemplateLocator templateLocator)
 {
     var reader = new StringReader(template);
     var writer = new StringWriter();
     Template(reader, data, writer, templateLocator);
     return writer.GetStringBuilder().ToString();
 }
コード例 #2
0
        public void It_can_include_templates_over_three_levels_with_external_includes()
        {
            var baseTemplate = new Template("Base");

            baseTemplate.Load(new StringReader("Base{{>BaseContent}}"));

            var masterTemplate = new Template("Master");

            masterTemplate.Load(new StringReader("{{<BaseContent}}Master{{>MasterContent}}{{/BaseContent}}{{>Base}}"));

            var templates = new Dictionary <string, Template>();

            templates.Add("Base", baseTemplate);
            templates.Add("Master", masterTemplate);

            TemplateLocator locateTemplate =
                name =>
            {
                Template ret;
                templates.TryGetValue(name, out ret);
                if (ret == null)
                {
                    throw new KeyNotFoundException(string.Format("The view '{0}' could not be found.", name));
                }
                return(ret);
            };

            var result = Render.StringToString("{{<MasterContent}}Hello{{/MasterContent}}{{>Master}}", null, locateTemplate);

            Assert.AreEqual("BaseMasterHello", result);
        }
コード例 #3
0
 public GivenAnTemplateLocator(ITestOutputHelper logger) : base(logger)
 {
     _resolver = new TemplateLocator();
     _fakeDotnetRootDirectory =
         Path.Combine(TestContext.Current.TestExecutionDirectory, Path.GetRandomFileName());
     _manifestDirectory = Path.Combine(_fakeDotnetRootDirectory, "workloadmanifests", "5.0.100");
     Directory.CreateDirectory(_manifestDirectory);
 }
コード例 #4
0
ファイル: Render.cs プロジェクト: rdingwall/Nustache
 public static void StringToFile(string template, object data, string outputPath, TemplateLocator templateLocator)
 {
     var reader = new StringReader(template);
     using (var writer = File.CreateText(outputPath))
     {
         Template(reader, data, writer, templateLocator);
     }
 }
コード例 #5
0
ファイル: Template.cs プロジェクト: kindohm/Nustache
        /// <summary>
        /// Renders the template.
        /// </summary>
        /// <param name="data">The data to use to render the template.</param>
        /// <param name="writer">The object to write the output to.</param>
        /// <param name="templateLocator">The delegate to use to locate templates for inclusion.</param>
        /// <remarks>
        /// The <paramref name="writer" /> is flushed, but not closed or disposed.
        /// </remarks>
        public void Render(object data, TextWriter writer, TemplateLocator templateLocator)
        {
            var context = new RenderContext(this, data, writer, templateLocator);

            Render(context);

            writer.Flush();
        }
コード例 #6
0
        public static string StringToString(string template, object data, TemplateLocator templateLocator)
        {
            var reader = new StringReader(template);
            var writer = new StringWriter();

            Template(reader, data, writer, templateLocator);
            return(writer.GetStringBuilder().ToString());
        }
コード例 #7
0
 public GivenAnTemplateLocator(ITestOutputHelper logger) : base(logger)
 {
     _resolver = new TemplateLocator(Environment.GetEnvironmentVariable, VSSettings.Ambient, null, null);
     _fakeDotnetRootDirectory =
         Path.Combine(TestContext.Current.TestExecutionDirectory, Path.GetRandomFileName());
     _manifestDirectory = Path.Combine(_fakeDotnetRootDirectory, "sdk-manifests", "5.0.100");
     Directory.CreateDirectory(_manifestDirectory);
 }
コード例 #8
0
 public RenderContext(Section section, object data, TextWriter writer, TemplateLocator templateLocator)
 {
     _sectionStack.Push(section);
     _dataStack.Push(data);
     _writer = writer;
     _templateLocator = templateLocator;
     _includeLevel = 0;
 }
コード例 #9
0
ファイル: Template.cs プロジェクト: rdingwall/Nustache
        /// <summary>
        /// Renders the template.
        /// </summary>
        /// <param name="data">The data to use to render the template.</param>
        /// <param name="writer">The object to write the output to.</param>
        /// <param name="templateLocator">The delegate to use to locate templates for inclusion.</param>
        /// <remarks>
        /// The <paramref name="writer" /> is flushed, but not closed or disposed.
        /// </remarks>
        public void Render(object data, TextWriter writer, TemplateLocator templateLocator)
        {
            var context = new RenderContext(this, data, writer, templateLocator);

            Render(context);

            writer.Flush();
        }
コード例 #10
0
ファイル: RenderContext.cs プロジェクト: mschaad/Nustache
 public RenderContext(Section section, object data, TextWriter writer, TemplateLocator templateLocator)
 {
     _sectionStack.Push(section);
     _dataStack.Push(data);
     _writer          = writer;
     _templateLocator = templateLocator;
     _includeLevel    = 0;
 }
コード例 #11
0
ファイル: Template.cs プロジェクト: brendanhay/Nustache
        public void Render(object data, TextWriter writer, TemplateLocator templateLocator,
            IValueProviderCollection valueProviders)
        {
            var context = new RenderContext(this, data, writer, templateLocator, valueProviders);

            Render(context);

            writer.Flush();
        }
コード例 #12
0
ファイル: CompileContext.cs プロジェクト: Romanx/Nustache
        public CompileContext(Section section, Type targetType, Expression dataParam, TemplateLocator templateLocator)
        {
            this.targetType = targetType;
            this.renderContext = new RenderContext(section, null, null, templateLocator);
            this.templateLocator = templateLocator;

            _targetObjectStack.Push(dataParam);
            _sectionStack.Push(section);
        }
コード例 #13
0
        public CompileContext(Section section, Type targetType, Expression dataParam, TemplateLocator templateLocator)
        {
            this.targetType      = targetType;
            this.renderContext   = new RenderContext(section, null, null, templateLocator);
            this.templateLocator = templateLocator;

            _targetObjectStack.Push(dataParam);
            _sectionStack.Push(section);
        }
コード例 #14
0
ファイル: RenderContext.cs プロジェクト: brendanhay/Nustache
 public RenderContext(Section section, object data, TextWriter writer, TemplateLocator templateLocator,
     IValueProviderCollection valueProviders)
 {
     _sectionStack.Push(section);
     _dataStack.Push(data);
     _writer = writer;
     _templateLocator = templateLocator;
     _valueProviders = valueProviders;
     _includeLevel = 0;
 }
コード例 #15
0
        /// <summary>
        /// Compiles the template into a Lambda function which can be executed later.
        /// </summary>
        /// <typeparam name="T">The type which the template will render against.  Missing
        /// properties/methods/fields will result in CompilationExceptions.</typeparam>
        /// <param name="templateLocator">The delegate to use to locate templates for inclusion.</param>
        /// <returns>A lambda expression representing the compiled template.</returns>
        public static Func <T, string> Compile <T>(this Template template, TemplateLocator templateLocator) where T : class
        {
            var param = Expression.Parameter(typeof(T), "data");

            var context = new CompileContext(template, typeof(T), param, templateLocator);

            var expression = Compile(template, context);

            return((Expression.Lambda <Func <T, string> >(expression, param)).Compile());
        }
コード例 #16
0
ファイル: Render.cs プロジェクト: Romanx/Nustache
        public static void Template(TextReader reader, object data, TextWriter writer, TemplateLocator templateLocator, RenderContextBehaviour renderContextBehaviour = null)
        {
            var template = new Template();
            template.Load(reader);

            var renderBehaviour = renderContextBehaviour ??
                                        RenderContextBehaviour.GetDefaultRenderContextBehaviour();

            template.Render(data, writer, templateLocator, renderBehaviour);
        }
コード例 #17
0
ファイル: Template.cs プロジェクト: reicheltp/Nustache
        public void Render(object data, TextWriter writer, TemplateLocator templateLocator, RenderContextBehaviour renderContextBehaviour)
        {
            var context = new RenderContext(this, data, writer, templateLocator, renderContextBehaviour);
            context.ActiveStartDelimiter = StartDelimiter;
            context.ActiveEndDelimiter = EndDelimiter;

            Render(context);

            writer.Flush();
        }
コード例 #18
0
        public static void StringToFile(
            string template, object data, string outputPath, TemplateLocator templateLocator, Options options)
        {
            var reader = new StringReader(template);

            using (StreamWriter writer = File.CreateText(outputPath))
            {
                Template(reader, data, writer, templateLocator, options);
            }
        }
コード例 #19
0
ファイル: Render.cs プロジェクト: Pxtl/Nustache.SqlClr
        public static string StringToString(string template, object data, TemplateLocator templateLocator, RenderContextBehaviour renderContextBehaviour = null)
        {
            var reader = new StringReader(template);
            var writer = new StringWriter();

            var renderBehaviour = renderContextBehaviour ??
                                  RenderContextBehaviour.GetDefaultRenderContextBehaviour();

            Template(reader, data, writer, templateLocator, renderBehaviour);
            return(writer.GetStringBuilder().ToString());
        }
コード例 #20
0
ファイル: RenderContext.cs プロジェクト: jdiamond/Nustache
 public RenderContext(RenderContext baseContext, TextWriter writer)
 {
     _sectionStack = baseContext._sectionStack;
     _dataStack = baseContext._dataStack;
     _writer = writer;
     _templateLocator = baseContext._templateLocator;
     _renderContextBehaviour = baseContext._renderContextBehaviour;
     _includeLevel = baseContext._includeLevel;
     _indent = baseContext._indent;
     _lineEnded = baseContext._lineEnded;
 }
コード例 #21
0
 public RenderContext(RenderContext baseContext, TextWriter writer)
 {
     _sectionStack           = baseContext._sectionStack;
     _dataStack              = baseContext._dataStack;
     _writer                 = writer;
     _templateLocator        = baseContext._templateLocator;
     _renderContextBehaviour = baseContext._renderContextBehaviour;
     _includeLevel           = baseContext._includeLevel;
     _indent                 = baseContext._indent;
     _lineEnded              = baseContext._lineEnded;
 }
コード例 #22
0
ファイル: RenderContext.cs プロジェクト: jdiamond/Nustache
        public RenderContext(Section section, object data, TextWriter writer, TemplateLocator templateLocator, RenderContextBehaviour renderContextBehaviour = null)
        {
            _sectionStack.Push(section);
            _dataStack.Push(data);
            _writer = writer;
            _templateLocator = templateLocator;
            _includeLevel = 0;

            _renderContextBehaviour = renderContextBehaviour ??
                                      RenderContextBehaviour.GetDefaultRenderContextBehaviour();
        }
コード例 #23
0
        public void Render(object data, TextWriter writer, TemplateLocator templateLocator, RenderContextBehaviour renderContextBehaviour)
        {
            var context = new RenderContext(this, data, writer, templateLocator, renderContextBehaviour);

            context.ActiveStartDelimiter = StartDelimiter;
            context.ActiveEndDelimiter   = EndDelimiter;

            Render(context);

            writer.Flush();
        }
コード例 #24
0
        public RenderContext(Section section, object data, TextWriter writer, TemplateLocator templateLocator, RenderContextBehaviour renderContextBehaviour = null)
        {
            _sectionStack.Push(section);
            _dataStack.Push(data);
            _writer          = writer;
            _templateLocator = templateLocator;
            _includeLevel    = 0;

            _renderContextBehaviour = renderContextBehaviour ??
                                      RenderContextBehaviour.GetDefaultRenderContextBehaviour();
        }
コード例 #25
0
ファイル: Render.cs プロジェクト: Romanx/Nustache
        public static string StringToString(string template, object data, TemplateLocator templateLocator, RenderContextBehaviour renderContextBehaviour = null)
        {
            var reader = new StringReader(template);
            var writer = new StringWriter();

            var renderBehaviour = renderContextBehaviour ??
                                         RenderContextBehaviour.GetDefaultRenderContextBehaviour();

            Template(reader, data, writer, templateLocator, renderBehaviour);
            return writer.GetStringBuilder().ToString();
        }
コード例 #26
0
        private static void RunMustacheSpecs(MustacheSpec.MustacheTest test)
        {
            TemplateLocator testDataTemplateLocator = name =>
            {
                if (test.Partials != null && test.Partials[name] != null)
                {
                    var template = new Template();
                    template.Load(new StringReader(test.Partials[name].ToString()));
                    return(template);
                }
                ;

                return(null);
            };

            var rendered = Render.StringToString(test.Template, test.Example, testDataTemplateLocator);

            Assert.AreEqual(test.Expected, rendered, "JSON object rendering failed for " + test.Description);

            rendered = Render.StringToString(test.Template, test.StronglyTypedExample, testDataTemplateLocator);
            Assert.AreEqual(test.Expected, rendered, "Strongly typed rendering failed for " + test.Description);

            var templ = new Template();

            templ.Load(new StringReader(test.Template));

            if (!test.Name.ToLower().Contains("context miss") &&
                !test.Name.ToLower().Contains("broken chain") &&
                !(test.SpecName == "inverted" && (test.Name == "List" || test.Name == "Context")))
            {
                var compiledTemplate = templ.Compile(
                    test.StronglyTypedExample != null ? test.StronglyTypedExample.GetType() : typeof(object),
                    testDataTemplateLocator);
                rendered = compiledTemplate(test.StronglyTypedExample);
                Assert.AreEqual(test.Expected, rendered, "Compiled Template rendering failed for " + test.Description);
            }
            else
            {
                bool gotException = false;
                try
                {
                    var compiledTemplate = templ.Compile(
                        test.StronglyTypedExample != null ? test.StronglyTypedExample.GetType() : typeof(object),
                        testDataTemplateLocator);
                }
                catch (Compilation.CompilationException)
                {
                    gotException = true;
                }

                Assert.IsTrue(gotException, "Expected test to throw a compilation exception for an invalid template");
            }
        }
コード例 #27
0
ファイル: Render.cs プロジェクト: Romanx/Nustache
        public static void StringToFile(string template, object data, string outputPath, TemplateLocator templateLocator, RenderContextBehaviour renderContextBehaviour = null)
        {
            var reader = new StringReader(template);

            var renderBehaviour = renderContextBehaviour ??
                                        RenderContextBehaviour.GetDefaultRenderContextBehaviour();

            using (var writer = File.CreateText(outputPath))
            {
                Template(reader, data, writer, templateLocator, renderBehaviour);
            }
        }
コード例 #28
0
        public void ItShouldReturnListOfTemplates()
        {
            var resolver        = new TemplateLocator();
            var stage2Dotnet    = new DirectoryInfo(TestContext.Current.ToolsetUnderTest.DotNetHostPath);
            var stage2Templates = stage2Dotnet.Parent.GetDirectories("templates")[0].EnumerateDirectories().First();

            resolver.SetDotnetSdkTemplatesLocation(stage2Templates);

            var result = resolver.GetDotnetSdkTemplatePackages("any");

            result.Should().NotBeEmpty();
        }
コード例 #29
0
        public static void Template(
            TextReader reader, object data, TextWriter writer, TemplateLocator templateLocator, Options options)
        {
            if (options == null)
            {
                options = Options.Defaults();
            }

            var template = new Template();

            template.Load(reader);
            template.Render(data, writer, templateLocator, options);
        }
コード例 #30
0
        public GivenAnTemplateLocator(ITestOutputHelper logger) : base(logger)
        {
            _resolver = new TemplateLocator(Environment.GetEnvironmentVariable, VSSettings.Ambient, null, null);
            _fakeDotnetRootDirectory =
                Path.Combine(TestContext.Current.TestExecutionDirectory, Path.GetRandomFileName());

            var fakeSdkDirectory = Path.Combine(_fakeDotnetRootDirectory, "sdk", "5.0.102");

            Directory.CreateDirectory(fakeSdkDirectory);
            var fakeRuntimeIdentifierChainPath = Path.Combine(fakeSdkDirectory, "NETCoreSdkRuntimeIdentifierChain.txt");

            File.WriteAllLines(fakeRuntimeIdentifierChainPath,
                               new[] { "win-x64", "win", "any", "base" });

            _manifestDirectory = Path.Combine(_fakeDotnetRootDirectory, "sdk-manifests", "5.0.100");
            Directory.CreateDirectory(_manifestDirectory);
        }
コード例 #31
0
ファイル: Render.cs プロジェクト: rdingwall/Nustache
 public static void Template(TextReader reader, object data, TextWriter writer, TemplateLocator templateLocator)
 {
     var template = new Template();
     template.Load(reader);
     template.Render(data, writer, templateLocator);
 }
コード例 #32
0
 public static string StringToString(string template, object data, TemplateLocator templateLocator)
 {
     return(StringToString(template, data, templateLocator, null));
 }
コード例 #33
0
        /// <summary>
        /// Compiles the template into a Lambda function which can be executed later.
        /// This version allows reflective compilation of templates.
        /// </summary>
        /// <param name="compileFor">The type to compile the template for.Missing
        /// properties/methods/fields will result in CompilationExceptions.</param>
        /// <param name="templateLocator">The delegate to use to locate templates for inclusion.</param>
        /// <returns>A lambda expression representing the compiled template.  The lambda takes and object
        /// and immediately casts it to <paramref name="compileFor"/>.</returns>
        public static Func <object, string> Compile(this Template template, Type compileFor, TemplateLocator templateLocator)
        {
            var param = Expression.Parameter(typeof(object), "data");

            var context = new CompileContext(template, compileFor,
                                             Expression.Convert(param, compileFor), templateLocator);

            var expression = Compile(template, context);

            return((Expression.Lambda <Func <object, string> >(expression, param)).Compile());
        }
コード例 #34
0
 public static void StringToFile(
     string template, object data, string outputPath, TemplateLocator templateLocator)
 {
     StringToFile(template, data, outputPath, templateLocator, null);
 }
コード例 #35
0
ファイル: Template.cs プロジェクト: reicheltp/Nustache
 /// <summary>
 /// Renders the template.
 /// </summary>
 /// <param name="data">The data to use to render the template.</param>
 /// <param name="writer">The object to write the output to.</param>
 /// <param name="templateLocator">The delegate to use to locate templates for inclusion.</param>
 /// <remarks>
 /// The <paramref name="writer" /> is flushed, but not closed or disposed.
 /// </remarks>
 public void Render(object data, TextWriter writer, TemplateLocator templateLocator)
 {
     Render(data, writer, templateLocator, RenderContextBehaviour.GetDefaultRenderContextBehaviour());
 }
コード例 #36
0
        public static void Template(TextReader reader, object data, TextWriter writer, TemplateLocator templateLocator)
        {
            var template = new Template();

            template.Load(reader);
            template.Render(data, writer, templateLocator);
        }
コード例 #37
0
        private bool SyncOptionalWorkloads()
        {
            bool isHiveUpdated = false;
            bool isCustomHive  = _commandInput.HasDebuggingFlag("--debug:ephemeral-hive") || _commandInput.HasDebuggingFlag("--debug:custom-hive");

            if (!isCustomHive)
            {
                string sdkVersion = EnvironmentSettings.Host.Version.Substring(1); // Host.Version (from SDK) has a leading "v" that need to remove.

                try
                {
                    List <InstallationRequest>  owInstallationRequests   = new List <InstallationRequest>();
                    Dictionary <string, string> owInstalledPkgs          = new Dictionary <string, string>(); // packageId -> packageVersion
                    HashSet <string>            owSyncRequestsPackageIds = new HashSet <string>();
                    TemplateLocator             optionalWorkloadLocator  = new TemplateLocator();
                    string dotnetPath = Path.GetDirectoryName(Path.GetDirectoryName(_paths.Global.BaseDir));

                    IReadOnlyCollection <IOptionalSdkTemplatePackageInfo> owPkgsToSync = optionalWorkloadLocator.GetDotnetSdkTemplatePackages(sdkVersion, dotnetPath);

                    foreach (IInstallUnitDescriptor descriptor in _settingsLoader.InstallUnitDescriptorCache.Descriptors.Values)
                    {
                        if (descriptor.IsPartOfAnOptionalWorkload)
                        {
                            if (!descriptor.Details.TryGetValue("Version", out string pkgVersion))
                            {
                                pkgVersion = string.Empty;
                            }
                            owInstalledPkgs.Add(descriptor.Identifier, pkgVersion);
                        }
                    }

                    foreach (IOptionalSdkTemplatePackageInfo packageInfo in owPkgsToSync)
                    {
                        owSyncRequestsPackageIds.Add(packageInfo.TemplatePackageId);

                        if (!owInstalledPkgs.TryGetValue(packageInfo.TemplatePackageId, out string version) ||
                            version != packageInfo.TemplateVersion)
                        {
                            isHiveUpdated = true;
                            owInstallationRequests.Add(new InstallationRequest(packageInfo.Path, isPartOfAnOptionalWorkload: true));
                        }
                    }

                    if (owInstallationRequests.Count != 0)
                    {
                        Installer.InstallPackages(owInstallationRequests);
                    }

                    // remove uninstalled Optional SDK Workload packages
                    List <string> owRemovalRequestsPackageIds = new List <string>();
                    foreach (string descriptorIdentifier in owInstalledPkgs.Keys)
                    {
                        if (!owSyncRequestsPackageIds.Contains(descriptorIdentifier))
                        {
                            owRemovalRequestsPackageIds.Add(descriptorIdentifier);
                        }
                    }

                    if (owRemovalRequestsPackageIds.Count != 0)
                    {
                        isHiveUpdated = true;
                        IEnumerable <string> failures = Installer.Uninstall(owRemovalRequestsPackageIds);
                        foreach (string failure in failures)
                        {
                            Reporter.Output.WriteLine(string.Format(LocalizableStrings.CouldntUninstall, failure));
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw new HiveSynchronizationException(LocalizableStrings.OptionalWorkloadsSyncFailed, sdkVersion, ex);
                }
            }

            return(isHiveUpdated);
        }
コード例 #38
0
 /// <summary>
 /// Renders the template.
 /// </summary>
 /// <param name="data">The data to use to render the template.</param>
 /// <param name="writer">The object to write the output to.</param>
 /// <param name="templateLocator">The delegate to use to locate templates for inclusion.</param>
 /// <remarks>
 /// The <paramref name="writer" /> is flushed, but not closed or disposed.
 /// </remarks>
 public void Render(object data, TextWriter writer, TemplateLocator templateLocator)
 {
     Render(data, writer, templateLocator, RenderContextBehaviour.GetDefaultRenderContextBehaviour());
 }
コード例 #39
0
ファイル: Render.cs プロジェクト: Pxtl/Nustache.SqlClr
        public static void StringToFile(string template, object data, string outputPath, TemplateLocator templateLocator, RenderContextBehaviour renderContextBehaviour = null)
        {
            var reader = new StringReader(template);

            var renderBehaviour = renderContextBehaviour ??
                                  RenderContextBehaviour.GetDefaultRenderContextBehaviour();

            using (var writer = File.CreateText(outputPath))
            {
                Template(reader, data, writer, templateLocator, renderBehaviour);
            }
        }
コード例 #40
0
ファイル: Template.cs プロジェクト: brendanhay/Nustache
 public void Render(object data, TextWriter writer, TemplateLocator templateLocator,
     INamingConvention namingConvention)
 {
     Render(data, writer, templateLocator,
         new ValueProviderCollection(namingConvention));
 }
コード例 #41
0
ファイル: Template.cs プロジェクト: brendanhay/Nustache
 public void Render(object data, TextWriter writer, TemplateLocator templateLocator,
     NamingConvention namingConvention)
 {
     Render(data, writer, templateLocator,
         NamingConventionFactory.Create(namingConvention));
 }
コード例 #42
0
ファイル: Render.cs プロジェクト: Pxtl/Nustache.SqlClr
        public static void Template(TextReader reader, object data, TextWriter writer, TemplateLocator templateLocator, RenderContextBehaviour renderContextBehaviour = null)
        {
            var template = new Template();

            template.Load(reader);

            var renderBehaviour = renderContextBehaviour ??
                                  RenderContextBehaviour.GetDefaultRenderContextBehaviour();

            template.Render(data, writer, templateLocator, renderBehaviour);
        }
コード例 #43
0
ファイル: Template.cs プロジェクト: brendanhay/Nustache
 /// <summary>
 /// Renders the template.
 /// </summary>
 /// <param name="data">The data to use to render the template.</param>
 /// <param name="writer">The object to write the output to.</param>
 /// <param name="templateLocator">The delegate to use to locate templates for inclusion.</param>
 /// <remarks>
 /// The <paramref name="writer" /> is flushed, but not closed or disposed.
 /// </remarks>
 public void Render(object data, TextWriter writer, TemplateLocator templateLocator)
 {
     Render(data, writer, templateLocator, NamingConventionFactory.Default);
 }
コード例 #44
0
ファイル: RenderContext.cs プロジェクト: brendanhay/Nustache
 public RenderContext(Section section, object data, TextWriter writer, TemplateLocator templateLocator)
     : this(section, data, writer, templateLocator, new ValueProviderCollection())
 {
 }