Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
 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;
 }
Ejemplo n.º 3
0
 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;
 }
Ejemplo n.º 4
0
        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);
            }
        }
Ejemplo n.º 5
0
        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);
 }
Ejemplo n.º 7
0
        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);
            }
        }
Ejemplo n.º 8
0
        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);
            }
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
 internal BlockHelperOptions(
     PathInfo name,
     TemplateDelegate template,
     TemplateDelegate inverse,
     ChainSegment[] blockParamsValues,
     BindingContext frame
     )
 {
     Name             = name;
     OriginalTemplate = template;
     OriginalInverse  = inverse;
     Frame            = frame;
     BlockVariables   = blockParamsValues;
 }
Ejemplo n.º 11
0
        internal HelperOptions(
            TemplateDelegate template,
            TemplateDelegate inverse,
            ChainSegment[] blockParamsValues,
            BindingContext frame
            )
        {
            _extensions = frame.Extensions;

            OriginalTemplate = template;
            OriginalInverse  = inverse;
            Frame            = frame;
            BlockParams      = blockParamsValues;
        }
Ejemplo n.º 12
0
        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;
            }
            }
        }
Ejemplo n.º 14
0
 internal BindingContext CreateChildContext(object value, TemplateDelegate partialBlockTemplate = null)
 {
     return(Create(Configuration, value, this, partialBlockTemplate ?? PartialBlockTemplate));
 }
Ejemplo n.º 15
0
            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);
            }
Ejemplo n.º 16
0
 internal static BindingContext Create(ICompiledHandlebarsConfiguration configuration, object value, BindingContext parent,
                                       TemplateDelegate partialBlockTemplate)
 {
     return(Pool.CreateContext(configuration, value, parent, partialBlockTemplate));
 }