KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > freemarker > core > StringBuiltins


1 /*
2  * Copyright (c) 2003 The Visigoth Software Society. All rights
3  * reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *
12  * 2. Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in
14  * the documentation and/or other materials provided with the
15  * distribution.
16  *
17  * 3. The end-user documentation included with the redistribution, if
18  * any, must include the following acknowledgement:
19  * "This product includes software developed by the
20  * Visigoth Software Society (http://www.visigoths.org/)."
21  * Alternately, this acknowledgement may appear in the software itself,
22  * if and wherever such third-party acknowledgements normally appear.
23  *
24  * 4. Neither the name "FreeMarker", "Visigoth", nor any of the names of the
25  * project contributors may be used to endorse or promote products derived
26  * from this software without prior written permission. For written
27  * permission, please contact visigoths@visigoths.org.
28  *
29  * 5. Products derived from this software may not be called "FreeMarker" or "Visigoth"
30  * nor may "FreeMarker" or "Visigoth" appear in their names
31  * without prior written permission of the Visigoth Software Society.
32  *
33  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
34  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
35  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
36  * DISCLAIMED. IN NO EVENT SHALL THE VISIGOTH SOFTWARE SOCIETY OR
37  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
38  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
39  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
40  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
41  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
42  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
43  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
44  * SUCH DAMAGE.
45  * ====================================================================
46  *
47  * This software consists of voluntary contributions made by many
48  * individuals on behalf of the Visigoth Software Society. For more
49  * information on the Visigoth Software Society, please see
50  * http://www.visigoths.org/
51  */

52
53 package freemarker.core;
54
55 import freemarker.template.*;
56 import freemarker.template.utility.StringUtil;
57
58 import java.io.StringReader JavaDoc;
59 import java.util.StringTokenizer JavaDoc;
60
61
62 /**
63  * A holder for builtins that operate exclusively on strings.
64  */

65
66 abstract class StringBuiltins {
67     abstract static class StringBuiltIn extends BuiltIn {
68         TemplateModel _getAsTemplateModel(Environment env)
69         throws TemplateException
70         {
71             return calculateResult(target.getStringValue(env), env);
72         }
73         abstract TemplateModel calculateResult(String JavaDoc s, Environment env) throws TemplateException;
74     }
75     
76     static class capitalizeBI extends StringBuiltIn {
77         TemplateModel calculateResult(String JavaDoc s, Environment env) {
78             return new SimpleScalar(StringUtil.capitalize(s));
79         }
80     }
81
82     static class chop_linebreakBI extends StringBuiltIn {
83         TemplateModel calculateResult(String JavaDoc s, Environment env) {
84             return new SimpleScalar(StringUtil.chomp(s));
85         }
86     }
87
88     static class j_stringBI extends StringBuiltIn {
89         TemplateModel calculateResult(String JavaDoc s, Environment env) {
90             return new SimpleScalar(StringUtil.javaStringEnc(s));
91         }
92     }
93
94     static class js_stringBI extends StringBuiltIn {
95         TemplateModel calculateResult(String JavaDoc s, Environment env) {
96             return new SimpleScalar(StringUtil.javaScriptStringEnc(s));
97         }
98     }
99
100     static class cap_firstBI extends StringBuiltIn {
101         TemplateModel calculateResult(String JavaDoc s, Environment env) {
102             int i = 0;
103             int ln = s.length();
104             while (i < ln && Character.isWhitespace(s.charAt(i))) {
105                 i++;
106             }
107             if (i < ln) {
108                 StringBuffer JavaDoc b = new StringBuffer JavaDoc(s);
109                 b.setCharAt(i, Character.toUpperCase(s.charAt(i)));
110                 s = b.toString();
111             }
112             return new SimpleScalar(s);
113         }
114     }
115
116     static class uncap_firstBI extends StringBuiltIn {
117         TemplateModel calculateResult(String JavaDoc s, Environment env) {
118             int i = 0;
119             int ln = s.length();
120             while (i < ln && Character.isWhitespace(s.charAt(i))) {
121                 i++;
122             }
123             if (i < ln) {
124                 StringBuffer JavaDoc b = new StringBuffer JavaDoc(s);
125                 b.setCharAt(i, Character.toLowerCase(s.charAt(i)));
126                 s = b.toString();
127             }
128             return new SimpleScalar(s);
129         }
130     }
131
132     static class upper_caseBI extends StringBuiltIn {
133         TemplateModel calculateResult(String JavaDoc s, Environment env)
134         {
135             return new SimpleScalar(s.toUpperCase(env.getLocale()));
136         }
137     }
138
139     static class lower_caseBI extends StringBuiltIn {
140         TemplateModel calculateResult(String JavaDoc s, Environment env)
141         {
142             return new SimpleScalar(s.toLowerCase(env.getLocale()));
143         }
144     }
145
146     static class word_listBI extends StringBuiltIn {
147         TemplateModel calculateResult(String JavaDoc s, Environment env) {
148             SimpleSequence result = new SimpleSequence();
149             StringTokenizer JavaDoc st = new StringTokenizer JavaDoc(s);
150             while (st.hasMoreTokens()) {
151                result.add(st.nextToken());
152             }
153             return result;
154         }
155     }
156
157     static class evalBI extends StringBuiltIn {
158         TemplateModel calculateResult(String JavaDoc s, Environment env) throws TemplateException
159         {
160             SimpleCharStream scs = new SimpleCharStream(
161                     new StringReader JavaDoc("(" + s + ")"), target.beginLine,
162                     target.beginColumn, s.length() + 2);
163             FMParserTokenManager token_source = new FMParserTokenManager(scs);
164             token_source.SwitchTo(FMParserConstants.FM_EXPRESSION);
165             FMParser parser = new FMParser(token_source);
166             parser.template = getTemplate();
167             Expression exp = null;
168             try {
169                 exp = parser.Expression();
170             } catch (ParseException pe) {
171                 throw new TemplateException(pe, env);
172             }
173             return exp.getAsTemplateModel(env);
174         }
175     }
176
177     static class numberBI extends StringBuiltIn {
178         TemplateModel calculateResult(String JavaDoc s, Environment env) throws TemplateException
179         {
180             try {
181                 return new SimpleNumber(env.getArithmeticEngine().toNumber(s));
182             }
183             catch(NumberFormatException JavaDoc nfe) {
184                 String JavaDoc mess = "Error: " + getStartLocation()
185                              + "\nExpecting a number here, found: " + s;
186                 throw new NonNumericalException(mess, env);
187             }
188         }
189     }
190     
191 }
Popular Tags