コード例 #1
0
 public override Expression GetAccumulatedBlock()
 {
     return(HandlebarsExpression.BlockHelper(
                _startingNode.HelperName,
                _startingNode.Arguments,
                Expression.Block(_body)));
 }
コード例 #2
0
        public override IEnumerable <object> ConvertTokens(IEnumerable <object> sequence)
        {
            var enumerator = sequence.GetEnumerator();

            while (enumerator.MoveNext())
            {
                var item = enumerator.Current;
                if (item is PartialToken)
                {
                    var partialName = GetNext(enumerator) as WordExpressionToken;
                    if (partialName == null)
                    {
                        throw new HandlebarsParserException("Partial indicator not followed by a parseable partial name");
                    }
                    var endExpression = GetNext(enumerator) as EndExpressionToken;
                    if (endExpression == null)
                    {
                        throw new HandlebarsParserException("Partial reference followed by unexpected token");
                    }
                    yield return(HandlebarsExpression.Partial(partialName.Value));

                    yield return(endExpression);
                }
                else
                {
                    yield return(item);
                }
            }
        }
コード例 #3
0
 protected override Expression VisitBlockHelperExpression(BlockHelperExpression bhex)
 {
     return(HandlebarsExpression.BlockHelper(
                bhex.HelperName,
                bhex.Arguments.Select(arg => Visit(arg)),
                Visit(bhex.Body)));
 }
コード例 #4
0
        public override IEnumerable <object> ConvertTokens(IEnumerable <object> sequence)
        {
            var enumerator = sequence.GetEnumerator();

            while (enumerator.MoveNext())
            {
                var item = enumerator.Current;
                if (item is StartExpressionToken)
                {
                    item = GetNext(enumerator);
                    if ((item is Expression) == false)
                    {
                        throw new HandlebarsCompilerException(
                                  string.Format("Token '{0}' could not be converted to an expression", item));
                    }
                    yield return(HandlebarsExpression.Statement((Expression)item));

                    item = GetNext(enumerator);
                    if ((item is EndExpressionToken) == false)
                    {
                        throw new HandlebarsCompilerException("Handlebars statement was not reduced to a single expression");
                    }
                }
                else
                {
                    yield return(item);
                }
            }
        }
コード例 #5
0
        public override IEnumerable <object> ConvertTokens(IEnumerable <object> sequence)
        {
            var enumerator = sequence.GetEnumerator();

            while (enumerator.MoveNext())
            {
                var item = enumerator.Current;
                if (item is HelperExpression)
                {
                    var helper = item as HelperExpression;
                    item = GetNext(enumerator);
                    List <Expression> helperArguments = new List <Expression>();
                    while ((item is EndExpressionToken) == false)
                    {
                        if ((item is Expression) == false)
                        {
                            throw new HandlebarsCompilerException(
                                      string.Format("Token '{0}' could not be converted to an expression", item));
                        }
                        helperArguments.Add((Expression)item);
                        item = GetNext(enumerator);
                    }
                    yield return(HandlebarsExpression.Helper(
                                     helper.HelperName,
                                     helperArguments));

                    yield return(item);
                }
                else
                {
                    yield return(item);
                }
            }
        }
コード例 #6
0
 public override void HandleElement(Expression item)
 {
     if (IsElseBlock(item))
     {
         _accumulatedExpression = HandlebarsExpression.Iterator(
             _startingNode.Arguments.Single(),
             Expression.Block(_body));
         _body = new List <Expression>();
     }
     else
     {
         _body.Add((Expression)item);
     }
 }
コード例 #7
0
 public override IEnumerable <object> ConvertTokens(IEnumerable <object> sequence)
 {
     foreach (var item in sequence)
     {
         if (item is WordExpressionToken)
         {
             yield return(HandlebarsExpression.Path(((WordExpressionToken)item).Value));
         }
         else
         {
             yield return(item);
         }
     }
 }
コード例 #8
0
 public override bool IsClosingElement(Expression item)
 {
     if (IsClosingNode(item))
     {
         var evalMode = _startingNode.Path.StartsWith("#")
             ? SectionEvaluationMode.NonEmpty : SectionEvaluationMode.Empty;
         _accumulatedExpression = HandlebarsExpression.DeferredSection(
             _startingNode,
             _body,
             evalMode);
         return(true);
     }
     else
     {
         return(false);
     }
 }
        private static Expression CreateIfBlock(HelperExpression startingNode, IEnumerable <Expression> body)
        {
            var condition = HandlebarsExpression.Boolish(startingNode.Arguments.Single());

            if (startingNode.HelperName == "#if")
            {
                return(Expression.IfThen(condition, Expression.Block(body)));
            }
            else if (startingNode.HelperName == "#unless")
            {
                return(Expression.IfThen(Expression.Not(condition), Expression.Block(body)));
            }
            else
            {
                throw new HandlebarsCompilerException(string.Format(
                                                          "Tried to create a conditional expression for '{0}'", startingNode.HelperName));
            }
        }
コード例 #10
0
 public override IEnumerable <object> ConvertTokens(IEnumerable <object> sequence)
 {
     foreach (var item in sequence)
     {
         if (item is StaticToken)
         {
             if (((StaticToken)item).Value != string.Empty)
             {
                 yield return(HandlebarsExpression.Static(((StaticToken)item).Value));
             }
             else
             {
                 continue;
             }
         }
         else
         {
             yield return(item);
         }
     }
 }
コード例 #11
0
        protected override Expression VisitDeferredSectionExpression(DeferredSectionExpression dsex)
        {
            Action <object, BindingContext, Action <TextWriter, object> > method;

            if (dsex.Path.Path.StartsWith("#"))
            {
                method = RenderSection;
            }
            else if (dsex.Path.Path.StartsWith("^"))
            {
                method = RenderEmptySection;
            }
            else
            {
                throw new HandlebarsCompilerException("Tried to compile a section expression that did not begin with # or ^");
            }
            return(Expression.Call(
                       method.Method,
                       HandlebarsExpression.Path(dsex.Path.Path.Substring(1)),
                       _context.BindingContext,
                       new FunctionBuilder(_context.Configuration).Compile(dsex.Body, _context.BindingContext)));
        }
コード例 #12
0
        public override IEnumerable <object> ConvertTokens(IEnumerable <object> sequence)
        {
            var enumerator = sequence.GetEnumerator();

            while (enumerator.MoveNext())
            {
                var item = enumerator.Current;
                if (item is StartExpressionToken)
                {
                    yield return(item);

                    item = GetNext(enumerator);
                    if (item is Expression)
                    {
                        yield return(item);

                        continue;
                    }
                    if ((item is WordExpressionToken) == false)
                    {
                        throw new HandlebarsCompilerException("Encountered a non-word symbol at the beginning of the handlebars expression.");
                    }
                    var word = item as WordExpressionToken;
                    if (IsRegisteredHelperName(word.Value))
                    {
                        yield return(HandlebarsExpression.Helper(word.Value));
                    }
                    else
                    {
                        yield return(word);
                    }
                }
                else
                {
                    yield return(item);
                }
            }
        }
コード例 #13
0
 public override bool IsClosingElement(Expression item)
 {
     if (IsClosingNode(item))
     {
         if (_accumulatedExpression == null)
         {
             _accumulatedExpression = HandlebarsExpression.Iterator(
                 _startingNode.Arguments.Single(),
                 Expression.Block(_body));
         }
         else
         {
             _accumulatedExpression = HandlebarsExpression.Iterator(
                 ((IteratorExpression)_accumulatedExpression).Sequence,
                 ((IteratorExpression)_accumulatedExpression).Template,
                 Expression.Block(_body));
         }
         return(true);
     }
     else
     {
         return(false);
     }
 }
コード例 #14
0
 protected override Expression VisitHelperExpression(HelperExpression hex)
 {
     return(HandlebarsExpression.Helper(
                hex.HelperName,
                hex.Arguments.Select(arg => Visit(arg))));
 }