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]