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);
            }
        }
Пример #2
0
        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;
        }