sylvain     01/12/28 08:04:08

  Modified:    documentation/stylesheets book2menu.xsl site2xhtml.xsl
               src/org/apache/cocoon/util NetUtils.java
  Log:
  Add RFC1738-conformant encoding to generated URLs so that side-menu images are 
displayed correctly by Netscape 4.x
  
  Revision  Changes    Path
  1.7       +11 -6     xml-cocoon2/documentation/stylesheets/book2menu.xsl
  
  Index: book2menu.xsl
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/documentation/stylesheets/book2menu.xsl,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- book2menu.xsl     2001/10/11 21:00:49     1.6
  +++ book2menu.xsl     2001/12/28 16:04:08     1.7
  @@ -1,6 +1,7 @@
   <?xml version="1.0"?>
   
   <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
  +                xmlns:NetUtils="org.apache.cocoon.util.NetUtils"
                   version="1.0">
   
     <xsl:param name="resource"/>
  @@ -19,12 +20,14 @@
     </xsl:template>
   
     <xsl:template match="menu">
  +     <!-- Encode label to escape any reserved characters such as space -->
  +     <xsl:variable name="encLabel" select="NetUtils:encodePath(@label)"/>
        <tr>
          <td align="left" valign="top">
            <img border="0"
                 height="20"
                 hspace="0"
  -              src="graphics/{@label}-separator.jpg"
  +              src="graphics/{$encLabel}-separator.jpg"
                 vspace="0"
                 width="120"
                 alt="{@label}"/>
  @@ -37,12 +40,13 @@
   
     <xsl:template match="menu-item">
       <xsl:if test="not(@type) or @type!='hidden'">
  +     <xsl:variable name="encLabel" select="NetUtils:encodePath(@label)"/>
        <tr>
         <td align="left" valign="top">
          <xsl:choose>
            <xsl:when test="@href=$resource">
             <img alt="{@label}"
  -               src="graphics/{@label}-label_select.jpg"
  +               src="graphics/{$encLabel}-label_select.jpg"
                  border="0"
                  height="12"
                  width="120"
  @@ -54,14 +58,14 @@
             <a href="{@href}" onMouseOut="rolloverOff('{@label}')"
                               onMouseOver="rolloverOn('{@label}')">
              <img alt="{@label}"
  -                src="graphics/{@label}-label.jpg"
  +                src="graphics/{$encLabel}-label.jpg"
                   border="0"
                   height="12"
                   width="120"
                   name="{@label}"
                   hspace="0"
                   vspace="0"
  -                onLoad="rolloverLoad('{@label}', 
'graphics/{@label}-label_over.jpg', 'graphics/{@label}-label.jpg');"/>
  +                onLoad="rolloverLoad('{@label}', 
'graphics/{$encLabel}-label_over.jpg', 'graphics/{$encLabel}-label.jpg');"/>
            </a>
           </xsl:otherwise>
          </xsl:choose>
  @@ -72,20 +76,21 @@
   
     <xsl:template match="external">
       <xsl:if test="not(@type) or @type!='hidden'">
  +     <xsl:variable name="encLabel" select="NetUtils:encodePath(@label)"/>
        <tr>
        <td align="left" valign="top">
           <a href="{@href}" target="new"
                             onMouseOut="rolloverOff('{@label}')"
                             onMouseOver="rolloverOn('{@label}')">
             <img alt="{@label}"
  -               src="graphics/{@label}-label.jpg"
  +               src="graphics/{$encLabel}-label.jpg"
                  border="0"
                  height="12"
                  hspace="0"
                  name="{@label}"
                  vspace="0"
                  width="120"
  -               onLoad="rolloverLoad('{@label}', 'graphics/{@label}-label_over.jpg', 
'graphics/{@label}-label.jpg');"/>
  +               onLoad="rolloverLoad('{@label}', 
'graphics/{$encLabel}-label_over.jpg', 'graphics/{$encLabel}-label.jpg');"/>
           </a>
        </td>
        </tr>
  
  
  
  1.8       +2 -1      xml-cocoon2/documentation/stylesheets/site2xhtml.xsl
  
  Index: site2xhtml.xsl
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/documentation/stylesheets/site2xhtml.xsl,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- site2xhtml.xsl    2001/10/11 21:00:49     1.7
  +++ site2xhtml.xsl    2001/12/28 16:04:08     1.8
  @@ -2,6 +2,7 @@
   
   <xsl:stylesheet
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
  +    xmlns:URLEncoder="java.net.URLEncoder"
       version="1.0">
   
        <xsl:param name="header"/>
  @@ -31,7 +32,7 @@
             </tr>
             <tr>
               <td width="100%" height="35" valign="top" align="right" colspan="2" 
bgcolor="#0086b2">
  -              <img src="{$header}?label={/site/document/title}" hspace="0" 
vspace="0" border="0" alt="{/site/document/title}" align="right"/>           
  +              <img src="{$header}?label={URLEncoder:encode(/site/document/title)}" 
hspace="0" vspace="0" border="0" alt="{/site/document/title}" align="right"/>          
 
               </td>
             </tr>
             <tr>
  
  
  
  1.10      +114 -1    xml-cocoon2/src/org/apache/cocoon/util/NetUtils.java
  
  Index: NetUtils.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/util/NetUtils.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- NetUtils.java     2001/10/30 09:06:50     1.9
  +++ NetUtils.java     2001/12/28 16:04:08     1.10
  @@ -8,6 +8,11 @@
   
   package org.apache.cocoon.util;
   
  +import java.io.ByteArrayOutputStream;
  +import java.io.IOException;
  +import java.io.OutputStreamWriter;
  +
  +import java.util.BitSet;
   import java.util.Iterator;
   import java.util.Map;
   
  @@ -16,10 +21,118 @@
    * utility methods
    *
    * @author <a href="mailto:[EMAIL PROTECTED]";>Stefano Mazzocchi</a>
  - * @version CVS $Revision: 1.9 $ $Date: 2001/10/30 09:06:50 $
  + * @version CVS $Revision: 1.10 $ $Date: 2001/12/28 16:04:08 $
    */
   
   public class NetUtils {
  +
  +    /**
  +     * Array containing the safe characters set as defined by RFC 1738
  +     */
  +    private static BitSet safeCharacters;
  +
  +
  +    private static final char[] hexadecimal =
  +    {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  +     'A', 'B', 'C', 'D', 'E', 'F'};
  +
  +    static {
  +        safeCharacters = new BitSet(256);
  +        int i;
  +        // 'lowalpha' rule
  +        for (i = 'a'; i <= 'z'; i++) {
  +            safeCharacters.set(i);
  +        }
  +        // 'hialpha' rule
  +        for (i = 'A'; i <= 'Z'; i++) {
  +            safeCharacters.set(i);
  +        }
  +        // 'digit' rule
  +        for (i = '0'; i <= '9'; i++) {
  +            safeCharacters.set(i);
  +        }
  +        
  +        // 'safe' rule
  +        safeCharacters.set('$');
  +        safeCharacters.set('-');
  +        safeCharacters.set('_');
  +        safeCharacters.set('.');
  +        safeCharacters.set('+');
  +        
  +        // 'extra' rule
  +        safeCharacters.set('!');
  +        safeCharacters.set('*');
  +        safeCharacters.set('\'');
  +        safeCharacters.set('(');
  +        safeCharacters.set(')');
  +        safeCharacters.set(',');
  +        
  +        // special characters common to http: file: and ftp: URLs ('fsegment' and 
'hsegment' rules)
  +        safeCharacters.set('/');
  +        safeCharacters.set(':');
  +        safeCharacters.set('@');
  +        safeCharacters.set('&');
  +        safeCharacters.set('=');
  +    }
  +
  +    /**
  +     * Encode a path as required by the URL specificatin (<a 
href="http://www.ietf.org/rfc/rfc1738.txt";>
  +     * RFC 1738</a>). This differs from <code>java.net.URLEncoder.encode()</code> 
which encodes according
  +     * to the <code>x-www-form-urlencoded</code> MIME format.
  +     *
  +     * @param path the path to encode
  +     * @return the encoded path
  +     */
  +    public static String encodePath(String path) {
  +       // stolen from org.apache.catalina.servlets.DefaultServlet ;)
  +
  +        /**
  +         * Note: This code portion is very similar to URLEncoder.encode.
  +         * Unfortunately, there is no way to specify to the URLEncoder which
  +         * characters should be encoded. Here, ' ' should be encoded as "%20"
  +         * and '/' shouldn't be encoded.
  +         */
  +
  +        int maxBytesPerChar = 10;
  +        StringBuffer rewrittenPath = new StringBuffer(path.length());
  +        ByteArrayOutputStream buf = new ByteArrayOutputStream(maxBytesPerChar);
  +        OutputStreamWriter writer = null;
  +        try {
  +            writer = new OutputStreamWriter(buf, "UTF8");
  +        } catch (Exception e) {
  +            e.printStackTrace();
  +            writer = new OutputStreamWriter(buf);
  +        }
  +
  +        for (int i = 0; i < path.length(); i++) {
  +            int c = (int) path.charAt(i);
  +            if (safeCharacters.get(c)) {
  +                rewrittenPath.append((char)c);
  +            } else {
  +                // convert to external encoding before hex conversion
  +                try {
  +                    writer.write(c);
  +                    writer.flush();
  +                } catch(IOException e) {
  +                    buf.reset();
  +                    continue;
  +                }
  +                byte[] ba = buf.toByteArray();
  +                for (int j = 0; j < ba.length; j++) {
  +                    // Converting each byte in the buffer
  +                    byte toEncode = ba[j];
  +                    rewrittenPath.append('%');
  +                    int low = (int) (toEncode & 0x0f);
  +                    int high = (int) ((toEncode & 0xf0) >> 4);
  +                    rewrittenPath.append(hexadecimal[high]);
  +                    rewrittenPath.append(hexadecimal[low]);
  +                }
  +                buf.reset();
  +            }
  +        }
  +
  +        return rewrittenPath.toString();
  +    }
   
       /**
        * Returns the path of the given resource.
  
  
  

----------------------------------------------------------------------
In case of troubles, e-mail:     [EMAIL PROTECTED]
To unsubscribe, e-mail:          [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to