src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java

changeset 1748
051b728cfe90
parent 1747
df4f44800923
child 1750
081d7c72ee92
     1.1 --- a/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java	Tue May 14 10:14:55 2013 -0700
     1.2 +++ b/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java	Tue May 14 10:14:56 2013 -0700
     1.3 @@ -1620,14 +1620,8 @@
     1.4                  if (isFirstSentence) {
     1.5                      text = removeNonInlineHtmlTags(text);
     1.6                  }
     1.7 -                StringTokenizer lines = new StringTokenizer(text, "\r\n", true);
     1.8 -                StringBuilder textBuff = new StringBuilder();
     1.9 -                while (lines.hasMoreTokens()) {
    1.10 -                    StringBuilder line = new StringBuilder(lines.nextToken());
    1.11 -                    Util.replaceTabs(configuration, line);
    1.12 -                    textBuff.append(line.toString());
    1.13 -                }
    1.14 -                result.addContent(new RawHtml(textBuff.toString()));
    1.15 +                text = Util.replaceTabs(configuration, text);
    1.16 +                result.addContent(new RawHtml(text));
    1.17              }
    1.18          }
    1.19          return result;
    1.20 @@ -1732,60 +1726,55 @@
    1.21          return text;
    1.22      }
    1.23  
    1.24 -    public String removeNonInlineHtmlTags(String text) {
    1.25 -        if (text.indexOf('<') < 0) {
    1.26 +    static Set<String> blockTags = new HashSet<>();
    1.27 +    static {
    1.28 +        for (HtmlTag t: HtmlTag.values()) {
    1.29 +            if (t.blockType == HtmlTag.BlockType.BLOCK)
    1.30 +                blockTags.add(t.value);
    1.31 +        }
    1.32 +    }
    1.33 +
    1.34 +    public static String removeNonInlineHtmlTags(String text) {
    1.35 +        final int len = text.length();
    1.36 +
    1.37 +        int startPos = 0;                     // start of text to copy
    1.38 +        int lessThanPos = text.indexOf('<');  // position of latest '<'
    1.39 +        if (lessThanPos < 0) {
    1.40              return text;
    1.41          }
    1.42 -        String noninlinetags[] = { "<ul>", "</ul>", "<ol>", "</ol>",
    1.43 -                "<dl>", "</dl>", "<table>", "</table>",
    1.44 -                "<tr>", "</tr>", "<td>", "</td>",
    1.45 -                "<th>", "</th>", "<p>", "</p>",
    1.46 -                "<li>", "</li>", "<dd>", "</dd>",
    1.47 -                "<dir>", "</dir>", "<dt>", "</dt>",
    1.48 -                "<h1>", "</h1>", "<h2>", "</h2>",
    1.49 -                "<h3>", "</h3>", "<h4>", "</h4>",
    1.50 -                "<h5>", "</h5>", "<h6>", "</h6>",
    1.51 -                "<pre>", "</pre>", "<menu>", "</menu>",
    1.52 -                "<listing>", "</listing>", "<hr>",
    1.53 -                "<blockquote>", "</blockquote>",
    1.54 -                "<center>", "</center>",
    1.55 -                "<UL>", "</UL>", "<OL>", "</OL>",
    1.56 -                "<DL>", "</DL>", "<TABLE>", "</TABLE>",
    1.57 -                "<TR>", "</TR>", "<TD>", "</TD>",
    1.58 -                "<TH>", "</TH>", "<P>", "</P>",
    1.59 -                "<LI>", "</LI>", "<DD>", "</DD>",
    1.60 -                "<DIR>", "</DIR>", "<DT>", "</DT>",
    1.61 -                "<H1>", "</H1>", "<H2>", "</H2>",
    1.62 -                "<H3>", "</H3>", "<H4>", "</H4>",
    1.63 -                "<H5>", "</H5>", "<H6>", "</H6>",
    1.64 -                "<PRE>", "</PRE>", "<MENU>", "</MENU>",
    1.65 -                "<LISTING>", "</LISTING>", "<HR>",
    1.66 -                "<BLOCKQUOTE>", "</BLOCKQUOTE>",
    1.67 -                "<CENTER>", "</CENTER>"
    1.68 -        };
    1.69 -        for (int i = 0; i < noninlinetags.length; i++) {
    1.70 -            text = replace(text, noninlinetags[i], "");
    1.71 +
    1.72 +        StringBuilder result = new StringBuilder();
    1.73 +    main: while (lessThanPos != -1) {
    1.74 +            int currPos = lessThanPos + 1;
    1.75 +            if (currPos == len)
    1.76 +                break;
    1.77 +            char ch = text.charAt(currPos);
    1.78 +            if (ch == '/') {
    1.79 +                if (++currPos == len)
    1.80 +                    break;
    1.81 +                ch = text.charAt(currPos);
    1.82 +            }
    1.83 +            int tagPos = currPos;
    1.84 +            while (isHtmlTagLetterOrDigit(ch)) {
    1.85 +                if (++currPos == len)
    1.86 +                    break main;
    1.87 +                ch = text.charAt(currPos);
    1.88 +            }
    1.89 +            if (ch == '>' && blockTags.contains(text.substring(tagPos, currPos).toLowerCase())) {
    1.90 +                result.append(text, startPos, lessThanPos);
    1.91 +                startPos = currPos + 1;
    1.92 +            }
    1.93 +            lessThanPos = text.indexOf('<', currPos);
    1.94          }
    1.95 -        return text;
    1.96 +        result.append(text.substring(startPos));
    1.97 +
    1.98 +        return result.toString();
    1.99      }
   1.100  
   1.101 -    public String replace(String text, String tobe, String by) {
   1.102 -        while (true) {
   1.103 -            int startindex = text.indexOf(tobe);
   1.104 -            if (startindex < 0) {
   1.105 -                return text;
   1.106 -            }
   1.107 -            int endindex = startindex + tobe.length();
   1.108 -            StringBuilder replaced = new StringBuilder();
   1.109 -            if (startindex > 0) {
   1.110 -                replaced.append(text.substring(0, startindex));
   1.111 -            }
   1.112 -            replaced.append(by);
   1.113 -            if (text.length() > endindex) {
   1.114 -                replaced.append(text.substring(endindex));
   1.115 -            }
   1.116 -            text = replaced.toString();
   1.117 -        }
   1.118 +    private static boolean isHtmlTagLetterOrDigit(char ch) {
   1.119 +        return ('a' <= ch && ch <= 'z') ||
   1.120 +                ('A' <= ch && ch <= 'Z') ||
   1.121 +                ('1' <= ch && ch <= '6');
   1.122      }
   1.123  
   1.124      /**

mercurial