public void tokenize()

in src/main/java/org/apache/sling/scripting/sightly/impl/html/dom/TagTokenizer.java [92:245]


    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;

            }
        }
    }