Exemplo n.º 1
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;
        }
        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);
        }
		private static ExpressionNode ParseAgainstModel(Type modelType, string expression, ExpressionScope expressionScope, IMemberLocator memberLocator, SourceLocation location)
        {
            var dotIndex = expression.IndexOf('.');
            if (dotIndex >= 0)
            {
				var subModel = ParseAgainstModel(modelType, expression.Substring(0, dotIndex), expressionScope, memberLocator, location.SetLength(dotIndex));
                return SyntaxTreeExpression.SubModel(
                    subModel,
                    ParseAgainstModel(subModel.ResultType, expression.Substring(dotIndex + 1), ExpressionScope.CurrentModelOnStack, memberLocator, location.MoveIndex(dotIndex + 1)),
					location
                );
            }

            if (expression.EndsWith("()"))
            {
                var func = memberLocator.FindMethod(modelType, expression.Substring(0, expression.Length - 2));
                if (func != null) return SyntaxTreeExpression.Function(modelType, func.Name, location, expressionScope);
            }

            var prop = memberLocator.FindProperty(modelType, expression);
		    if (prop != null)
		        return SyntaxTreeExpression.Property(modelType, prop.Name, location, expressionScope);

            var field = memberLocator.FindField(modelType, expression);
		    if (field != null)
		        return SyntaxTreeExpression.Field(modelType, field.Name, location, expressionScope);

            if (IsLateBoundAcceptingType(modelType)) 
				return SyntaxTreeExpression.LateBound(expression, location, memberLocator, false, expressionScope);

            throw new VeilParserException(
                $"Unable to parse model expression '{expression}' againt model '{modelType.Name}'", location);
        }
		private static ExpressionNode ParseAgainstModel(Type modelType, string expression, ExpressionScope expressionScope, int recursionLevel, IMemberLocator memberLocator, SourceLocation location)
        {
            var dotIndex = expression.IndexOf('.');
            if (dotIndex >= 0)
            {
				var subModel = ParseAgainstModel(modelType, expression.Substring(0, dotIndex), expressionScope, recursionLevel, memberLocator, location.SetLength(dotIndex));
                return SyntaxTreeExpression.SubModel(
                    subModel,
                    ParseAgainstModel(subModel.ResultType, expression.Substring(dotIndex + 1), ExpressionScope.CurrentModelOnStack, 0, memberLocator, location.MoveIndex(dotIndex + 1)),
					location
                );
            }

            if (expression.EndsWith("()"))
            {
                var func = memberLocator.FindMember(modelType, expression.Substring(0, expression.Length - 2), MemberTypes.Method);
                if (func != null) return SyntaxTreeExpression.Function(modelType, func.Name, location, expressionScope);
            }

            var prop = memberLocator.FindMember(modelType, expression, MemberTypes.Property | MemberTypes.Field);
            if (prop != null)
            {
                switch (prop.MemberType)
                {
                    case MemberTypes.Property: return SyntaxTreeExpression.Property(modelType, prop.Name, location, expressionScope, recursionLevel);
                    case MemberTypes.Field: return SyntaxTreeExpression.Field(modelType, prop.Name, location, expressionScope, recursionLevel);
                }
            }

            if (IsLateBoundAcceptingType(modelType))
                return SyntaxTreeExpression.LateBound(expression, location, memberLocator, false, expressionScope, recursionLevel);

            throw new VeilParserException(String.Format("Unable to parse model expression '{0}' againt model '{1}'", expression, modelType.Name), location);
        }
Exemplo n.º 5
0
        public static Func<object, object> GetBinder(object model, string itemName, IMemberLocator memberLocator)
        {
            var binder = LateBoundCache.GetOrAdd(Tuple.Create(model.GetType(), itemName), pair =>
            {
                var type = pair.Item1;
                var name = pair.Item2;

                if (name.EndsWith("()"))
                {
                    var function =
                        memberLocator.FindMethod(type, name.Substring(0, name.Length - 2));
                    if (function != null) return DelegateBuilder.FunctionCall(type, function);
                }

                var property = memberLocator.FindProperty(type, name);
                if (property != null) return DelegateBuilder.Property(type, property);

                var field = memberLocator.FindField(type, name);
                if (field != null) return DelegateBuilder.Field(type, field);

                var dictionaryType = type.GetDictionaryTypeWithKey();
                if (dictionaryType != null) return DelegateBuilder.Dictionary(dictionaryType, name);

                return null;
            });
            return binder;
        }
Exemplo n.º 6
0
 public VeilViewEngine(ICacheProvider cacheProvider,
                       IHelperHandlerFactory helperHandlerFactory,
                       INamingRule namingRule)
 {
     _cacheProvider        = cacheProvider;
     _helperHandlerFactory = helperHandlerFactory;
     _memberLocator        = new MemberLocatorFromNamingRule(namingRule);
 }
Exemplo n.º 7
0
        public JSchema Run(string templateId, StreamReader reader, IMemberLocator memberLocator, IHelperHandler[] helperHandlers)
        {
            using (reader)
            {
                var node    = _templateParser.Parse(templateId, reader, typeof(object), memberLocator, helperHandlers);
                var visitor = new SchemaBuilderVisitor();
                visitor.Visit(node);

                return(visitor.Schema);
            }
        }
        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);
        }
Exemplo n.º 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));
        }
Exemplo n.º 10
0
        public HandlebarsParserState(string templateId, IMemberLocator memberLocator)
        {
	        _templateId = templateId;
	        _memberLocator = memberLocator;
            this.BlockStack = new HandlebarsBlockStack();
        }
 public HandlebarsViewSchemaProvider(IHelperHandlerFactory helperHandlerFactory, IMemberLocator memberLocator)
 {
     _helperHandlerFactory = helperHandlerFactory;
     _memberLocator = memberLocator;
 }
Exemplo n.º 12
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);
        }
Exemplo n.º 13
0
 public ImplementationKey(StringComparison stringComparison, IMemberLocator memberLocator)
 {
     _stringComparison = stringComparison;
     _memberLocator    = memberLocator;
     _hashCode         = ((int)stringComparison * 397) ^ memberLocator.GetHashCode();
 }
Exemplo n.º 14
0
 public Implementation(StringComparer stringComparer, IMemberLocator memberLocator)
 {
     _stringComparer = stringComparer;
     _memberLocator  = memberLocator;
     _this           = this;
 }
Exemplo n.º 15
0
		/// <summary>
		/// Evaluate a property at runtime against an unknown model type
		/// </summary>
		/// <param name="itemName">The name of the proeprty that will be searched for</param>
		/// <param name="isCaseSenstiive">Indcates whether the expression should be evaluated with case sensitivity</param>
		/// <param name="scope">The scope this expression evaluated in</param>
		public static LateBoundExpressionNode LateBound(string itemName, SourceLocation location, IMemberLocator memberLocator = null, bool isCaseSenstiive = true, ExpressionScope scope = ExpressionScope.CurrentModelOnStack)
		{
			return new LateBoundExpressionNode
			{
				Location = location,
                MemberLocator = memberLocator ?? MemberLocator.Default,
				ItemName = itemName,
				Scope = scope
			};
		}
Exemplo n.º 16
0
        private static ExpressionNode ParseAgainstModel(Type modelType, string expression, ExpressionScope expressionScope, int recursionLevel, IMemberLocator memberLocator, SourceLocation location)
        {
            var dotIndex = expression.IndexOf('.');

            if (dotIndex >= 0)
            {
                var subModel = ParseAgainstModel(modelType, expression.Substring(0, dotIndex), expressionScope, recursionLevel, memberLocator, location.SetLength(dotIndex));
                return(SyntaxTreeExpression.SubModel(
                           subModel,
                           ParseAgainstModel(subModel.ResultType, expression.Substring(dotIndex + 1), ExpressionScope.CurrentModelOnStack, 0, memberLocator, location.MoveIndex(dotIndex + 1)),
                           location
                           ));
            }

            if (expression.EndsWith("()"))
            {
                var func = memberLocator.FindMember(modelType, expression.Substring(0, expression.Length - 2), MemberTypes.Method);
                if (func != null)
                {
                    return(SyntaxTreeExpression.Function(modelType, func.Name, location, expressionScope));
                }
            }

            var prop = memberLocator.FindMember(modelType, expression, MemberTypes.Property | MemberTypes.Field);

            if (prop != null)
            {
                switch (prop.MemberType)
                {
                case MemberTypes.Property: return(SyntaxTreeExpression.Property(modelType, prop.Name, location, expressionScope, recursionLevel));

                case MemberTypes.Field: return(SyntaxTreeExpression.Field(modelType, prop.Name, location, expressionScope, recursionLevel));
                }
            }

            if (IsLateBoundAcceptingType(modelType))
            {
                return(SyntaxTreeExpression.LateBound(expression, location, memberLocator, false, expressionScope, recursionLevel));
            }

            throw new VeilParserException(String.Format("Unable to parse model expression '{0}' againt model '{1}'", expression, modelType.Name), location);
        }
Exemplo n.º 17
0
 public HandlebarsViewSchemaProvider(IHelperHandlerFactory helperHandlerFactory, IMemberLocator memberLocator)
 {
     _helperHandlerFactory = helperHandlerFactory;
     _memberLocator        = memberLocator;
 }
Exemplo n.º 18
0
 /// <summary>
 /// Evaluate a property at runtime against an unknown model type
 /// </summary>
 /// <param name="itemName">The name of the proeprty that will be searched for</param>
 /// <param name="memberLocator"></param>
 /// <param name="isCaseSensitive">Indcates whether the expression should be evaluated with case sensitivity</param>
 /// <param name="scope">The scope this expression evaluated in</param>
 /// <param name="location"></param>
 /// <param name="recursionLevel"></param>
 public static LateBoundExpressionNode LateBound(string itemName, SourceLocation location, IMemberLocator memberLocator = null, bool isCaseSensitive = true, ExpressionScope scope = ExpressionScope.CurrentModelOnStack, int recursionLevel = 0)
 {
     return(new LateBoundExpressionNode
     {
         Location = location,
         MemberLocator = memberLocator ?? MemberLocator.Default,
         ItemName = itemName,
         Scope = scope,
         RecursionLevel = recursionLevel
     });
 }
Exemplo n.º 19
0
 public HandlebarsParserState(string templateId, IMemberLocator memberLocator)
 {
     _templateId     = templateId;
     _memberLocator  = memberLocator;
     this.BlockStack = new HandlebarsBlockStack();
 }
Exemplo n.º 20
0
 /// <summary>
 /// Creates a VeilEngine with an <see cref="IVeilContext"/> to enable support for Includes/Partials/MasterPages.
 /// </summary>
 public VeilEngine(IHelperHandler[] helperHandlers = null, IMemberLocator memberLocator = null)
 {
     _helperHandlers = helperHandlers;
     _memberLocator  = memberLocator;
 }
Exemplo n.º 21
0
 public ClientTemplateGenerator(IHelperHandlerFactory helperHandlerFactory, IMemberLocator memberLocator)
 {
     _helperHandlerFactory = helperHandlerFactory;
     _memberLocator        = memberLocator;
 }