changeset 30:54539dff18ca

Allow access to the calling (outer) context. Start parse_args implementation.
author Mikhail Kryshen <mikhail@kryshen.net>
date Fri, 15 May 2009 03:07:16 +0400
parents 2c6edd9cf677
children 3e77076621a8
files src/kryshen/tema/Context.java src/kryshen/tema/TemplateParser.java test/parse_args.tema
diffstat 3 files changed, 56 insertions(+), 6 deletions(-) [+]
line diff
     1.1 --- a/src/kryshen/tema/Context.java	Thu May 14 18:55:32 2009 +0400
     1.2 +++ b/src/kryshen/tema/Context.java	Fri May 15 03:07:16 2009 +0400
     1.3 @@ -21,8 +21,11 @@
     1.4  package kryshen.tema;
     1.5  
     1.6  import java.io.File;
     1.7 +import java.io.IOException;
     1.8 +import java.io.Writer;
     1.9  import java.util.HashMap;
    1.10  import java.util.Map;
    1.11 +import kryshen.tema.io.TemplateReader;
    1.12  
    1.13  /**
    1.14   * Tema template context.
    1.15 @@ -114,7 +117,32 @@
    1.16          
    1.17          return false;
    1.18      }
    1.19 -    
    1.20 +
    1.21 +    int parseInContext(TemplateReader in, Writer out, Context outer)
    1.22 +            throws IOException, TemplateException {
    1.23 +
    1.24 +        final String OUTER = "outer";
    1.25 +
    1.26 +        boolean hadOuter = definitions.containsKey(OUTER);
    1.27 +        Object oldOuter = null;
    1.28 +        if (hadOuter) {
    1.29 +            oldOuter = definitions.get(OUTER);
    1.30 +        }
    1.31 +        
    1.32 +        definitions.put(OUTER, outer);
    1.33 +
    1.34 +        try {
    1.35 +            TemplateParser parser = new TemplateParser(this);
    1.36 +            return parser.parse(in, out);
    1.37 +        } finally {
    1.38 +            if (hadOuter) {
    1.39 +                definitions.put(OUTER, oldOuter);
    1.40 +            } else {
    1.41 +                definitions.remove(OUTER);
    1.42 +            }
    1.43 +        }
    1.44 +    }
    1.45 +
    1.46      /**
    1.47       * Returns base directory which should be used to resolve
    1.48       * relative path names in template.
     2.1 --- a/src/kryshen/tema/TemplateParser.java	Thu May 14 18:55:32 2009 +0400
     2.2 +++ b/src/kryshen/tema/TemplateParser.java	Fri May 15 03:07:16 2009 +0400
     2.3 @@ -433,11 +433,10 @@
     2.4                  return 0;
     2.5              }
     2.6  
     2.7 -            TemplateParser parser = new TemplateParser((Context) value);
     2.8 -            return parser.parse(
     2.9 -                    new TemplateReader(new StringReader(code),
    2.10 -                    fdp.getTemplateReader()),
    2.11 -                    out);
    2.12 +            TemplateReader in = new TemplateReader(new StringReader(code),
    2.13 +                    fdp.getTemplateReader());
    2.14 +
    2.15 +            return ((Context) value).parseInContext(in, out, context);
    2.16          }
    2.17  
    2.18          return parseValue(value, out);
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/test/parse_args.tema	Fri May 15 03:07:16 2009 +0400
     3.3 @@ -0,0 +1,23 @@
     3.4 +<%define#parse_args
     3.5 +  <%set:stop <%next_arg\%>%>
     3.6 +  <%while#
     3.7 +    <%super#<%has_more_data\%>%>
     3.8 +    <%and not equal:<%set:name <%super#<%next_arg\%>%>%> <%stop\%>%>
     3.9 +    <%and super#<%set:arg_<%outer#<%name\%>%> <%next_arg\%>%>%>
    3.10 +  %>
    3.11 +%>
    3.12 +
    3.13 +<%define#test
    3.14 +  <%silent parse_args:g%>\
    3.15 +  *<%arg_a\%>*
    3.16 +  *<%arg_b\%>*
    3.17 +  *<%arg_g\%>*
    3.18 +  **<%data\%>**
    3.19 +%>
    3.20 +
    3.21 +<%test:
    3.22 +  a 1
    3.23 +  b 2
    3.24 +  g 3 4 5 6
    3.25 +%>
    3.26 +