public override void Eval(TemplateContext context, System.IO.StringWriter writer) { // locate template if (!context.Templates.ContainsKey(templateName)) { throw new ParserException(String.Format("Custom template \"{0}\" is not defined", templateName), Line, Column); } TemplateStatement tmp = context.Templates[templateName]; // create template-specific context TemplateContext tmpContext = new TemplateContext(); tmpContext.ParentContext = context; tmpContext.Templates = context.Templates; // evaluate inner statements StringWriter innerWriter = new StringWriter(); foreach (Statement stm in Statements) { stm.Eval(context, innerWriter); } tmpContext.Variables["innerText"] = innerWriter.ToString(); // set context variables foreach (string name in parameters.Keys) { tmpContext.Variables[name] = parameters[name].Eval(context); } // evaluate template statements foreach (Statement stm in tmp.Statements) { stm.Eval(tmpContext, writer); } }
private Statement ParseTemplateStatement() { // parse statement declaration TemplateStatement stm = new TemplateStatement(current.Line, current.Column); Consume(TokenType.Template); // parse tag attributes do { if (Current.TokenType != TokenType.Attribute) throw new ParserException("Expected tag attribute", stm.Line, stm.Column); string attrName = Current.Data; Consume(TokenType.Attribute); Consume(TokenType.Assign); // look for "test" attribute if (attrName == "name") { stm.Name = Current.Data; Consume(TokenType.String); } } while (Current.TokenType == TokenType.Attribute); // check statement if (stm.Name == null) throw new ParserException("\"name\" attribute was not specified", stm.Line, stm.Column); // parse body while (true) { if (Current.TokenType == TokenType.EndTemplate) { break; } else { Statement blockStm = ParseStatement(); if (blockStm == null) throw new ParserException("Expected {/template} tag", stm.Line, stm.Column); // parse statement stm.Statements.Add(blockStm); } } Consume(TokenType.EndTemplate); return stm; }