示例#1
0
    public override IEnumerable <ExpressionResult> RunInternal(ExpressionContext context)
    {
        if (context.GetFunction(Name) is not Expression expression)
        {
            yield break;
        }

        var captureName = CaptureName ?? new("!F");

        context.CaptureTree.Open(captureName);
        context.CaptureTree.Current !.IsFunctionBoundary = true;
        context.CallStack.Push(new(Name));
        foreach (var result in expression.Run(context))
        {
            var frame = context.CallStack.Pop();
            context.CaptureTree.Close(captureName, result);
            yield return(result);

            context.CaptureTree.Unclose(captureName);
            frame.Ratchet = false;
            context.CallStack.Push(frame);
        }
        context.CallStack.Pop();
        context.CaptureTree.Unopen(captureName);
    }
示例#2
0
        /*****************************************************************************/
        public object Evaluate(ExpressionContext context)
        {
            var func = context.ExtensionFunctions.GetFunction(_functionName, _parameters.Count());

            if (func != null)
            {
                return(func.Evaluate(_parameters, context));
            }

            var tfunc = context.GetFunction(_functionName);

            if (tfunc != null)
            {
                var output      = JObject.Parse("{}");
                var funcContext = new ExpressionContext(context.Data, context, context.Templates, context.Functions);
                var index       = 0;

                foreach (var argName in tfunc.Parameters)
                {
                    if (index >= _parameters.Count)
                    {
                        break;
                    }

                    funcContext.SetVariable(argName, _parameters[index++].Evaluate(context));
                }

                tfunc.Evaluate(output, funcContext);

                if (output["return"] != null)
                {
                    return(output["return"]);
                }

                return(output.ToString().JsonToExpando());
            }

            throw new Transformer.SyntaxException($"A function with that name and number of parameters was not found : {_functionName}");
        }