示例#1
0
 public static void AssertSyntaxTreeIsEmpty(this HandlebarsParserState state, string errorMessage)
 {
     if (state.BlockStack.Count > 1 || !state.BlockStack.GetCurrentBlockNode().IsEmpty())
     {
         throw new VeilParserException(errorMessage, state.CurrentLocation);
     }
 }
示例#2
0
        private static void HandleIterationElse(HandlebarsParserState state)
        {
            var elseBlock = state.BlockStack.GetCurrentBlockContainer <IterateNode>().EmptyBody;

            state.BlockStack.PopBlock();
            state.BlockStack.PushModelInheritingBlock(elseBlock);
        }
示例#3
0
 public static void AssertStackOnRootNode(this HandlebarsParserState state)
 {
     if (state.BlockStack.Count != 1)
     {
         throw new VeilParserException(String.Format("Mismatched block found. Expected to find the end of the template but found '{0}' open blocks.", state.BlockStack.Count - 1), state.CurrentLocation);
     }
 }
示例#4
0
        private static void HandlePartial(HandlebarsParserState state)
        {
            var partialTemplateName = state.CurrentToken.Content.Substring(1).Trim();
            var self = SyntaxTreeExpression.Self(state.BlockStack.GetCurrentModelType());

            state.AddNodeToCurrentBlock(SyntaxTree.Include(partialTemplateName, self));
        }
示例#5
0
        public SyntaxTreeNode Parse(TextReader templateReader, Type modelType)
        {
            var state = new HandlebarsParserState();
            var tokens = HandlebarsTokenizer.Tokenize(templateReader);
            state.BlockStack.PushNewBlockWithModel(modelType);

            foreach (var token in tokens)
            {
                state.SetCurrentToken(token);

                foreach (var handler in SyntaxHandlers)
                {
                    if (handler.Key(token))
                    {
                        handler.Value.Invoke(state);
                        if (state.ContinueProcessingToken)
                        {
                            state.ContinueProcessingToken = false;
                            continue;
                        }
                        break;
                    }
                }
            }

            state.AssertStackOnRootNode();

            return state.RootNode;
        }
        public static ExpressionNode Parse(HandlebarsParserState state, HandlebarsBlockStack blockStack, SourceLocation location, string expression, IMemberLocator memberLocator = null)
        {
            int recursionLevel = 0;

	        memberLocator = memberLocator ?? MemberLocator.Default;

            expression = expression.Trim();

            if (expression == "this")
            {
                return SyntaxTreeExpression.Self(blockStack.GetCurrentModelType(), location);
            }
            if (expression.StartsWith("../"))
            {
                var blockNode = blockStack.FirstNode();
                while (expression.StartsWith("../"))
                {
                    var parentBlockNode = blockStack.GetParentNode(blockNode);
                    if (parentBlockNode != null)
                    {
                        blockNode = parentBlockNode;
                        expression = expression.Substring(3);
                        location = location.MoveIndex(3);
                    }
                    recursionLevel++;
                }
                return ParseAgainstModel(blockStack.GetCurrentModelType(blockNode), expression, ExpressionScope.ModelOfParentScope, recursionLevel, memberLocator, location);
            }

            return ParseAgainstModel(blockStack.GetCurrentModelType(), expression, ExpressionScope.CurrentModelOnStack, recursionLevel, memberLocator, location);
        }
示例#7
0
        public SyntaxTreeNode Parse(TextReader templateReader, Type modelType)
        {
            var state  = new HandlebarsParserState();
            var tokens = HandlebarsTokenizer.Tokenize(templateReader);

            state.BlockStack.PushNewBlockWithModel(modelType);

            foreach (var token in tokens)
            {
                state.SetCurrentToken(token);

                foreach (var handler in SyntaxHandlers)
                {
                    if (handler.Key(token))
                    {
                        handler.Value.Invoke(state);
                        if (state.ContinueProcessingToken)
                        {
                            state.ContinueProcessingToken = false;
                            continue;
                        }
                        break;
                    }
                }
            }

            state.AssertStackOnRootNode();

            return(state.RootNode);
        }
示例#8
0
 private static void HandleConditionalElse(HandlebarsParserState state)
 {
     var block = SyntaxTree.Block();
     state.BlockStack.GetCurrentBlockContainer<ConditionalNode>().FalseBlock = block;
     state.BlockStack.PopBlock();
     state.BlockStack.PushModelInheritingBlock(block);
 }
示例#9
0
        public static ExpressionNode Parse(HandlebarsParserState state, HandlebarsBlockStack blockStack, SourceLocation location, string expression, IMemberLocator memberLocator = null)
        {
            int recursionLevel = 0;

            memberLocator = memberLocator ?? MemberLocator.Default;

            expression = expression.Trim();

            if (expression == "this")
            {
                return(SyntaxTreeExpression.Self(blockStack.GetCurrentModelType(), location));
            }
            if (expression.StartsWith("../"))
            {
                var blockNode = blockStack.FirstNode();
                while (expression.StartsWith("../"))
                {
                    var parentBlockNode = blockStack.GetParentNode(blockNode);
                    if (parentBlockNode != null)
                    {
                        blockNode  = parentBlockNode;
                        expression = expression.Substring(3);
                        location   = location.MoveIndex(3);
                    }
                    recursionLevel++;
                }
                return(ParseAgainstModel(blockStack.GetCurrentModelType(blockNode), expression, ExpressionScope.ModelOfParentScope, recursionLevel, memberLocator, location));
            }

            return(ParseAgainstModel(blockStack.GetCurrentModelType(), expression, ExpressionScope.CurrentModelOnStack, recursionLevel, memberLocator, location));
        }
示例#10
0
		public SyntaxTreeNode Parse(string templateId, TextReader templateReader, Type modelType, IMemberLocator memberLocator, IHelperHandler[] helperHandlers)
        {
            if (memberLocator == null)
                memberLocator = MemberLocator.Default;

            var state = new HandlebarsParserState(templateId, memberLocator);
            var tokens = HandlebarsTokenizer.Tokenize(templateReader);
            state.BlockStack.PushNewBlockWithModel(modelType, new SourceLocation(templateId, 0, 0));

            var helpers = SyntaxHandlers.Union(GetHelperHandlers(helperHandlers ?? Enumerable.Empty<IHelperHandler>())).Union(SyntaxHandlersAfter).ToList();

            foreach (var token in tokens)
            {
                state.SetCurrentToken(token);

                foreach (var handler in helpers)
                {
                    if (handler.Key(token))
                    {
                        handler.Value.Invoke(state);
                        if (state.ContinueProcessingToken)
                        {
                            state.ContinueProcessingToken = false;
                            continue;
                        }
                        break;
                    }
                }
            }

            state.AssertStackOnRootNode();

            return state.RootNode;
        }
示例#11
0
        private static void HandleConditionalElse(HandlebarsParserState state)
        {
            var block = SyntaxTree.Block();

            state.BlockStack.GetCurrentBlockContainer <ConditionalNode>().FalseBlock = block;
            state.BlockStack.PopBlock();
            state.BlockStack.PushModelInheritingBlock(block);
        }
示例#12
0
        private static void HandleUnless(HandlebarsParserState state)
        {
            var block       = SyntaxTree.Block(state.CurrentLocation);
            var conditional = SyntaxTree.Conditional(state.ParseExpression(state.CurrentToken.Content.Substring(8), state.CurrentLocation.MoveIndex(8)), state.CurrentLocation, SyntaxTree.Block(state.CurrentLocation), block);

            state.AddNodeToCurrentBlock(conditional);
            state.BlockStack.PushModelInheritingBlock(block);
        }
示例#13
0
        private static void HandleHelperStart(HandlebarsParserState state, IBlockHelperHandler helper)
        {
            var block       = SyntaxTree.Block(state.CurrentLocation);
            var helperBlock = SyntaxTree.Helper(SyntaxTreeExpression.Helper(state.CurrentToken.Content.Substring(1), helper, state.CurrentLocation), block, state.CurrentLocation);

            state.AddNodeToCurrentBlock(helperBlock);
            state.BlockStack.PushModelInheritingBlock(block);
        }
示例#14
0
        private static void HandleIf(HandlebarsParserState state)
        {
            var block       = SyntaxTree.Block();
            var conditional = SyntaxTree.Conditional(state.ParseExpression(state.CurrentToken.Content.Substring(4)), block);

            state.AddNodeToCurrentBlock(conditional);
            state.BlockStack.PushModelInheritingBlock(block);
        }
示例#15
0
        public static bool IsInEachBlock(this HandlebarsParserState state)
        {
            if (state.BlockStack.Count < 2)
            {
                return(false);
            }

            return(state.BlockStack.IsCurrentBlockContainerOfType <IterateNode>());
        }
示例#16
0
        private static void HandleMaster(HandlebarsParserState state)
        {
            state.AssertSyntaxTreeIsEmpty("There can be no content before a {{< }} expression.");
            var masterTemplateName = state.CurrentToken.Content.Substring(1).Trim();

            state.ExtendNode = SyntaxTree.Extend(masterTemplateName, new Dictionary <string, SyntaxTreeNode>
            {
                { OverrideSectionName, state.BlockStack.GetCurrentBlockNode() }
            });
        }
示例#17
0
        private static void HandleTrimLastLiteral(HandlebarsParserState state)
        {
            var literal = state.LastNode() as WriteLiteralNode;

            if (literal != null)
            {
                literal.LiteralContent = literal.LiteralContent.TrimEnd();
            }
            state.ContinueProcessingToken = true;
        }
示例#18
0
        public static void AssertInsideWith(this HandlebarsParserState state, string foundToken)
        {
            var faulted = state.BlockStack.Count < 2;

            faulted = faulted || !state.BlockStack.IsCurrentBlockContainerOfType <ScopedNode>();

            if (faulted)
            {
                throw new VeilParserException(String.Format("Found token '{0}' outside of a with block.", foundToken), state.CurrentLocation);
            }
        }
示例#19
0
        public static void AssertInsideConditionalOrIteration(this HandlebarsParserState state, string foundToken)
        {
            var faulted = state.BlockStack.Count < 2;

            faulted = faulted || !(state.BlockStack.IsCurrentBlockContainerOfType <ConditionalNode>() || state.BlockStack.IsCurrentBlockContainerOfType <IterateNode>());

            if (faulted)
            {
                throw new VeilParserException(String.Format("Found token '{0}' outside of a conditional or iteration block.", foundToken), state.CurrentLocation);
            }
        }
示例#20
0
        private static void HandleEach(HandlebarsParserState state)
        {
            var iteration = SyntaxTree.Iterate(
                state.ParseExpression(state.CurrentToken.Content.Substring(6)),
                SyntaxTree.Block()
                );

            state.AddNodeToCurrentBlock(iteration);
            state.BlockStack.PushBlock(new HandlebarsParserBlock {
                Block = iteration.Body, ModelInScope = iteration.ItemType
            });
        }
示例#21
0
        private static void HandleWith(HandlebarsParserState state)
        {
            var withBlock       = SyntaxTree.Block();
            var modelExpression = state.ParseExpression(state.CurrentToken.Content.Substring(6).Trim());

            state.AddNodeToCurrentBlock(SyntaxTree.ScopeNode(modelExpression, withBlock));
            state.BlockStack.PushBlock(new HandlebarsParserBlock
            {
                Block        = withBlock,
                ModelInScope = modelExpression.ResultType
            });
        }
示例#22
0
 private static void HandleElse(HandlebarsParserState state)
 {
     state.AssertInsideConditionalOrIteration("{{else}}");
     if (state.IsInEachBlock())
     {
         HandleIterationElse(state);
     }
     else
     {
         HandleConditionalElse(state);
     }
 }
        public static ExpressionNode Parse(HandlebarsParserState state, HandlebarsBlockStack blockStack, SourceLocation location, string expression, IMemberLocator memberLocator = null)
        {
	        memberLocator = memberLocator ?? MemberLocator.Default;

            expression = expression.Trim();

            if (expression == "this")
            {
                return SyntaxTreeExpression.Self(blockStack.GetCurrentModelType(), location, ExpressionScope.CurrentModelOnStack);
            }
            if (expression.StartsWith("../"))
            {
                return ParseAgainstModel(blockStack.GetParentModelType(), expression.Substring(3), ExpressionScope.ModelOfParentScope, memberLocator, location.MoveIndex(3));
            }

            return ParseAgainstModel(blockStack.GetCurrentModelType(), expression, ExpressionScope.CurrentModelOnStack, memberLocator, location);
        }
示例#24
0
        public SyntaxTreeNode Parse(string templateId, TextReader templateReader, Type modelType, IMemberLocator memberLocator, IHelperHandler[] helperHandlers)
        {
            if (memberLocator == null)
            {
                memberLocator = MemberLocator.Default;
            }

            var state  = new HandlebarsParserState(templateId, memberLocator);
            var tokens = HandlebarsTokenizer.Tokenize(templateReader);

            state.BlockStack.PushNewBlockWithModel(modelType, new SourceLocation(templateId, 0, 0));

            var helpers = SyntaxHandlers.Union(GetHelperHandlers(helperHandlers ?? Enumerable.Empty <IHelperHandler>())).Union(SyntaxHandlersAfter).ToList();

            foreach (var token in tokens)
            {
                state.SetCurrentToken(token);

                foreach (var handler in helpers)
                {
                    if (handler.Key(token))
                    {
                        handler.Value.Invoke(state);
                        if (state.ContinueProcessingToken)
                        {
                            state.ContinueProcessingToken = false;
                            continue;
                        }
                        break;
                    }
                }
            }

            state.AssertStackOnRootNode();

            return(state.RootNode);
        }
示例#25
0
	    private static void HandleStringLiteral(HandlebarsParserState state)
        {
            state.WriteLiteral(state.CurrentToken.Content, state.CurrentLocation);
        }
示例#26
0
 private static void HandleFlush(HandlebarsParserState state)
 {
     state.AddNodeToCurrentBlock(SyntaxTree.Flush());
 }
示例#27
0
 private static void HandleEndWith(HandlebarsParserState state)
 {
     state.AssertInsideWith("{{/with}}");
     state.BlockStack.PopBlock();
 }
示例#28
0
 private static void HandleFlush(HandlebarsParserState state)
 {
     state.AddNodeToCurrentBlock(SyntaxTree.Flush(state.CurrentLocation));
 }
示例#29
0
        private static void HandleEach(HandlebarsParserState state)
        {
            var iteration = SyntaxTree.Iterate(
                state.ParseExpression(state.CurrentToken.Content.Substring(6), state.CurrentLocation.MoveIndex(6)),
				state.CurrentLocation,
                SyntaxTree.Block(state.CurrentLocation)
            );
            state.AddNodeToCurrentBlock(iteration);
            state.BlockStack.PushBlock(new HandlebarsParserBlock { Block = iteration.Body, ModelInScope = iteration.ItemType });
        }
示例#30
0
 private static void HandleUnless(HandlebarsParserState state)
 {
     var block = SyntaxTree.Block(state.CurrentLocation);
     var conditional = SyntaxTree.Conditional(state.ParseExpression(state.CurrentToken.Content.Substring(8), state.CurrentLocation.MoveIndex(8)), state.CurrentLocation, SyntaxTree.Block(state.CurrentLocation), block);
     state.AddNodeToCurrentBlock(conditional);
     state.BlockStack.PushModelInheritingBlock(block);
 }
示例#31
0
 private static void HandleElse(HandlebarsParserState state)
 {
     state.AssertInsideConditionalOrIteration("{{else}}");
     if (state.IsInEachBlock())
     {
         HandleIterationElse(state);
     }
     else
     {
         HandleConditionalElse(state);
     }
 }
示例#32
0
 private static void HandleEndEach(HandlebarsParserState state)
 {
     state.AssertInsideIteration("{{/each}}");
     state.BlockStack.PopBlock();
 }
示例#33
0
 private static void HandleStringLiteral(HandlebarsParserState state)
 {
     state.WriteLiteral(state.CurrentToken.Content);
 }
示例#34
0
        private static void HandleHelper(HandlebarsParserState state, IHelperHandler helper)
        {
            string expression = state.CurrentToken.Content;

            state.AddNodeToCurrentBlock(SyntaxTreeExpression.Helper(expression, helper, state.CurrentLocation));
        }
示例#35
0
 private static void HandleExpression(HandlebarsParserState state)
 {
     var expression = state.ParseExpression(state.CurrentToken.Content, state.CurrentLocation);
     state.AddNodeToCurrentBlock(SyntaxTree.WriteExpression(expression, state.CurrentLocation, state.CurrentToken.IsHtmlEscape));
 }
示例#36
0
 private static void HandleMaster(HandlebarsParserState state)
 {
     state.AssertSyntaxTreeIsEmpty("There can be no content before a {{< }} expression.");
     var masterTemplateName = state.CurrentToken.Content.Substring(1).Trim();
     state.ExtendNode = SyntaxTree.Extend(masterTemplateName, state.CurrentLocation, new Dictionary<string, SyntaxTreeNode>
     {
         { OverrideSectionName, state.BlockStack.GetCurrentBlockNode() }
     });
 }
示例#37
0
 private static void HandleTrimLastLiteral(HandlebarsParserState state)
 {
     var literal = state.LastNode() as WriteLiteralNode;
     if (literal != null)
     {
         literal.LiteralContent = literal.LiteralContent.TrimEnd();
     }
     state.ContinueProcessingToken = true;
 }
示例#38
0
 private static void HandleTrimNextLiteral(HandlebarsParserState state)
 {
     state.TrimNextLiteral         = true;
     state.ContinueProcessingToken = true;
 }
示例#39
0
 private static void HandleTrimNextLiteral(HandlebarsParserState state)
 {
     state.TrimNextLiteral = true;
     state.ContinueProcessingToken = true;
 }
示例#40
0
 private static void HandleHelperEnd(HandlebarsParserState state, IBlockHelperHandler helper)
 {
     // TODO: Stack validation
     state.BlockStack.PopBlock();
 }
示例#41
0
 private static void HandleIterationElse(HandlebarsParserState state)
 {
     var elseBlock = state.BlockStack.GetCurrentBlockContainer<IterateNode>().EmptyBody;
     state.BlockStack.PopBlock();
     state.BlockStack.PushModelInheritingBlock(elseBlock);
 }
示例#42
0
 private static void HandleEndUnless(HandlebarsParserState state)
 {
     state.AssertInsideConditional("{{/unless}}");
     state.BlockStack.PopBlock();
 }
示例#43
0
 private static void HandleEndUnless(HandlebarsParserState state)
 {
     state.AssertInsideConditional("{{/unless}}");
     state.BlockStack.PopBlock();
 }
示例#44
0
		private static void HandleHelperEnd(HandlebarsParserState state, IBlockHelperHandler helper)
	    {
			// TODO: Stack validation
			state.BlockStack.PopBlock();
	    }
示例#45
0
 private static void HandleEndEach(HandlebarsParserState state)
 {
     state.AssertInsideIteration("{{/each}}");
     state.BlockStack.PopBlock();
 }
示例#46
0
	    private static void HandleHelperStart(HandlebarsParserState state, IBlockHelperHandler helper)
	    {
			var block = SyntaxTree.Block(state.CurrentLocation);
			var helperBlock = SyntaxTree.Helper(SyntaxTreeExpression.Helper(state.CurrentToken.Content.Substring(1), helper, state.CurrentLocation), block, state.CurrentLocation);
			state.AddNodeToCurrentBlock(helperBlock);
			state.BlockStack.PushModelInheritingBlock(block);
	    }
示例#47
0
 private static void HandleWith(HandlebarsParserState state)
 {
     var withBlock = SyntaxTree.Block(state.CurrentLocation);
     var modelExpression = state.ParseExpression(state.CurrentToken.Content.Substring(6), state.CurrentLocation.MoveIndex(6));
     state.AddNodeToCurrentBlock(SyntaxTree.ScopeNode(modelExpression, withBlock, state.CurrentLocation));
     state.BlockStack.PushBlock(new HandlebarsParserBlock
     {
         Block = withBlock,
         ModelInScope = modelExpression.ResultType
     });
 }
示例#48
0
	    private static void HandleHelper(HandlebarsParserState state, IHelperHandler helper)
	    {
		    string expression = state.CurrentToken.Content;
			state.AddNodeToCurrentBlock(SyntaxTreeExpression.Helper(expression, helper, state.CurrentLocation));
	    }
示例#49
0
 private static void HandlePartial(HandlebarsParserState state)
 {
     var partialTemplateName = state.CurrentToken.Content.Substring(1).Trim();
     var self = SyntaxTreeExpression.Self(state.BlockStack.GetCurrentModelType(), state.CurrentLocation);
     state.AddNodeToCurrentBlock(SyntaxTree.Include(partialTemplateName, self, state.CurrentLocation));
 }
示例#50
0
 private static void HandleEndWith(HandlebarsParserState state)
 {
     state.AssertInsideWith("{{/with}}");
     state.BlockStack.PopBlock();
 }
示例#51
0
 private static void HandleBody(HandlebarsParserState state)
 {
     state.AddNodeToCurrentBlock(SyntaxTree.Override(OverrideSectionName, state.CurrentLocation));
 }
示例#52
0
 private static void HandleBody(HandlebarsParserState state)
 {
     state.AddNodeToCurrentBlock(SyntaxTree.Override(OverrideSectionName));
 }
示例#53
0
        private static void HandleExpression(HandlebarsParserState state)
        {
            var expression = state.ParseExpression(state.CurrentToken.Content);

            state.AddNodeToCurrentBlock(SyntaxTree.WriteExpression(expression, state.CurrentToken.IsHtmlEscape));
        }
示例#54
0
 private static void HandleIf(HandlebarsParserState state)
 {
     var block = SyntaxTree.Block();
     var conditional = SyntaxTree.Conditional(state.ParseExpression(state.CurrentToken.Content.Substring(4)), block);
     state.AddNodeToCurrentBlock(conditional);
     state.BlockStack.PushModelInheritingBlock(block);
 }