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); }
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; }
public VeilViewEngine(ICacheProvider cacheProvider, IHelperHandlerFactory helperHandlerFactory, INamingRule namingRule) { _cacheProvider = cacheProvider; _helperHandlerFactory = helperHandlerFactory; _memberLocator = new MemberLocatorFromNamingRule(namingRule); }
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); }
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)); }
public HandlebarsParserState(string templateId, IMemberLocator memberLocator) { _templateId = templateId; _memberLocator = memberLocator; this.BlockStack = new HandlebarsBlockStack(); }
public HandlebarsViewSchemaProvider(IHelperHandlerFactory helperHandlerFactory, IMemberLocator memberLocator) { _helperHandlerFactory = helperHandlerFactory; _memberLocator = memberLocator; }
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 ImplementationKey(StringComparison stringComparison, IMemberLocator memberLocator) { _stringComparison = stringComparison; _memberLocator = memberLocator; _hashCode = ((int)stringComparison * 397) ^ memberLocator.GetHashCode(); }
public Implementation(StringComparer stringComparer, IMemberLocator memberLocator) { _stringComparer = stringComparer; _memberLocator = memberLocator; _this = this; }
/// <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 }; }
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); }
/// <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 }); }
/// <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; }
public ClientTemplateGenerator(IHelperHandlerFactory helperHandlerFactory, IMemberLocator memberLocator) { _helperHandlerFactory = helperHandlerFactory; _memberLocator = memberLocator; }