in src/main/java/org/apache/sling/scripting/sightly/impl/html/dom/TagTokenizer.java [92:244]
public void tokenize(char[] buf, int off, int len) {
reset();
int parseState = START;
for (int i = 0; i < len; i++) {
char c = buf[off + i];
switch (parseState) {
case START:
if (c == '<') {
parseState = TAG;
}
break;
case TAG:
if (c == '/') {
endTag = true;
parseState = NAME;
} else if (c == '"' || c == '\'') {
quoteChar = c;
parseState = STRING;
} else if (Character.isWhitespace(c)) {
parseState = INSIDE;
} else {
tagName.write(c);
parseState = NAME;
}
break;
case NAME:
if (Character.isWhitespace(c)) {
parseState = INSIDE;
} else if (c == '"' || c == '\'') {
quoteChar = c;
parseState = STRING;
} else if (c == '>') {
parseState = END;
} else if (c == '/') {
parseState = ENDSLASH;
} else {
tagName.write(c);
}
break;
case INSIDE:
if (c == '>') {
attributeEnded();
parseState = END;
} else if (c == '/') {
attributeEnded();
parseState = ENDSLASH;
} else if (c == '"' || c == '\'') {
attributeValueStarted();
quoteChar = c;
parseState = STRING;
} else if (c == '=') {
parseState = EQUAL;
} else if (!Character.isWhitespace(c)) {
attName.write(c);
parseState = ATTNAME;
}
break;
case ATTNAME:
if (c == '>') {
attributeEnded();
parseState = END;
} else if (c == '/') {
attributeEnded();
parseState = ENDSLASH;
} else if (c == '=') {
parseState = EQUAL;
} else if (c == '"' || c == '\'') {
quoteChar = c;
parseState = STRING;
} else if (Character.isWhitespace(c)) {
parseState = BETWEEN_ATTNAME;
} else {
attName.write(c);
}
break;
case BETWEEN_ATTNAME:
if (c == '>') {
attributeEnded();
parseState = END;
} else if (c == '/') {
attributeEnded();
parseState = ENDSLASH;
} else if (c == '"' || c == '\'') {
attributeValueStarted();
quoteChar = c;
parseState = STRING;
} else if (c == '=') {
parseState = EQUAL;
} else if (!Character.isWhitespace(c)) {
attributeEnded();
attName.write(c);
parseState = ATTNAME;
}
break;
case EQUAL:
if (c == '>') {
attributeEnded();
parseState = END;
} else if (c == '"' || c == '\'') {
attributeValueStarted();
quoteChar = c;
parseState = STRING;
} else if (!Character.isWhitespace(c)) {
attributeValueStarted();
attValue.write(c);
parseState = ATTVALUE;
}
break;
case ATTVALUE:
if (Character.isWhitespace(c)) {
attributeEnded();
parseState = INSIDE;
} else if (c == '"' || c == '\'') {
attributeEnded();
quoteChar = c;
parseState = STRING;
} else if (c == '>') {
attributeEnded();
parseState = END;
} else {
attValue.write(c);
}
break;
case STRING:
if (c == quoteChar) {
attributeEnded();
parseState = INSIDE;
} else {
attValue.write(c);
}
break;
case ENDSLASH:
if (c == '>') {
endSlash = true;
parseState = END;
} else if (c == '"' || c == '\'') {
quoteChar = c;
parseState = STRING;
} else if (c != '/' && !Character.isWhitespace(c)) {
attName.write(c);
parseState = ATTNAME;
} else {
parseState = INSIDE;
}
break;
case END:
break;
}
}
}