public void Render(ViewContext viewContext, TextWriter writer) { var nodes = GetNodes(viewContext, viewPath); var evaluator = new InternalEvaluator(viewContext, functions); var masterNode = nodes.First() as MasterNode; if (!string.IsNullOrEmpty(masterPath)) { string content; if (masterNode != null) { var attributes = evaluator.EvaluateAttributes(masterNode.Id, masterNode.Attributes); foreach (var attribute in attributes.Where(a => a.Key != "file")) { evaluator.LocalData[attribute.Key] = attribute.Value; } content = evaluator.Evaluate(masterNode.Content); } else { content = evaluator.Evaluate(nodes); } evaluator.ViewData["content"] = content; var masterNodes = GetNodes(viewContext, masterPath); writer.Write(evaluator.Evaluate(masterNodes)); } else if (masterNode != null) { var attributes = evaluator.EvaluateAttributes(masterNode.Id, masterNode.Attributes); var evaluatedView = evaluator.Evaluate(masterNode.Content); var file = attributes.GetRequiredAttribute <string>("file"); var masterNodes = GetNodes(viewContext, file); foreach (var attribute in attributes.Where(a => a.Key != "file")) { evaluator.LocalData[attribute.Key] = attribute.Value; } evaluator.ViewData["content"] = evaluatedView; writer.Write(evaluator.Evaluate(masterNodes)); } else { writer.Write(evaluator.Evaluate(nodes)); } }
internal string EvaluateTemplate(int nodeId, string templatePath, object model, IDictionary <string, object> viewData) { IEnumerable <IParserNode> nodes; using (var stream = new StreamReader(viewContext.MapViewPath(templatePath))) { var tokenizer = new Tokenizer(stream); var parser = new Parser(nodeId + 1, tokenizer, functions); nodes = parser.ParseAll(); } var evaluator = new InternalEvaluator(viewContext, functions); return(evaluator.Evaluate(nodes)); }
public Evaluator(InternalEvaluator evaluator, int currentNodeId) { this.evaluator = evaluator; this.currentNodeId = currentNodeId; }
public FunctionEvaluator(InternalEvaluator internalEvaluator, int currentNodeId, IDictionary <string, object> functionData) { this.internalEvaluator = internalEvaluator; this.currentNodeId = currentNodeId; FunctionData = functionData; }