in tapestry-framework/src/org/apache/tapestry/script/AbstractTokenRule.java [65:180]
protected void addTextTokens(IScriptToken token, String text, ILocation location)
{
char[] buffer = text.toCharArray();
int state = STATE_START;
int blockStart = 0;
int blockLength = 0;
int expressionStart = -1;
int expressionLength = 0;
int i = 0;
int braceDepth = 0;
while (i < buffer.length)
{
char ch = buffer[i];
switch (state)
{
case STATE_START :
if (ch == '$')
{
state = STATE_DOLLAR;
i++;
continue;
}
blockLength++;
i++;
continue;
case STATE_DOLLAR :
if (ch == '{')
{
state = STATE_COLLECT_EXPRESSION;
i++;
expressionStart = i;
expressionLength = 0;
braceDepth = 1;
continue;
}
// The '$' was just what it was, not the start of a ${} expression
// block, so include it as part of the static text block.
blockLength++;
state = STATE_START;
continue;
case STATE_COLLECT_EXPRESSION :
if (ch != '}')
{
if (ch == '{')
braceDepth++;
i++;
expressionLength++;
continue;
}
braceDepth--;
if (braceDepth > 0)
{
i++;
expressionLength++;
continue;
}
// Hit the closing brace of an expression.
// Degenerate case: the string "${}".
if (expressionLength == 0)
blockLength += 3;
if (blockLength > 0)
token.addToken(constructStatic(text, blockStart, blockLength, location));
if (expressionLength > 0)
{
String expression =
text.substring(expressionStart, expressionStart + expressionLength);
token.addToken(new InsertToken(expression, location));
}
i++;
blockStart = i;
blockLength = 0;
// And drop into state start
state = STATE_START;
continue;
}
}
// OK, to handle the end. Couple of degenerate cases where
// a ${...} was incomplete, so we adust the block length.
if (state == STATE_DOLLAR)
blockLength++;
if (state == STATE_COLLECT_EXPRESSION)
blockLength += expressionLength + 2;
if (blockLength > 0)
token.addToken(constructStatic(text, blockStart, blockLength, location));
}