in blocks/cocoon-scratchpad/cocoon-scratchpad-impl/src/main/java/org/apache/cocoon/components/flow/javascript/fom/JavaScriptAspectWeaver.java [275:522]
public static JSTokenList parse( char[] c ) {
int parsingState = AT_START;
JSTokenList tokenList = new JSTokenList();
JSToken curToken = null;
// add start token
// tokenList.add( new JSToken( JSToken.START ) );
// parse char array and create a list with all tokens
for( int i = 0; i < c.length; i++ ) {
char thisChar = c[i];
char nextChar = 0;
if( i < c.length - 1 ) nextChar = c[i+1];
if( parsingState == IN_COMMENT ) {
if( thisChar == '*' && nextChar == '/' ) {
curToken.append('*').append('/');
tokenList.add( curToken.getClone() );
parsingState = AT_START;
i++;
continue;
}
else {
curToken.append( thisChar );
continue;
}
}
else if( parsingState == IN_LINECOMMENT ) {
if( thisChar == '\n' ) {
curToken.append( thisChar );
if( nextChar == '\r' ) {
// don't append win LF characters
i++;
}
tokenList.add( curToken.getClone() );
parsingState = AT_START;
}
else {
curToken.append( thisChar );
}
}
else if( parsingState == IN_CODE ) {
if(! isJSIdentifierPartCharacter( thisChar ) ) {
tokenList.add( curToken.getClone() );
parsingState = AT_START;
}
else {
curToken.append( thisChar );
}
}
else if( parsingState == IN_WHITESPACE ) {
if( thisChar != ' ' || thisChar != '\t' ) {
tokenList.add( curToken.getClone() );
parsingState = AT_START;
}
else if( thisChar == ' ' ) {
curToken.append( thisChar );
}
else if( thisChar == '\t' ) {
for( int count = 1; count <= SPACES_FOR_TAB; count++ ) {
curToken.append( ' ' );
}
}
}
else if( parsingState == IN_SINGLE_QUOTES ) {
curToken.append( thisChar );
if( thisChar == '\'' ) {
tokenList.add( curToken.getClone() );
parsingState = AT_START;
continue;
}
}
else if( parsingState == IN_DOUBLE_QUOTES ) {
curToken.append( thisChar );
if( thisChar == '\"' ) {
tokenList.add( curToken.getClone() );
parsingState = AT_START;
continue;
}
}
else if( parsingState == IN_REGEXP ) {
curToken.append( thisChar );
if( thisChar == '/' ) {
tokenList.add( curToken.getClone() );
parsingState = AT_START;
continue;
}
}
// at start or token has been finished
if( parsingState == AT_START ) {
// check for comments
if( thisChar == '/' && nextChar == '*' ) {
JSToken t = new JSToken( JSToken.COMMENT );
curToken = t.append('/').append('*');
parsingState = IN_COMMENT;
i++;
continue;
}
else if( thisChar == '/' && nextChar == '/' ) {
JSToken t = new JSToken( JSToken.LINE_COMMENT );
curToken = t.append( thisChar ).append( nextChar );
parsingState = IN_LINECOMMENT;
i++;
continue;
}
else if( isJSIdentifierStartCharacter( thisChar ) ) {
JSToken t = new JSToken( JSToken.CODE );
curToken = t.append( thisChar );
parsingState = IN_CODE;
continue;
}
else if( thisChar == ' ' ) {
JSToken t = new JSToken( JSToken.WHITESPACE );
curToken = t.append( thisChar );
parsingState = IN_WHITESPACE;
continue;
}
else if( thisChar == '\t' ) {
JSToken t = new JSToken( JSToken.WHITESPACE );
curToken = t;
for( int count = 1; count <= SPACES_FOR_TAB; count++ ) {
curToken.append( ' ' );
}
parsingState = IN_WHITESPACE;
continue;
}
else if( thisChar == '\"' ) {
JSToken t = new JSToken( JSToken.CODE_LITERAL );
curToken = t.append( thisChar );
parsingState = IN_DOUBLE_QUOTES;
continue;
}
else if( thisChar == '\'' ) {
JSToken t = new JSToken( JSToken.CODE_LITERAL );
curToken = t.append( thisChar );
parsingState = IN_SINGLE_QUOTES;
continue;
}
else if( thisChar == '\r' ) {
// jump over win LFs
parsingState = AT_START;
continue;
}
else if( thisChar == '\n' ) {
JSToken t = new JSToken( JSToken.LF );
curToken = t.append( thisChar );
if( nextChar == '\r' ) {
// t.append( nextChar );
i++;
}
tokenList.add( t.getClone() );
parsingState = AT_START;
continue;
}
else if( thisChar == '/' ) {
JSToken t = new JSToken( JSToken.REGEXP );
curToken = t.append( thisChar );
parsingState = IN_REGEXP;
continue;
}
// single character strings
else if( thisChar == '(' ) {
JSToken t = new JSToken( JSToken.BRACKET_LEFT );
tokenList.add( t.append( thisChar ) );
parsingState = AT_START;
continue;
}
else if( thisChar == ')' ) {
JSToken t = new JSToken( JSToken.BRACKET_RIGHT );
tokenList.add( t.append( thisChar ) );
parsingState = AT_START;
continue;
}
else if( thisChar == '[' ) {
JSToken t = new JSToken( JSToken.BRACKET1_LEFT );
tokenList.add( t.append( thisChar ) );
parsingState = AT_START;
continue;
}
else if( thisChar == ']' ) {
JSToken t = new JSToken( JSToken.BRACKET1_RIGHT );
curToken = t.append( thisChar );
parsingState = AT_START;
continue;
}
else if( thisChar == '{' ) {
JSToken t = new JSToken( JSToken.BRACKET2_LEFT );
tokenList.add( t.append( thisChar ) );
parsingState = AT_START;
continue;
}
else if( thisChar == '}' ) {
JSToken t = new JSToken( JSToken.BRACKET2_RIGHT );
tokenList.add( t.append( thisChar ) );
parsingState = AT_START;
continue;
}
else if( thisChar == '.' ) {
JSToken t = new JSToken( JSToken.POINT );
tokenList.add( t.append( thisChar ) );
parsingState = AT_START;
continue;
}
else if( thisChar == ';' ) {
JSToken t = new JSToken( JSToken.SEMICOLON );
tokenList.add( t.append( thisChar ) );
parsingState = AT_START;
continue;
}
else if( thisChar == '=' ) {
JSToken t = new JSToken( JSToken.EQUAL_SIGN );
tokenList.add( t.append( thisChar ) );
parsingState = AT_START;
continue;
}
else if( thisChar == ',' ) {
JSToken t = new JSToken( JSToken.COMMA );
tokenList.add( t.append( thisChar ) );
parsingState = AT_START;
continue;
}
else if( thisChar == ':' ) {
JSToken t = new JSToken( JSToken.COLON );
tokenList.add( t.append( thisChar ) );
parsingState = AT_START;
continue;
}
else if( thisChar == '*' ) {
JSToken t = new JSToken( JSToken.ASTERISK );
tokenList.add( t.append( thisChar ) );
parsingState = AT_START;
continue;
}
else {
JSToken t = new JSToken( JSToken.UNKNOWN );
tokenList.add( t.append( thisChar ) );
parsingState = AT_START;
continue;
}
}
}
return tokenList;
}