make/jdk/src/classes/build/tools/fixuppandoc/Main.java
author erikj
Wed, 22 May 2019 12:13:57 -0700
branchJDK-8224257-branch
changeset 57365 40c87d67e9f2
parent 57363 ac8238552c85
permissions -rw-r--r--
Add specs post processing to Docs.gmk
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
57363
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
     1
package build.tools.fixuppandoc;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
     2
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
     3
import java.io.BufferedReader;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
     4
import java.io.BufferedWriter;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
     5
import java.io.IOException;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
     6
import java.io.InputStreamReader;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
     7
import java.io.OutputStreamWriter;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
     8
import java.io.PrintStream;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
     9
import java.io.PrintWriter;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    10
import java.io.Reader;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    11
import java.io.Writer;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    12
import java.nio.file.Files;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    13
import java.nio.file.Path;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    14
import java.util.ArrayList;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    15
import java.util.LinkedHashMap;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    16
import java.util.LinkedHashSet;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    17
import java.util.List;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    18
import java.util.Locale;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    19
import java.util.Map;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    20
import java.util.Objects;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    21
import java.util.Set;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    22
import java.util.regex.Pattern;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    23
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    24
/**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    25
 * Fixup HTML generated by pandoc.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    26
 *
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    27
 * <h2>{@code <html>}</h2>
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    28
 *
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    29
 * Replace the existing element with {@code <html lang="en">}, removing references to XML.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    30
 *
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    31
 * <h2>{@code <main>}</h2>
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    32
 *
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    33
 * {@code <main>} is inserted if palpable content is found that is not with a
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    34
 * section such as {@code header},  {@code footer},  {@code aside}.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    35
 *
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    36
 * {@code </main>} is inserted if {@code <main>} was inserted and a section
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    37
 * is started that should not be included in the main section.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    38
 *
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    39
 * <h2>Tables: row headings</h2>
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    40
 *
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    41
 * {@code scope="row"} is added to the {@code <td>} elements in the first
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    42
 * column whose cell contents are all different and therefore which can be
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    43
 * used to identify the row. In case of ambiguity, a column containing
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    44
 * a {@code <th>} whose contents begin <em>name</em> is preferred.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    45
 *
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    46
 *
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    47
 * <h2>{@code <meta name="generator">}</h2>
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    48
 *
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    49
 * Update the content string, to indicate it has been processed by this program.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    50
 *
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    51
 */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    52
public class Main {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    53
    /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    54
     * Runs the program.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    55
     *
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    56
     * <pre>
57365
40c87d67e9f2 Add specs post processing to Docs.gmk
erikj
parents: 57363
diff changeset
    57
     *     java build.tools.fixuppandoc.Main [-o output-file] [input-file]
57363
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    58
     * </pre>
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    59
     *
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    60
     * If no input file is specified, the program will read from standard input.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    61
     * If no output file is specified, the program will write to standard output.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    62
     * Any error messages will be written to the standard error stream.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    63
     *
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    64
     * @param args the command-line arguments
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    65
     */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    66
    public static void main(String... args) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    67
        try {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    68
            new Main().run(args);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    69
        } catch (IOException | IllegalArgumentException e) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    70
            System.err.println(e);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    71
            System.exit(1);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    72
        } catch (Throwable t) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    73
            t.printStackTrace(System.err);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    74
            System.exit(1);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    75
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    76
    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    77
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    78
    private void run(String... args) throws IOException {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    79
        Path inFile = null;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    80
        Path outFile = null;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    81
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    82
        for (int i = 0; i < args.length; i++) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    83
            String arg = args[i];
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    84
            if (arg.equals("-o") && i + 1 < args.length) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    85
                outFile = Path.of(args[++i]);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    86
            } else if (arg.startsWith("-")) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    87
                throw new IllegalArgumentException(arg);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    88
            } else if (inFile == null) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    89
                inFile = Path.of(arg);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    90
            } else {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    91
                throw new IllegalArgumentException(arg);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    92
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    93
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    94
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    95
        new Fixup().run(inFile, outFile);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    96
    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    97
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    98
    /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
    99
     * A class to read HTML, copying input to output, modifying
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   100
     * fragments as needed.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   101
     */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   102
    class Fixup extends HtmlParser {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   103
        /** The output stream. */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   104
        PrintWriter out;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   105
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   106
        /** A stream for reporting errors. */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   107
        PrintStream err = System.err;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   108
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   109
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   110
         * Flag to indicate when {@code <main>} is permitted around palpable content.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   111
         * Set within {@code <body>}; disabled within elements in which {@code <main>}
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   112
         * is not permitted.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   113
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   114
        boolean allowMain = false;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   115
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   116
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   117
         * Flag to indicate that {@code <main>} is required.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   118
         * Set on {@code <body>}; reset when {@code <main>} is either found or generated.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   119
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   120
        boolean needMain = false;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   121
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   122
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   123
         * Flag to indicate that {@code </main>} is required.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   124
         * Set if {@code <main>} is generated.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   125
         * Reset when a start or end element is found that requires that {@code </main>}
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   126
         * needs to be generated if necessary.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   127
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   128
        boolean needEndMain = false;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   129
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   130
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   131
         * Handler for {@code <table>} elements.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   132
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   133
        Table table;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   134
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   135
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   136
         * Run the program, copying an input file to an output file.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   137
         * If the input file is {@code null}, input is read from the standard input.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   138
         * If the output file is {@code null}, output is written to the standard output.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   139
         *
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   140
         * @param inFile the input file
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   141
         * @param outFile the output file
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   142
         * @throws IOException if an IO error occurs
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   143
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   144
        void run(Path inFile, Path outFile) throws IOException {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   145
            try (Writer out = openWriter(outFile)) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   146
                this.out = new PrintWriter(out);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   147
                if (inFile != null) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   148
                    read(inFile);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   149
                } else {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   150
                    read(new BufferedReader(new InputStreamReader(System.in)));
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   151
                }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   152
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   153
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   154
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   155
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   156
         * Returns a writer for a file, or for the standard output if the file is {@code null}.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   157
         *
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   158
         * @param file the file
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   159
         * @return the writer
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   160
         * @throws IOException if an IO error occurs
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   161
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   162
        private Writer openWriter(Path file) throws IOException {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   163
            if (file != null) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   164
                return Files.newBufferedWriter(file);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   165
            } else {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   166
                return new BufferedWriter(new OutputStreamWriter(System.out) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   167
                    @Override
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   168
                    public void close() throws IOException {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   169
                        flush();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   170
                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   171
                });
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   172
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   173
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   174
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   175
        @Override
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   176
        protected void error(Path file, int lineNumber, String message) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   177
            err.print(file == null ? "<stdin>" : file);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   178
            if (lineNumber > 0) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   179
                err.print(":");
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   180
                err.print(lineNumber);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   181
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   182
            err.print(": ");
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   183
            err.println(message);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   184
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   185
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   186
        @Override
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   187
        protected void error(Path file, int lineNumber, Throwable t) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   188
            error(file, lineNumber, t.toString());
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   189
            t.printStackTrace(err);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   190
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   191
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   192
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   193
         * The buffer in which input is stored until an appropriate action can be determined.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   194
         * Using the buffer ensures that the output exactly matches the input, except where
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   195
         * it is intentionally modified.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   196
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   197
        private StringBuilder buffer = new StringBuilder();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   198
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   199
        @Override
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   200
        public int nextChar() throws IOException {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   201
            if (ch > 0) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   202
                buffer.append((char) ch);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   203
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   204
            return super.nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   205
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   206
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   207
        @Override
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   208
        protected void doctype(String s) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   209
            flushBuffer();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   210
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   211
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   212
        @Override
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   213
        protected void startElement(String name, Map<String,String> attrs, boolean selfClosing) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   214
            switch (name) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   215
                case "html":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   216
                    // replace the existing <html> fragment
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   217
                    out.write("<html lang=\"en\">");
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   218
                    buffer.setLength(0);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   219
                    break;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   220
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   221
                case "meta":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   222
                    // update the meta-data for the generator
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   223
                    if (Objects.equals(attrs.get("name"), "generator")) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   224
                        out.write(buffer.toString()
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   225
                                .replaceAll("(content=\"[^\"]*)(\")", "$1,fixuphtml$2"));
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   226
                        buffer.setLength(0);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   227
                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   228
                    break;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   229
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   230
                case "article":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   231
                case "aside":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   232
                case "footer":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   233
                case "header":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   234
                case "nav":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   235
                    // starting one of these elements will terminate <main> if one is being
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   236
                    // inserted
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   237
                    if (needEndMain) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   238
                        out.write("</main>");
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   239
                        needEndMain = false;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   240
                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   241
                    // <main> is not permitted within these elements
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   242
                    allowMain = false;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   243
                    break;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   244
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   245
                case "body":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   246
                    // within <body>, <main> is both permitted and required
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   247
                    allowMain = true;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   248
                    needMain = true;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   249
                    break;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   250
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   251
                case "main":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   252
                    // an explicit <main> found in the input; no need to add one
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   253
                    needMain = false;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   254
                    break;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   255
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   256
                case "table":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   257
                    // The entire content of a <table> is buffered, until it can be
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   258
                    // determined in which column of the table contains the cells
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   259
                    // that can be used to identify the row.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   260
                    if (table == null) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   261
                        table = new Table();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   262
                    } else {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   263
                        // tables containing nested tables are not updated
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   264
                        table.simple = false;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   265
                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   266
                    table.nestDepth++;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   267
                    break;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   268
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   269
                case "thead":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   270
                case "tbody":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   271
                    if (table != null) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   272
                        table.endCell();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   273
                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   274
                    break;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   275
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   276
                case "tr":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   277
                    if (table != null) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   278
                        table.endCell();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   279
                        table.nextCellColumnIndex = 0;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   280
                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   281
                    break;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   282
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   283
                case "td":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   284
                case "th":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   285
                    if (table != null) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   286
                        if (attrs.containsKey("rowspan")
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   287
                                || attrs.containsKey("colspan")
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   288
                                || attrs.containsKey("scope")) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   289
                            // tables containing spanning cells and tables that already
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   290
                            // contain scope attributes are not updated
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   291
                            table.simple = false;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   292
                        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   293
                        table.startCell(name);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   294
                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   295
                    break;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   296
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   297
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   298
            // by default, the content is deemed to be palpable content, and so
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   299
            // insert <main> if it is permitted and one is still required,
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   300
            // while also ensuring that it does not appear before <body>
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   301
            if (allowMain && needMain && !name.equals("body")) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   302
                out.write("<main>");
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   303
                needMain = false;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   304
                needEndMain = true;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   305
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   306
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   307
            flushBuffer();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   308
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   309
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   310
        @Override
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   311
        protected void endElement(String name) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   312
            switch (name) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   313
                case "article":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   314
                case "aside":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   315
                case "footer":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   316
                case "header":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   317
                case "nav":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   318
                    // The code does not handle nested elements of these kinds, but could.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   319
                    // So, assuming they are not nested, ending these elements implies
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   320
                    // that <main> is once again permitted.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   321
                    allowMain = true;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   322
                    break;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   323
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   324
                case "body":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   325
                    // The document is nearly done; insert <main> if needed
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   326
                    if (needEndMain) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   327
                        out.write("</main>");
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   328
                        needEndMain = false;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   329
                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   330
                    break;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   331
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   332
                case "table":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   333
                    // if the table is finished, analyze it and write it out
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   334
                    if (table != null) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   335
                        if (--table.nestDepth == 0) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   336
                            table.add(buffer.toString());
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   337
                            table.write(out);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   338
                            table = null;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   339
                            buffer.setLength(0);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   340
                        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   341
                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   342
                    break;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   343
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   344
                case "thead":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   345
                case "tbody":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   346
                case "tr":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   347
                case "td":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   348
                case "th":
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   349
                    // ending any of these elements implicity or explicitly ends the
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   350
                    // current cell
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   351
                    table.endCell();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   352
                    break;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   353
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   354
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   355
            flushBuffer();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   356
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   357
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   358
        @Override
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   359
        protected void content(String content) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   360
            if (table != null) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   361
                table.content(content);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   362
            } else if (allowMain && needMain && !content.isBlank()) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   363
                // insert <main> if required and if we have palpable content
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   364
                out.write("<main>");
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   365
                needMain = false;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   366
                needEndMain = true;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   367
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   368
            flushBuffer();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   369
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   370
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   371
        @Override
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   372
        protected void comment(String comment) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   373
            flushBuffer();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   374
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   375
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   376
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   377
         * Flushes the buffer, either by adding it into a table, if one is
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   378
         * in progress, or by writing it out.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   379
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   380
        private void flushBuffer() {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   381
            String s = buffer.toString();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   382
            if (table != null) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   383
                table.add(s);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   384
            } else {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   385
                out.write(s);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   386
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   387
            buffer.setLength(0);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   388
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   389
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   390
    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   391
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   392
    /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   393
     * Storage for the content of a {@code <table>} element} until we can determine
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   394
     * whether we should add {@code scope="row"} to the cells in a given column,
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   395
     * and if so, which column.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   396
     *
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   397
     * The column with the highest number of unique entries is selected;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   398
     * in case of ambiguity, a column whose heading begins "name" is chosen.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   399
     *
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   400
     * Only "simple" tables are supported. Tables with any of the following
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   401
     * features are not considered "simple" and will not be modified:
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   402
     * <ul>
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   403
     *     <li>Tables containing nested tables</li>
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   404
     *     <li>Tables containing cells that use "rowspan" and "colspan" attributes</li>
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   405
     *     <li>Tables containing cells that already use "scope" attributes</li>
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   406
     * </ul>
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   407
     */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   408
    class Table {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   409
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   410
         * A fragment of HTML in this table.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   411
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   412
        class Entry {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   413
            /** The fragment. */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   414
            final String html;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   415
            /** The column for a {@code <td>} fragment, or -1. */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   416
            final int column;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   417
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   418
            Entry(String html, int column) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   419
                this.html = html;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   420
                this.column = column;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   421
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   422
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   423
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   424
        /** Whether or not this is a "simple" table. */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   425
        boolean simple = true;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   426
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   427
        /** The nesting depth of the current table, within enclosing tables. */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   428
        int nestDepth;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   429
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   430
        /** A list of the HTML fragments that make up this table. */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   431
        List<Entry> entries;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   432
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   433
        /** The plain text contents of each column, used to determine the primary column. */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   434
        List<Set<String>> columnContents;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   435
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   436
        /** The column index of the next cell to be found. */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   437
        int nextCellColumnIndex;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   438
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   439
        /** A flag to mark the start of a {@code <td>} cell. */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   440
        boolean startTDCell;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   441
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   442
        /** The column index of the current cell, or -1 if not in a cell. */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   443
        int currCellColumnIndex;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   444
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   445
        /** The plain text contents of the current column. */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   446
        Set<String> currColumnContents;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   447
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   448
        /** The plain text content of the current cell. */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   449
        StringBuilder currCellContent;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   450
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   451
        /** The kind ({@code th} or {@code td}) of the current cell. */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   452
        String currCellKind;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   453
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   454
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   455
         * The index of the column, if any, containing a heading beginning "name".
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   456
         * This column is given preferential treatment when deciding the primary column.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   457
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   458
        int nameColumn;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   459
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   460
        Table() {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   461
            entries = new ArrayList<>();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   462
            columnContents = new ArrayList<>();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   463
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   464
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   465
        void startCell(String name) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   466
            endCell();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   467
            startTDCell = name.equals("td");
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   468
            currCellColumnIndex = nextCellColumnIndex++;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   469
            currColumnContents = getColumn(currCellColumnIndex);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   470
            currCellContent = new StringBuilder();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   471
            currCellKind = name;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   472
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   473
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   474
        void endCell() {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   475
            if (currCellContent != null) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   476
                String c = currCellContent.toString().trim();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   477
                if (Objects.equals(currCellKind, "th")
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   478
                        && c.toLowerCase(Locale.US).startsWith("name")) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   479
                    nameColumn = currCellColumnIndex;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   480
                }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   481
                currColumnContents.add(c);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   482
                currCellContent = null;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   483
                currCellColumnIndex = -1;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   484
                currColumnContents = null;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   485
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   486
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   487
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   488
        void content(String content) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   489
            if (currCellContent != null) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   490
                currCellContent.append(content);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   491
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   492
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   493
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   494
        void add(String html) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   495
            int index = startTDCell ? currCellColumnIndex : -1;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   496
            entries.add(new Entry(html, index));
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   497
            startTDCell = false;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   498
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   499
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   500
        void write(PrintWriter out) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   501
            int max = -1;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   502
            int maxIndex = -1;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   503
            int index = 0;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   504
            for (Set<String> c : columnContents) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   505
                if (c.size() > max || c.size() == max && index == nameColumn) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   506
                    max = c.size();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   507
                    maxIndex = index;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   508
                }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   509
                index++;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   510
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   511
            for (Entry e : entries) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   512
                if (simple && e.column == maxIndex) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   513
                    out.write(e.html.substring(0, e.html.length() - 1));
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   514
                    out.write(" scope=\"row\">");
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   515
                } else {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   516
                    out.write(e.html);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   517
                }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   518
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   519
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   520
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   521
        private Set<String> getColumn(int index) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   522
            while (columnContents.size() <= index) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   523
                columnContents.add(new LinkedHashSet<>());
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   524
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   525
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   526
            return columnContents.get(index);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   527
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   528
    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   529
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   530
    /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   531
     * A basic HTML parser.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   532
     * Override the protected methods as needed to get notified of significant items
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   533
     * in any file that is read.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   534
     */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   535
    abstract class HtmlParser {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   536
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   537
        private Path file;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   538
        private Reader in;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   539
        protected int ch;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   540
        private int lineNumber;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   541
        private boolean inScript;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   542
        private boolean xml;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   543
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   544
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   545
         * Read a file.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   546
         * @param file the file
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   547
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   548
        void read(Path file) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   549
            try (Reader r = Files.newBufferedReader(file)) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   550
                this.file = file;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   551
                read(r);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   552
            } catch (IOException e) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   553
                error(file, -1, e);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   554
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   555
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   556
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   557
        HtmlParser() { }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   558
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   559
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   560
         * Read a stream.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   561
         * @param r the stream
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   562
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   563
        void read(Reader r) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   564
            try {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   565
                this.in = r;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   566
                StringBuilder content = new StringBuilder();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   567
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   568
                startFile(file);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   569
                try {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   570
                    lineNumber = 1;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   571
                    xml = false;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   572
                    nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   573
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   574
                    while (ch != -1) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   575
                        if (ch == '<') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   576
                            content(content.toString());
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   577
                            content.setLength(0);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   578
                            html();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   579
                        } else {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   580
                            content.append((char) ch);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   581
                            if (ch == '\n') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   582
                                content(content.toString());
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   583
                                content.setLength(0);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   584
                            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   585
                            nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   586
                        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   587
                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   588
                } finally {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   589
                    endFile();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   590
                }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   591
            } catch (IOException e) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   592
                error(file, lineNumber, e);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   593
            } catch (Throwable t) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   594
                error(file, lineNumber, t);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   595
                t.printStackTrace(System.err);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   596
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   597
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   598
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   599
        protected int getLineNumber() {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   600
            return lineNumber;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   601
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   602
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   603
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   604
         * Called when a file has been opened, before parsing begins.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   605
         * This is always the first notification when reading a file.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   606
         * This implementation does nothing.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   607
         *
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   608
         * @param file the file
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   609
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   610
        protected void startFile(Path file) { }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   611
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   612
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   613
         * Called when the parser has finished reading a file.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   614
         * This is always the last notification when reading a file,
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   615
         * unless any errors occur while closing the file.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   616
         * This implementation does nothing.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   617
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   618
        protected void endFile() { }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   619
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   620
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   621
         * Called when a doctype declaration is found, at the beginning of the file.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   622
         * This implementation does nothing.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   623
         * @param s the doctype declaration
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   624
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   625
        protected void doctype(String s) { }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   626
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   627
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   628
         * Called when the opening tag of an HTML element is encountered.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   629
         * This implementation does nothing.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   630
         * @param name the name of the tag
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   631
         * @param attrs the attribute
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   632
         * @param selfClosing whether or not this is a self-closing tag
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   633
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   634
        protected void startElement(String name, Map<String,String> attrs, boolean selfClosing) { }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   635
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   636
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   637
         * Called when the closing tag of an HTML tag is encountered.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   638
         * This implementation does nothing.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   639
         * @param name the name of the tag
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   640
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   641
        protected void endElement(String name) { }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   642
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   643
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   644
         * Called for sequences of character content.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   645
         * @param content the character content
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   646
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   647
        protected void content(String content) { }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   648
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   649
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   650
         * Called for sequences of comment.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   651
         * @param comment the comment
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   652
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   653
        protected void comment(String comment) { }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   654
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   655
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   656
         * Called when an error has been encountered.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   657
         * @param file the file being read
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   658
         * @param lineNumber the line number of line containing the error
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   659
         * @param message a description of the error
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   660
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   661
        protected abstract void error(Path file, int lineNumber, String message);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   662
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   663
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   664
         * Called when an exception has been encountered.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   665
         * @param file the file being read
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   666
         * @param lineNumber the line number of the line being read when the exception was found
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   667
         * @param t the exception
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   668
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   669
        protected abstract void error(Path file, int lineNumber, Throwable t);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   670
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   671
        protected int nextChar() throws IOException {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   672
            ch = in.read();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   673
            if (ch == '\n')
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   674
                lineNumber++;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   675
            return ch;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   676
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   677
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   678
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   679
         * Read the start or end of an HTML tag, or an HTML comment
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   680
         * {@literal <identifier attrs> } or {@literal </identifier> }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   681
         * @throws java.io.IOException if there is a problem reading the file
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   682
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   683
        protected void html() throws IOException {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   684
            nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   685
            if (isIdentifierStart((char) ch)) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   686
                String name = readIdentifier().toLowerCase(Locale.US);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   687
                Map<String,String> attrs = htmlAttrs();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   688
                if (attrs != null) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   689
                    boolean selfClosing = false;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   690
                    if (ch == '/') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   691
                        nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   692
                        selfClosing = true;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   693
                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   694
                    if (ch == '>') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   695
                        nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   696
                        startElement(name, attrs, selfClosing);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   697
                        if (name.equals("script")) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   698
                            inScript = true;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   699
                        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   700
                        return;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   701
                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   702
                }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   703
            } else if (ch == '/') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   704
                nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   705
                if (isIdentifierStart((char) ch)) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   706
                    String name = readIdentifier().toLowerCase(Locale.US);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   707
                    skipWhitespace();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   708
                    if (ch == '>') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   709
                        nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   710
                        endElement(name);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   711
                        if (name.equals("script")) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   712
                            inScript = false;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   713
                        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   714
                        return;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   715
                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   716
                }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   717
            } else if (ch == '!') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   718
                nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   719
                if (ch == '-') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   720
                    nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   721
                    if (ch == '-') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   722
                        nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   723
                        StringBuilder comment = new StringBuilder();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   724
                        while (ch != -1) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   725
                            int dash = 0;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   726
                            while (ch == '-') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   727
                                dash++;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   728
                                comment.append(ch);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   729
                                nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   730
                            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   731
                            // Strictly speaking, a comment should not contain "--"
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   732
                            // so dash > 2 is an error, dash == 2 implies ch == '>'
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   733
                            // See http://www.w3.org/TR/html-markup/syntax.html#syntax-comments
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   734
                            // for more details.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   735
                            if (dash >= 2 && ch == '>') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   736
                                comment.setLength(comment.length() - 2);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   737
                                comment(comment.toString());
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   738
                                nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   739
                                return;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   740
                            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   741
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   742
                            comment.append(ch);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   743
                            nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   744
                        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   745
                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   746
                } else if (ch == '[') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   747
                    nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   748
                    if (ch == 'C') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   749
                        nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   750
                        if (ch == 'D') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   751
                            nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   752
                            if (ch == 'A') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   753
                                nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   754
                                if (ch == 'T') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   755
                                    nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   756
                                    if (ch == 'A') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   757
                                        nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   758
                                        if (ch == '[') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   759
                                            while (true) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   760
                                                nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   761
                                                if (ch == ']') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   762
                                                    nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   763
                                                    if (ch == ']') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   764
                                                        nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   765
                                                        if (ch == '>') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   766
                                                            nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   767
                                                            return;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   768
                                                        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   769
                                                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   770
                                                }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   771
                                            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   772
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   773
                                        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   774
                                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   775
                                }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   776
                            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   777
                        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   778
                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   779
                } else {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   780
                    StringBuilder sb = new StringBuilder();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   781
                    while (ch != -1 && ch != '>') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   782
                        sb.append((char) ch);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   783
                        nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   784
                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   785
                    Pattern p = Pattern.compile("(?is)doctype\\s+html\\s?.*");
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   786
                    String s = sb.toString();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   787
                    if (p.matcher(s).matches()) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   788
                        doctype(s);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   789
                        return;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   790
                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   791
                }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   792
            } else if (ch == '?') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   793
                nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   794
                if (ch == 'x') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   795
                    nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   796
                    if (ch == 'm') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   797
                        nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   798
                        if (ch == 'l') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   799
                            Map<String,String> attrs = htmlAttrs();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   800
                            if (ch == '?') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   801
                                nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   802
                                if (ch == '>') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   803
                                    nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   804
                                    xml = true;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   805
                                    return;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   806
                                }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   807
                            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   808
                        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   809
                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   810
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   811
                }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   812
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   813
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   814
            if (!inScript) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   815
                error(file, lineNumber, "bad html");
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   816
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   817
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   818
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   819
        /**
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   820
         * Read a series of HTML attributes, terminated by {@literal > }.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   821
         * Each attribute is of the form {@literal identifier[=value] }.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   822
         * "value" may be unquoted, single-quoted, or double-quoted.
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   823
         */
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   824
        private Map<String,String> htmlAttrs() throws IOException {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   825
            Map<String, String> map = new LinkedHashMap<>();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   826
            skipWhitespace();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   827
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   828
            while (isIdentifierStart((char) ch)) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   829
                String name = readAttributeName().toLowerCase(Locale.US);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   830
                skipWhitespace();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   831
                String value = null;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   832
                if (ch == '=') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   833
                    nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   834
                    skipWhitespace();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   835
                    if (ch == '\'' || ch == '"') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   836
                        char quote = (char) ch;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   837
                        nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   838
                        StringBuilder sb = new StringBuilder();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   839
                        while (ch != -1 && ch != quote) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   840
                            sb.append((char) ch);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   841
                            nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   842
                        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   843
                        value = sb.toString() // hack to replace common entities
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   844
                                .replace("&lt;", "<")
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   845
                                .replace("&gt;", ">")
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   846
                                .replace("&amp;", "&");
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   847
                        nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   848
                    } else {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   849
                        StringBuilder sb = new StringBuilder();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   850
                        while (ch != -1 && !isUnquotedAttrValueTerminator((char) ch)) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   851
                            sb.append((char) ch);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   852
                            nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   853
                        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   854
                        value = sb.toString();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   855
                    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   856
                    skipWhitespace();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   857
                }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   858
                map.put(name, value);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   859
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   860
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   861
            return map;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   862
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   863
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   864
        private boolean isIdentifierStart(char ch) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   865
            return Character.isUnicodeIdentifierStart(ch);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   866
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   867
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   868
        private String readIdentifier() throws IOException {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   869
            StringBuilder sb = new StringBuilder();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   870
            sb.append((char) ch);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   871
            nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   872
            while (ch != -1 && Character.isUnicodeIdentifierPart(ch)) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   873
                sb.append((char) ch);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   874
                nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   875
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   876
            return sb.toString();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   877
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   878
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   879
        private String readAttributeName() throws IOException {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   880
            StringBuilder sb = new StringBuilder();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   881
            sb.append((char) ch);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   882
            nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   883
            while (ch != -1 && Character.isUnicodeIdentifierPart(ch)
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   884
                    || ch == '-'
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   885
                    || (xml || sb.toString().startsWith("xml")) && ch == ':') {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   886
                sb.append((char) ch);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   887
                nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   888
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   889
            return sb.toString();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   890
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   891
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   892
        private boolean isWhitespace(char ch) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   893
            return Character.isWhitespace(ch);
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   894
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   895
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   896
        private void skipWhitespace() throws IOException {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   897
            while (isWhitespace((char) ch)) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   898
                nextChar();
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   899
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   900
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   901
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   902
        private boolean isUnquotedAttrValueTerminator(char ch) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   903
            switch (ch) {
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   904
                case '\f': case '\n': case '\r': case '\t':
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   905
                case ' ':
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   906
                case '"': case '\'': case '`':
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   907
                case '=': case '<': case '>':
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   908
                    return true;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   909
                default:
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   910
                    return false;
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   911
            }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   912
        }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   913
    }
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   914
ac8238552c85 Add fixuppandoc/Main.java for JDK-8224257
jjg
parents:
diff changeset
   915
}