public static void Iterate( BindingContext context, EncodedTextWriter writer, ChainSegment[] blockParamsVariables, object target, TemplateDelegate template, TemplateDelegate ifEmpty) { if (!HandlebarsUtils.IsTruthy(target)) { using var frame = context.CreateFrame(context.Value); ifEmpty(writer, frame); return; } if (!ObjectDescriptor.TryCreate(target, out var descriptor)) { throw new HandlebarsRuntimeException($"Cannot create ObjectDescriptor for type {descriptor.DescribedType}"); } if (descriptor.Iterator == null) { throw new HandlebarsRuntimeException($"Type {descriptor.DescribedType} does not support iteration"); } descriptor.Iterator.Iterate(writer, context, blockParamsVariables, target, template, ifEmpty); }
internal Closure(PathInfo pi0, PathInfo pi1, PathInfo pi2, PathInfo pi3, PathInfo[] pia, StrongBox <HelperDescriptorBase> hd0, StrongBox <HelperDescriptorBase> hd1, StrongBox <HelperDescriptorBase> hd2, StrongBox <HelperDescriptorBase> hd3, StrongBox <HelperDescriptorBase>[] hda, StrongBox <BlockHelperDescriptorBase> bhd0, StrongBox <BlockHelperDescriptorBase> bhd1, StrongBox <BlockHelperDescriptorBase> bhd2, StrongBox <BlockHelperDescriptorBase> bhd3, StrongBox <BlockHelperDescriptorBase>[] bhda, TemplateDelegate td0, TemplateDelegate td1, TemplateDelegate td2, TemplateDelegate td3, TemplateDelegate[] tda, ChainSegment[] bp0, ChainSegment[][] bpa, object[] a) { PI0 = pi0; PI1 = pi1; PI2 = pi2; PI3 = pi3; PIA = pia; HD0 = hd0; HD1 = hd1; HD2 = hd2; HD3 = hd3; HDA = hda; BHD0 = bhd0; BHD1 = bhd1; BHD2 = bhd2; BHD3 = bhd3; BHDA = bhda; TD0 = td0; TD1 = td1; TD2 = td2; TD3 = td3; TDA = tda; BP0 = bp0; BPA = bpa; A = a; }
public JsEngine(string name, List <string> extensions, List <string> requires, TemplateDelegate template, string source) { this.Name = name; this._extensions = extensions; this._requires = requires; this.Source = source; this.Template = template; }
private static void IterateObjectWithStaticProperties( BindingContext context, EncodedTextWriter writer, ChainSegment[] blockParamsVariables, ObjectDescriptor descriptor, object target, IList <ChainSegment> properties, Type targetType, TemplateDelegate template, TemplateDelegate ifEmpty) { using var innerContext = context.CreateFrame(); var iterator = new ObjectIteratorValues(innerContext); var blockParams = new BlockParamsValues(innerContext, blockParamsVariables); blockParams.CreateProperty(0, out var _0); blockParams.CreateProperty(1, out var _1); var count = properties.Count; var accessor = new MemberAccessor(target, descriptor); var iterationIndex = 0; var lastIndex = count - 1; object iteratorValue; ChainSegment iteratorKey; for (; iterationIndex < count; iterationIndex++) { iteratorKey = properties[iterationIndex]; iterator.Index = iterationIndex; iterator.Key = iteratorKey; if (iterationIndex == 1) { iterator.First = BoxedValues.False; } if (iterationIndex == lastIndex) { iterator.Last = BoxedValues.True; } iteratorValue = accessor[iteratorKey]; iterator.Value = iteratorValue; innerContext.Value = iteratorValue; blockParams[_0] = iteratorValue; blockParams[_1] = iteratorKey; template(writer, innerContext); } if (iterationIndex == 0) { innerContext.Value = context.Value; ifEmpty(writer, innerContext); } }
private static void IterateObject( BindingContext context, EncodedTextWriter writer, ObjectDescriptor descriptor, ChainSegment[] blockParamsVariables, object target, IEnumerable properties, Type targetType, TemplateDelegate template, TemplateDelegate ifEmpty) { using var innerContext = context.CreateFrame(); var iterator = new ObjectIteratorValues(innerContext); var blockParams = new BlockParamsValues(innerContext, blockParamsVariables); blockParams.CreateProperty(0, out var _0); blockParams.CreateProperty(1, out var _1); var accessor = new MemberAccessor(target, descriptor); var enumerable = new ExtendedEnumerator <object>(properties.GetEnumerator()); var enumerated = false; object iteratorValue; ChainSegment iteratorKey; while (enumerable.MoveNext()) { enumerated = true; var enumerableValue = enumerable.Current; iteratorKey = ChainSegment.Create(enumerableValue.Value); iterator.Key = iteratorKey; iterator.Index = enumerableValue.Index; if (enumerableValue.Index == 1) { iterator.First = BoxedValues.False; } if (enumerableValue.IsLast) { iterator.Last = BoxedValues.True; } iteratorValue = accessor[iteratorKey]; iterator.Value = iteratorValue; innerContext.Value = iteratorValue; blockParams[_0] = iteratorValue; blockParams[_1] = iteratorKey; template(writer, innerContext); } if (!enumerated) { innerContext.Value = context.Value; ifEmpty(writer, innerContext); } }
public static void PlainHelper( BindingContext context, EncodedTextWriter writer, object value, TemplateDelegate body, TemplateDelegate inverse ) { RenderSection(value, context, writer, body, inverse); }
private static void IterateEnumerable( BindingContext context, EncodedTextWriter writer, ChainSegment[] blockParamsVariables, IEnumerable target, TemplateDelegate template, TemplateDelegate ifEmpty) { using var innerContext = context.CreateFrame(); var iterator = new IteratorValues(innerContext); var blockParams = new BlockParamsValues(innerContext, blockParamsVariables); blockParams.CreateProperty(0, out var _0); blockParams.CreateProperty(1, out var _1); var enumerator = new ExtendedEnumerator <object>(target.GetEnumerator()); var enumerated = false; object boxedIndex; object iteratorValue; while (enumerator.MoveNext()) { enumerated = true; var enumerableValue = enumerator.Current; if (enumerableValue.Index == 1) { iterator.First = BoxedValues.False; } if (enumerableValue.IsLast) { iterator.Last = BoxedValues.True; } boxedIndex = enumerableValue.Index; iteratorValue = enumerableValue.Value; iterator.Value = iteratorValue; iterator.Index = boxedIndex; blockParams[_0] = iteratorValue; blockParams[_1] = boxedIndex; innerContext.Value = iteratorValue; template(writer, innerContext); } if (!enumerated) { innerContext.Value = context.Value; ifEmpty(writer, innerContext); } }
private static void IterateList( BindingContext context, EncodedTextWriter writer, ChainSegment[] blockParamsVariables, IList target, TemplateDelegate template, TemplateDelegate ifEmpty) { using var innerContext = context.CreateFrame(); var iterator = new IteratorValues(innerContext); var blockParams = new BlockParamsValues(innerContext, blockParamsVariables); blockParams.CreateProperty(0, out var _0); blockParams.CreateProperty(1, out var _1); var count = target.Count; object boxedIndex; object iteratorValue; var iterationIndex = 0; var lastIndex = count - 1; for (; iterationIndex < count; iterationIndex++) { iteratorValue = target[iterationIndex]; iterator.Value = iteratorValue; if (iterationIndex == 1) { iterator.First = BoxedValues.False; } if (iterationIndex == lastIndex) { iterator.Last = BoxedValues.True; } boxedIndex = iterationIndex; iterator.Index = boxedIndex; blockParams[_0] = iteratorValue; blockParams[_1] = boxedIndex; innerContext.Value = iteratorValue; template(writer, innerContext); } if (iterationIndex == 0) { innerContext.Value = context.Value; ifEmpty(writer, innerContext); } }
private static void TemplateDelegateInvoke() { TemplateDelegate <int, double, float> del1 = AddIntDoubleConvert; TemplateDelegate <float, double, int> del2 = AddFloatDoubleConvert; Console.WriteLine("Invoking del1(5, 3.9)"); float f = del1(5, 3.9); Console.WriteLine("Invokeing del2"); int i = del2((float)4.3, 2.1); }
internal BlockHelperOptions( PathInfo name, TemplateDelegate template, TemplateDelegate inverse, ChainSegment[] blockParamsValues, BindingContext frame ) { Name = name; OriginalTemplate = template; OriginalInverse = inverse; Frame = frame; BlockVariables = blockParamsValues; }
internal HelperOptions( TemplateDelegate template, TemplateDelegate inverse, ChainSegment[] blockParamsValues, BindingContext frame ) { _extensions = frame.Extensions; OriginalTemplate = template; OriginalInverse = inverse; Frame = frame; BlockParams = blockParamsValues; }
public static void Iterate( BindingContext context, EncodedTextWriter writer, ChainSegment[] blockParamsVariables, object target, TemplateDelegate template, TemplateDelegate ifEmpty) { if (!HandlebarsUtils.IsTruthy(target)) { using var frame = context.CreateFrame(context.Value); ifEmpty(writer, frame); return; } var targetType = target.GetType(); if (!context.Configuration.ObjectDescriptorProvider.TryGetDescriptor(targetType, out var descriptor)) { using var frame = context.CreateFrame(context.Value); ifEmpty(writer, frame); return; } if (!descriptor.ShouldEnumerate) { var properties = descriptor.GetProperties(descriptor, target); if (properties is IList <ChainSegment> propertiesList) { IterateObjectWithStaticProperties(context, writer, blockParamsVariables, descriptor, target, propertiesList, targetType, template, ifEmpty); return; } IterateObject(context, writer, descriptor, blockParamsVariables, target, properties, targetType, template, ifEmpty); return; } if (target is IList list) { IterateList(context, writer, blockParamsVariables, list, template, ifEmpty); return; } IterateEnumerable(context, writer, blockParamsVariables, (IEnumerable)target, template, ifEmpty); }
private static void RenderSection(object value, BindingContext context, EncodedTextWriter writer, TemplateDelegate body, TemplateDelegate inversion) { switch (value) { case bool boolValue when boolValue: body(writer, context); return; case null: case object _ when HandlebarsUtils.IsFalsyOrEmpty(value): inversion(writer, context); return; case string _: { using var frame = context.CreateFrame(value); body(writer, frame); return; } case IEnumerable enumerable: Iterator.Iterate(context, writer, BlockParamsVariables, enumerable, body, inversion); break; default: { using var frame = context.CreateFrame(value); body(writer, frame); break; } } }
internal BindingContext CreateChildContext(object value, TemplateDelegate partialBlockTemplate = null) { return(Create(Configuration, value, this, partialBlockTemplate ?? PartialBlockTemplate)); }
public BindingContext CreateContext(ICompiledHandlebarsConfiguration configuration, object value, BindingContext parent, TemplateDelegate partialBlockTemplate) { var context = Get(); context.Configuration = configuration; context.Value = value; context.ParentContext = parent; context.PartialBlockTemplate = partialBlockTemplate; context.Initialize(); return(context); }
internal static BindingContext Create(ICompiledHandlebarsConfiguration configuration, object value, BindingContext parent, TemplateDelegate partialBlockTemplate) { return(Pool.CreateContext(configuration, value, parent, partialBlockTemplate)); }