Mercurial > hg > tema
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 +