blob: 257d5ee0337f6ccf767a26bfde7c32d8d22d6608 [file] [log] [blame]
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.velocity.runtime.parser.node;
import org.apache.velocity.context.Context;
import org.apache.velocity.context.InternalContextAdapter;
import org.apache.velocity.runtime.parser.*;
/**
* Utilities for dealing with the AST node structure.
*
* @author <a href="mailto:jvanzyl@periapt.com">Jason van Zyl</a>
* @author <a href="mailto:geirm@optonline.net">Geir Magnusson Jr.</a>
* @version $Id: NodeUtils.java,v 1.11 2001/03/19 03:01:47 geirm Exp $
*/
public class NodeUtils
{
/**
* Collect all the <SPECIAL_TOKEN>s that
* are carried along with a token. Special
* tokens do not participate in parsing but
* can still trigger certain lexical actions.
* In some cases you may want to retrieve these
* special tokens, this is simply a way to
* extract them.
*/
public static String specialText(Token t)
{
String specialText = "";
if (t.specialToken == null || t.specialToken.image.startsWith("##") )
return specialText;
Token tmp_t = t.specialToken;
while (tmp_t.specialToken != null)
tmp_t = tmp_t.specialToken;
while (tmp_t != null)
{
String st = tmp_t.image;
StringBuffer sb = new StringBuffer();
for(int i = 0; i < st.length(); i++)
{
char c = st.charAt(i);
if ( c == '#' || c == '$' )
sb.append( c );
}
// specialText += tmp_t.image;
specialText += sb.toString();
tmp_t = tmp_t.next;
}
return specialText;
}
/**
* Utility method to interpolate context variables
* into string literals. So that the following will
* work:
*
* #set $name = "candy"
* $image.getURI("${name}.jpg")
*
* And the string literal argument will
* be transformed into "candy.jpg" before
* the method is executed.
*/
public static String interpolate(String argStr, Context vars)
{
StringBuffer argBuf = new StringBuffer();
for (int cIdx = 0 ; cIdx < argStr.length();)
{
char ch = argStr.charAt(cIdx);
switch (ch)
{
case '$':
StringBuffer nameBuf = new StringBuffer();
for (++cIdx ; cIdx < argStr.length(); ++cIdx)
{
ch = argStr.charAt(cIdx);
if (ch == '_' || ch == '-' || Character.isLetterOrDigit(ch))
nameBuf.append(ch);
else if (ch == '{' || ch == '}')
continue;
else
break;
}
if (nameBuf.length() > 0)
{
Object value = vars.get(nameBuf.toString());
if (value == null)
argBuf.append("$").append(nameBuf.toString());
else
argBuf.append(value.toString());
}
break;
default:
argBuf.append(ch);
++cIdx;
break;
}
}
return argBuf.toString();
}
}