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

changeset 2055
184c0d6698c3
parent 1981
7fb27bc201cc
child 2063
9235ae08a449
     1.1 --- a/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java	Tue Sep 24 13:48:12 2013 -0700
     1.2 +++ b/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java	Tue Sep 24 16:12:06 2013 -0700
     1.3 @@ -28,6 +28,7 @@
     1.4  import java.io.IOException;
     1.5  import java.io.Writer;
     1.6  import java.util.*;
     1.7 +import java.nio.charset.*;
     1.8  
     1.9  import com.sun.tools.doclets.internal.toolkit.Content;
    1.10  import com.sun.tools.doclets.internal.toolkit.util.*;
    1.11 @@ -164,6 +165,46 @@
    1.12      }
    1.13  
    1.14      /**
    1.15 +     * A set of ASCII URI characters to be left unencoded.
    1.16 +     */
    1.17 +    public static BitSet NONENCODING_CHARS = new BitSet(256);
    1.18 +
    1.19 +    static {
    1.20 +        // alphabetic characters
    1.21 +        for (int i = 'a'; i <= 'z'; i++) {
    1.22 +            NONENCODING_CHARS.set(i);
    1.23 +        }
    1.24 +        for (int i = 'A'; i <= 'Z'; i++) {
    1.25 +            NONENCODING_CHARS.set(i);
    1.26 +        }
    1.27 +        // numeric characters
    1.28 +        for (int i = '0'; i <= '9'; i++) {
    1.29 +            NONENCODING_CHARS.set(i);
    1.30 +        }
    1.31 +        // Reserved characters as per RFC 3986. These are set of delimiting characters.
    1.32 +        String noEnc = ":/?#[]@!$&'()*+,;=";
    1.33 +        // Unreserved characters as per RFC 3986 which should not be percent encoded.
    1.34 +        noEnc += "-._~";
    1.35 +        for (int i = 0; i < noEnc.length(); i++) {
    1.36 +            NONENCODING_CHARS.set(noEnc.charAt(i));
    1.37 +        }
    1.38 +    }
    1.39 +
    1.40 +    private static String encodeURL(String url) {
    1.41 +        byte[] urlBytes = url.getBytes(Charset.forName("UTF-8"));
    1.42 +        StringBuilder sb = new StringBuilder();
    1.43 +        for (int i = 0; i < urlBytes.length; i++) {
    1.44 +            int c = urlBytes[i];
    1.45 +            if (NONENCODING_CHARS.get(c & 0xFF)) {
    1.46 +                sb.append((char) c);
    1.47 +            } else {
    1.48 +                sb.append(String.format("%%%02X", c & 0xFF));
    1.49 +            }
    1.50 +        }
    1.51 +        return sb.toString();
    1.52 +    }
    1.53 +
    1.54 +    /**
    1.55       * Generates an HTML anchor tag.
    1.56       *
    1.57       * @param ref reference url for the anchor tag
    1.58 @@ -172,7 +213,7 @@
    1.59       */
    1.60      public static HtmlTree A(String ref, Content body) {
    1.61          HtmlTree htmltree = new HtmlTree(HtmlTag.A, nullCheck(body));
    1.62 -        htmltree.addAttr(HtmlAttr.HREF, ref);
    1.63 +        htmltree.addAttr(HtmlAttr.HREF, encodeURL(ref));
    1.64          return htmltree;
    1.65      }
    1.66  

mercurial