src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavaScriptScanner.java
branchniosocketimpl-branch
changeset 57208 7a45c67e73d0
parent 57207 30695f27d7ea
parent 53902 7a6fd71449e7
child 57210 a67ea4f53e56
--- a/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/JavaScriptScanner.java	Fri Feb 22 17:03:09 2019 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1104 +0,0 @@
-/*
- * Copyright (c) 2012,2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.tools.javadoc.main;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
-import com.sun.tools.javadoc.main.JavaScriptScanner.TagParser.Kind;
-
-import static com.sun.tools.javac.util.LayoutCharacters.EOI;
-
-/**
- * Parser to detect use of JavaScript in documentation comments.
- */
-@Deprecated(since="9", forRemoval=true)
-@SuppressWarnings("removal")
-public class JavaScriptScanner {
-    public static interface Reporter {
-        void report();
-    }
-
-    static class ParseException extends Exception {
-        private static final long serialVersionUID = 0;
-        ParseException(String key) {
-            super(key);
-        }
-    }
-
-    private Reporter reporter;
-
-    /** The input buffer, index of most recent character read,
-     *  index of one past last character in buffer.
-     */
-    protected char[] buf;
-    protected int bp;
-    protected int buflen;
-
-    /** The current character.
-     */
-    protected char ch;
-
-    private boolean newline = true;
-
-    Map<String, TagParser> tagParsers;
-    Set<String> eventAttrs;
-    Set<String> uriAttrs;
-
-    public JavaScriptScanner() {
-        initTagParsers();
-        initEventAttrs();
-        initURIAttrs();
-    }
-
-    public void parse(String comment, Reporter r) {
-        reporter = r;
-        String c = comment;
-        buf = new char[c.length() + 1];
-        c.getChars(0, c.length(), buf, 0);
-        buf[buf.length - 1] = EOI;
-        buflen = buf.length - 1;
-        bp = -1;
-        newline = true;
-        nextChar();
-
-        blockContent();
-        blockTags();
-    }
-
-    private void checkHtmlTag(String tag) {
-        if (tag.equalsIgnoreCase("script")) {
-            reporter.report();
-        }
-    }
-
-    private void checkHtmlAttr(String name, String value) {
-        String n = name.toLowerCase(Locale.ENGLISH);
-        if (eventAttrs.contains(n)
-                || uriAttrs.contains(n)
-                    && value != null && value.toLowerCase(Locale.ENGLISH).trim().startsWith("javascript:")) {
-            reporter.report();
-        }
-    }
-
-    void nextChar() {
-        ch = buf[bp < buflen ? ++bp : buflen];
-        switch (ch) {
-            case '\f': case '\n': case '\r':
-                newline = true;
-        }
-    }
-
-    /**
-     * Read block content, consisting of text, html and inline tags.
-     * Terminated by the end of input, or the beginning of the next block tag:
-     * i.e. @ as the first non-whitespace character on a line.
-     */
-    @SuppressWarnings("fallthrough")
-    protected void blockContent() {
-
-        loop:
-        while (bp < buflen) {
-            switch (ch) {
-                case '\n': case '\r': case '\f':
-                    newline = true;
-                    // fallthrough
-
-                case ' ': case '\t':
-                    nextChar();
-                    break;
-
-                case '&':
-                    entity(null);
-                    break;
-
-                case '<':
-                    html();
-                    break;
-
-                case '>':
-                    newline = false;
-                    nextChar();
-                    break;
-
-                case '{':
-                    inlineTag(null);
-                    break;
-
-                case '@':
-                    if (newline) {
-                        break loop;
-                    }
-                    // fallthrough
-
-                default:
-                    newline = false;
-                    nextChar();
-            }
-        }
-    }
-
-    /**
-     * Read a series of block tags, including their content.
-     * Standard tags parse their content appropriately.
-     * Non-standard tags are represented by {@link UnknownBlockTag}.
-     */
-    protected void blockTags() {
-        while (ch == '@')
-            blockTag();
-    }
-
-    /**
-     * Read a single block tag, including its content.
-     * Standard tags parse their content appropriately.
-     * Non-standard tags are represented by {@link UnknownBlockTag}.
-     */
-    protected void blockTag() {
-        int p = bp;
-        try {
-            nextChar();
-            if (isIdentifierStart(ch)) {
-                String name = readTagName();
-                TagParser tp = tagParsers.get(name);
-                if (tp == null) {
-                    blockContent();
-                } else {
-                    switch (tp.getKind()) {
-                        case BLOCK:
-                            tp.parse(p);
-                            return;
-                        case INLINE:
-                            return;
-                    }
-                }
-            }
-            blockContent();
-        } catch (ParseException e) {
-            blockContent();
-        }
-    }
-
-    protected void inlineTag(Void list) {
-        newline = false;
-        nextChar();
-        if (ch == '@') {
-            inlineTag();
-        }
-    }
-
-    /**
-     * Read a single inline tag, including its content.
-     * Standard tags parse their content appropriately.
-     * Non-standard tags are represented by {@link UnknownBlockTag}.
-     * Malformed tags may be returned as {@link Erroneous}.
-     */
-    protected void inlineTag() {
-        int p = bp - 1;
-        try {
-            nextChar();
-            if (isIdentifierStart(ch)) {
-                String name = readTagName();
-                TagParser tp = tagParsers.get(name);
-
-                if (tp == null) {
-                    skipWhitespace();
-                    inlineText(WhitespaceRetentionPolicy.REMOVE_ALL);
-                    nextChar();
-                } else {
-                    skipWhitespace();
-                    if (tp.getKind() == TagParser.Kind.INLINE) {
-                        tp.parse(p);
-                    } else { // handle block tags (ex: @see) in inline content
-                        inlineText(WhitespaceRetentionPolicy.REMOVE_ALL); // skip content
-                        nextChar();
-                    }
-                }
-            }
-        } catch (ParseException e) {
-        }
-    }
-
-    private static enum WhitespaceRetentionPolicy {
-        RETAIN_ALL,
-        REMOVE_FIRST_SPACE,
-        REMOVE_ALL
-    }
-
-    /**
-     * Read plain text content of an inline tag.
-     * Matching pairs of { } are skipped; the text is terminated by the first
-     * unmatched }. It is an error if the beginning of the next tag is detected.
-     */
-    private void inlineText(WhitespaceRetentionPolicy whitespacePolicy) throws ParseException {
-        switch (whitespacePolicy) {
-            case REMOVE_ALL:
-                skipWhitespace();
-                break;
-            case REMOVE_FIRST_SPACE:
-                if (ch == ' ')
-                    nextChar();
-                break;
-            case RETAIN_ALL:
-            default:
-                // do nothing
-                break;
-
-        }
-        int pos = bp;
-        int depth = 1;
-
-        loop:
-        while (bp < buflen) {
-            switch (ch) {
-                case '\n': case '\r': case '\f':
-                    newline = true;
-                    break;
-
-                case ' ': case '\t':
-                    break;
-
-                case '{':
-                    newline = false;
-                    depth++;
-                    break;
-
-                case '}':
-                    if (--depth == 0) {
-                        return;
-                    }
-                    newline = false;
-                    break;
-
-                case '@':
-                    if (newline)
-                        break loop;
-                    newline = false;
-                    break;
-
-                default:
-                    newline = false;
-                    break;
-            }
-            nextChar();
-        }
-        throw new ParseException("dc.unterminated.inline.tag");
-    }
-
-    /**
-     * Read Java class name, possibly followed by member
-     * Matching pairs of {@literal < >} are skipped. The text is terminated by the first
-     * unmatched }. It is an error if the beginning of the next tag is detected.
-     */
-    // TODO: boolean allowMember should be enum FORBID, ALLOW, REQUIRE
-    // TODO: improve quality of parse to forbid bad constructions.
-    // TODO: update to use ReferenceParser
-    @SuppressWarnings("fallthrough")
-    protected void reference(boolean allowMember) throws ParseException {
-        int pos = bp;
-        int depth = 0;
-
-        // scan to find the end of the signature, by looking for the first
-        // whitespace not enclosed in () or <>, or the end of the tag
-        loop:
-        while (bp < buflen) {
-            switch (ch) {
-                case '\n': case '\r': case '\f':
-                    newline = true;
-                    // fallthrough
-
-                case ' ': case '\t':
-                    if (depth == 0)
-                        break loop;
-                    break;
-
-                case '(':
-                case '<':
-                    newline = false;
-                    depth++;
-                    break;
-
-                case ')':
-                case '>':
-                    newline = false;
-                    --depth;
-                    break;
-
-                case '}':
-                    if (bp == pos)
-                        return;
-                    newline = false;
-                    break loop;
-
-                case '@':
-                    if (newline)
-                        break loop;
-                    // fallthrough
-
-                default:
-                    newline = false;
-
-            }
-            nextChar();
-        }
-
-        if (depth != 0)
-            throw new ParseException("dc.unterminated.signature");
-    }
-
-    /**
-     * Read Java identifier
-     * Matching pairs of { } are skipped; the text is terminated by the first
-     * unmatched }. It is an error if the beginning of the next tag is detected.
-     */
-    @SuppressWarnings("fallthrough")
-    protected void identifier() throws ParseException {
-        skipWhitespace();
-        int pos = bp;
-
-        if (isJavaIdentifierStart(ch)) {
-            readJavaIdentifier();
-            return;
-        }
-
-        throw new ParseException("dc.identifier.expected");
-    }
-
-    /**
-     * Read a quoted string.
-     * It is an error if the beginning of the next tag is detected.
-     */
-    @SuppressWarnings("fallthrough")
-    protected void quotedString() {
-        int pos = bp;
-        nextChar();
-
-        loop:
-        while (bp < buflen) {
-            switch (ch) {
-                case '\n': case '\r': case '\f':
-                    newline = true;
-                    break;
-
-                case ' ': case '\t':
-                    break;
-
-                case '"':
-                    nextChar();
-                    // trim trailing white-space?
-                    return;
-
-                case '@':
-                    if (newline)
-                        break loop;
-
-            }
-            nextChar();
-        }
-    }
-
-    /**
-     * Read a term ie. one word.
-     * It is an error if the beginning of the next tag is detected.
-     */
-    @SuppressWarnings("fallthrough")
-    protected void inlineWord() {
-        int pos = bp;
-        int depth = 0;
-        loop:
-        while (bp < buflen) {
-            switch (ch) {
-                case '\n':
-                    newline = true;
-                    // fallthrough
-
-                case '\r': case '\f': case ' ': case '\t':
-                    return;
-
-                case '@':
-                    if (newline)
-                        break loop;
-
-                case '{':
-                    depth++;
-                    break;
-
-                case '}':
-                    if (depth == 0 || --depth == 0)
-                        return;
-                    break;
-            }
-            newline = false;
-            nextChar();
-        }
-    }
-
-    /**
-     * Read general text content of an inline tag, including HTML entities and elements.
-     * Matching pairs of { } are skipped; the text is terminated by the first
-     * unmatched }. It is an error if the beginning of the next tag is detected.
-     */
-    @SuppressWarnings("fallthrough")
-    private void inlineContent() {
-
-        skipWhitespace();
-        int pos = bp;
-        int depth = 1;
-
-        loop:
-        while (bp < buflen) {
-
-            switch (ch) {
-                case '\n': case '\r': case '\f':
-                    newline = true;
-                    // fall through
-
-                case ' ': case '\t':
-                    nextChar();
-                    break;
-
-                case '&':
-                    entity(null);
-                    break;
-
-                case '<':
-                    newline = false;
-                    html();
-                    break;
-
-                case '{':
-                    newline = false;
-                    depth++;
-                    nextChar();
-                    break;
-
-                case '}':
-                    newline = false;
-                    if (--depth == 0) {
-                        nextChar();
-                        return;
-                    }
-                    nextChar();
-                    break;
-
-                case '@':
-                    if (newline)
-                        break loop;
-                    // fallthrough
-
-                default:
-                    nextChar();
-                    break;
-            }
-        }
-
-    }
-
-    protected void entity(Void list) {
-        newline = false;
-        entity();
-    }
-
-    /**
-     * Read an HTML entity.
-     * {@literal &identifier; } or {@literal &#digits; } or {@literal &#xhex-digits; }
-     */
-    protected void entity() {
-        nextChar();
-        String name = null;
-        if (ch == '#') {
-            int namep = bp;
-            nextChar();
-            if (isDecimalDigit(ch)) {
-                nextChar();
-                while (isDecimalDigit(ch))
-                    nextChar();
-                name = new String(buf, namep, bp - namep);
-            } else if (ch == 'x' || ch == 'X') {
-                nextChar();
-                if (isHexDigit(ch)) {
-                    nextChar();
-                    while (isHexDigit(ch))
-                        nextChar();
-                    name = new String(buf, namep, bp - namep);
-                }
-            }
-        } else if (isIdentifierStart(ch)) {
-            name = readIdentifier();
-        }
-
-        if (name != null) {
-            if (ch != ';')
-                return;
-            nextChar();
-        }
-    }
-
-    /**
-     * Read the start or end of an HTML tag, or an HTML comment
-     * {@literal <identifier attrs> } or {@literal </identifier> }
-     */
-    protected void html() {
-        int p = bp;
-        nextChar();
-        if (isIdentifierStart(ch)) {
-            String name = readIdentifier();
-            checkHtmlTag(name);
-            htmlAttrs();
-            if (ch == '/') {
-                nextChar();
-            }
-            if (ch == '>') {
-                nextChar();
-                return;
-            }
-        } else if (ch == '/') {
-            nextChar();
-            if (isIdentifierStart(ch)) {
-                readIdentifier();
-                skipWhitespace();
-                if (ch == '>') {
-                    nextChar();
-                    return;
-                }
-            }
-        } else if (ch == '!') {
-            nextChar();
-            if (ch == '-') {
-                nextChar();
-                if (ch == '-') {
-                    nextChar();
-                    while (bp < buflen) {
-                        int dash = 0;
-                        while (ch == '-') {
-                            dash++;
-                            nextChar();
-                        }
-                        // Strictly speaking, a comment should not contain "--"
-                        // so dash > 2 is an error, dash == 2 implies ch == '>'
-                        // See http://www.w3.org/TR/html-markup/syntax.html#syntax-comments
-                        // for more details.
-                        if (dash >= 2 && ch == '>') {
-                            nextChar();
-                            return;
-                        }
-
-                        nextChar();
-                    }
-                }
-            }
-        }
-
-        bp = p + 1;
-        ch = buf[bp];
-    }
-
-    /**
-     * Read a series of HTML attributes, terminated by {@literal > }.
-     * Each attribute is of the form {@literal identifier[=value] }.
-     * "value" may be unquoted, single-quoted, or double-quoted.
-     */
-    protected void htmlAttrs() {
-        skipWhitespace();
-
-        loop:
-        while (isIdentifierStart(ch)) {
-            int namePos = bp;
-            String name = readAttributeName();
-            skipWhitespace();
-            StringBuilder value = new StringBuilder();
-            if (ch == '=') {
-                nextChar();
-                skipWhitespace();
-                if (ch == '\'' || ch == '"') {
-                    char quote = ch;
-                    nextChar();
-                    while (bp < buflen && ch != quote) {
-                        if (newline && ch == '@') {
-                            // No point trying to read more.
-                            // In fact, all attrs get discarded by the caller
-                            // and superseded by a malformed.html node because
-                            // the html tag itself is not terminated correctly.
-                            break loop;
-                        }
-                        value.append(ch);
-                        nextChar();
-                    }
-                    nextChar();
-                } else {
-                    while (bp < buflen && !isUnquotedAttrValueTerminator(ch)) {
-                        value.append(ch);
-                        nextChar();
-                    }
-                }
-                skipWhitespace();
-            }
-            checkHtmlAttr(name, value.toString());
-        }
-    }
-
-    protected void attrValueChar(Void list) {
-        switch (ch) {
-            case '&':
-                entity(list);
-                break;
-
-            case '{':
-                inlineTag(list);
-                break;
-
-            default:
-                nextChar();
-        }
-    }
-
-    protected boolean isIdentifierStart(char ch) {
-        return Character.isUnicodeIdentifierStart(ch);
-    }
-
-    protected String readIdentifier() {
-        int start = bp;
-        nextChar();
-        while (bp < buflen && Character.isUnicodeIdentifierPart(ch))
-            nextChar();
-        return new String(buf, start, bp - start);
-    }
-
-    protected String readAttributeName() {
-        int start = bp;
-        nextChar();
-        while (bp < buflen && (Character.isUnicodeIdentifierPart(ch) || ch == '-'))
-            nextChar();
-        return new String(buf, start, bp - start);
-    }
-
-    protected String readTagName() {
-        int start = bp;
-        nextChar();
-        while (bp < buflen
-                && (Character.isUnicodeIdentifierPart(ch) || ch == '.'
-                || ch == '-' || ch == ':')) {
-            nextChar();
-        }
-        return new String(buf, start, bp - start);
-    }
-
-    protected boolean isJavaIdentifierStart(char ch) {
-        return Character.isJavaIdentifierStart(ch);
-    }
-
-    protected String readJavaIdentifier() {
-        int start = bp;
-        nextChar();
-        while (bp < buflen && Character.isJavaIdentifierPart(ch))
-            nextChar();
-        return new String(buf, start, bp - start);
-    }
-
-    protected boolean isDecimalDigit(char ch) {
-        return ('0' <= ch && ch <= '9');
-    }
-
-    protected boolean isHexDigit(char ch) {
-        return ('0' <= ch && ch <= '9')
-                || ('a' <= ch && ch <= 'f')
-                || ('A' <= ch && ch <= 'F');
-    }
-
-    protected boolean isUnquotedAttrValueTerminator(char ch) {
-        switch (ch) {
-            case '\f': case '\n': case '\r': case '\t':
-            case ' ':
-            case '"': case '\'': case '`':
-            case '=': case '<': case '>':
-                return true;
-            default:
-                return false;
-        }
-    }
-
-    protected boolean isWhitespace(char ch) {
-        return Character.isWhitespace(ch);
-    }
-
-    protected void skipWhitespace() {
-        while (isWhitespace(ch)) {
-            nextChar();
-        }
-    }
-
-    /**
-     * @param start position of first character of string
-     * @param end position of character beyond last character to be included
-     */
-    String newString(int start, int end) {
-        return new String(buf, start, end - start);
-    }
-
-    static abstract class TagParser {
-        enum Kind { INLINE, BLOCK }
-
-        final Kind kind;
-        final String name;
-
-
-        TagParser(Kind k, String tk) {
-            kind = k;
-            name = tk;
-        }
-
-        TagParser(Kind k, String tk, boolean retainWhiteSpace) {
-            this(k, tk);
-        }
-
-        Kind getKind() {
-            return kind;
-        }
-
-        String getName() {
-            return name;
-        }
-
-        abstract void parse(int pos) throws ParseException;
-    }
-
-    /**
-     * @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/unix/javadoc.html#CHDJGIJB">Javadoc Tags</a>
-     */
-    @SuppressWarnings("deprecation")
-    private void initTagParsers() {
-        TagParser[] parsers = {
-            // @author name-text
-            new TagParser(Kind.BLOCK, "author") {
-                @Override
-                public void parse(int pos) {
-                    blockContent();
-                }
-            },
-
-            // {@code text}
-            new TagParser(Kind.INLINE, "code", true) {
-                @Override
-                public void parse(int pos) throws ParseException {
-                    inlineText(WhitespaceRetentionPolicy.REMOVE_FIRST_SPACE);
-                    nextChar();
-                }
-            },
-
-            // @deprecated deprecated-text
-            new TagParser(Kind.BLOCK, "deprecated") {
-                @Override
-                public void parse(int pos) {
-                    blockContent();
-                }
-            },
-
-            // {@docRoot}
-            new TagParser(Kind.INLINE, "docRoot") {
-                @Override
-                public void parse(int pos) throws ParseException {
-                    if (ch == '}') {
-                        nextChar();
-                        return;
-                    }
-                    inlineText(WhitespaceRetentionPolicy.REMOVE_ALL); // skip unexpected content
-                    nextChar();
-                    throw new ParseException("dc.unexpected.content");
-                }
-            },
-
-            // @exception class-name description
-            new TagParser(Kind.BLOCK, "exception") {
-                @Override
-                public void parse(int pos) throws ParseException {
-                    skipWhitespace();
-                    reference(false);
-                    blockContent();
-                }
-            },
-
-            // @hidden hidden-text
-            new TagParser(Kind.BLOCK, "hidden") {
-                @Override
-                public void parse(int pos) {
-                    blockContent();
-                }
-            },
-
-            // @index search-term options-description
-            new TagParser(Kind.INLINE, "index") {
-                @Override
-                public void parse(int pos) throws ParseException {
-                    skipWhitespace();
-                    if (ch == '}') {
-                        throw new ParseException("dc.no.content");
-                    }
-                    if (ch == '"') quotedString(); else inlineWord();
-                    skipWhitespace();
-                    if (ch != '}') {
-                        inlineContent();
-                    } else {
-                        nextChar();
-                    }
-                }
-            },
-
-            // {@inheritDoc}
-            new TagParser(Kind.INLINE, "inheritDoc") {
-                @Override
-                public void parse(int pos) throws ParseException {
-                    if (ch == '}') {
-                        nextChar();
-                        return;
-                    }
-                    inlineText(WhitespaceRetentionPolicy.REMOVE_ALL); // skip unexpected content
-                    nextChar();
-                    throw new ParseException("dc.unexpected.content");
-                }
-            },
-
-            // {@link package.class#member label}
-            new TagParser(Kind.INLINE, "link") {
-                @Override
-                public void parse(int pos) throws ParseException {
-                    reference(true);
-                    inlineContent();
-                }
-            },
-
-            // {@linkplain package.class#member label}
-            new TagParser(Kind.INLINE, "linkplain") {
-                @Override
-                public void parse(int pos) throws ParseException {
-                    reference(true);
-                    inlineContent();
-                }
-            },
-
-            // {@literal text}
-            new TagParser(Kind.INLINE, "literal", true) {
-                @Override
-                public void parse(int pos) throws ParseException {
-                    inlineText(WhitespaceRetentionPolicy.REMOVE_FIRST_SPACE);
-                    nextChar();
-                }
-            },
-
-            // @param parameter-name description
-            new TagParser(Kind.BLOCK, "param") {
-                @Override
-                public void parse(int pos) throws ParseException {
-                    skipWhitespace();
-
-                    boolean typaram = false;
-                    if (ch == '<') {
-                        typaram = true;
-                        nextChar();
-                    }
-
-                    identifier();
-
-                    if (typaram) {
-                        if (ch != '>')
-                            throw new ParseException("dc.gt.expected");
-                        nextChar();
-                    }
-
-                    skipWhitespace();
-                    blockContent();
-                }
-            },
-
-            // @return description
-            new TagParser(Kind.BLOCK, "return") {
-                @Override
-                public void parse(int pos) {
-                    blockContent();
-                }
-            },
-
-            // @see reference | quoted-string | HTML
-            new TagParser(Kind.BLOCK, "see") {
-                @Override
-                public void parse(int pos) throws ParseException {
-                    skipWhitespace();
-                    switch (ch) {
-                        case '"':
-                            quotedString();
-                            skipWhitespace();
-                            if (ch == '@'
-                                    || ch == EOI && bp == buf.length - 1) {
-                                return;
-                            }
-                            break;
-
-                        case '<':
-                            blockContent();
-                            return;
-
-                        case '@':
-                            if (newline)
-                                throw new ParseException("dc.no.content");
-                            break;
-
-                        case EOI:
-                            if (bp == buf.length - 1)
-                                throw new ParseException("dc.no.content");
-                            break;
-
-                        default:
-                            if (isJavaIdentifierStart(ch) || ch == '#') {
-                                reference(true);
-                                blockContent();
-                            }
-                    }
-                    throw new ParseException("dc.unexpected.content");
-                }
-            },
-
-            // @serialData data-description
-            new TagParser(Kind.BLOCK, "@serialData") {
-                @Override
-                public void parse(int pos) {
-                    blockContent();
-                }
-            },
-
-            // @serialField field-name field-type description
-            new TagParser(Kind.BLOCK, "serialField") {
-                @Override
-                public void parse(int pos) throws ParseException {
-                    skipWhitespace();
-                    identifier();
-                    skipWhitespace();
-                    reference(false);
-                    if (isWhitespace(ch)) {
-                        skipWhitespace();
-                        blockContent();
-                    }
-                }
-            },
-
-            // @serial field-description | include | exclude
-            new TagParser(Kind.BLOCK, "serial") {
-                @Override
-                public void parse(int pos) {
-                    blockContent();
-                }
-            },
-
-            // @since since-text
-            new TagParser(Kind.BLOCK, "since") {
-                @Override
-                public void parse(int pos) {
-                    blockContent();
-                }
-            },
-
-            // @throws class-name description
-            new TagParser(Kind.BLOCK, "throws") {
-                @Override
-                public void parse(int pos) throws ParseException {
-                    skipWhitespace();
-                    reference(false);
-                    blockContent();
-                }
-            },
-
-            // {@value package.class#field}
-            new TagParser(Kind.INLINE, "value") {
-                @Override
-                public void parse(int pos) throws ParseException {
-                    reference(true);
-                    skipWhitespace();
-                    if (ch == '}') {
-                        nextChar();
-                        return;
-                    }
-                    nextChar();
-                    throw new ParseException("dc.unexpected.content");
-                }
-            },
-
-            // @version version-text
-            new TagParser(Kind.BLOCK, "version") {
-                @Override
-                public void parse(int pos) {
-                    blockContent();
-                }
-            },
-        };
-
-        tagParsers = new HashMap<>();
-        for (TagParser p: parsers)
-            tagParsers.put(p.getName(), p);
-
-    }
-
-    private void initEventAttrs() {
-        eventAttrs = new HashSet<>(Arrays.asList(
-            // See https://www.w3.org/TR/html-markup/global-attributes.html#common.attrs.event-handler
-            "onabort",  "onblur",  "oncanplay",  "oncanplaythrough",
-            "onchange",  "onclick",  "oncontextmenu",  "ondblclick",
-            "ondrag",  "ondragend",  "ondragenter",  "ondragleave",
-            "ondragover",  "ondragstart",  "ondrop",  "ondurationchange",
-            "onemptied",  "onended",  "onerror",  "onfocus",  "oninput",
-            "oninvalid",  "onkeydown",  "onkeypress",  "onkeyup",
-            "onload",  "onloadeddata",  "onloadedmetadata",  "onloadstart",
-            "onmousedown",  "onmousemove",  "onmouseout",  "onmouseover",
-            "onmouseup",  "onmousewheel",  "onpause",  "onplay",
-            "onplaying",  "onprogress",  "onratechange",  "onreadystatechange",
-            "onreset",  "onscroll",  "onseeked",  "onseeking",
-            "onselect",  "onshow",  "onstalled",  "onsubmit",  "onsuspend",
-            "ontimeupdate",  "onvolumechange",  "onwaiting",
-
-            // See https://www.w3.org/TR/html4/sgml/dtd.html
-            // Most of the attributes that take a %Script are also defined as event handlers
-            // in HTML 5. The one exception is onunload.
-            // "onchange",  "onclick",   "ondblclick",  "onfocus",
-            // "onkeydown",  "onkeypress",  "onkeyup",  "onload",
-            // "onmousedown",  "onmousemove",  "onmouseout",  "onmouseover",
-            // "onmouseup",  "onreset",  "onselect",  "onsubmit",
-            "onunload"
-        ));
-    }
-
-    private void initURIAttrs() {
-        uriAttrs = new HashSet<>(Arrays.asList(
-            // See https://www.w3.org/TR/html4/sgml/dtd.html
-            //     https://www.w3.org/TR/html5/
-            // These are all the attributes that take a %URI or a valid URL potentially surrounded
-            // by spaces
-            "action",  "cite",  "classid",  "codebase",  "data",
-            "datasrc",  "for",  "href",  "longdesc",  "profile",
-            "src",  "usemap"
-        ));
-    }
-
-}