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 /**