You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by sa...@apache.org on 2002/05/30 19:48:10 UTC
cvs commit: xml-xalan/java/src/org/apache/xalan/xsltc/runtime/output StreamHTMLOutput.java StreamXMLOutput.java
santiagopg 02/05/30 10:48:10
Modified: java/src/org/apache/xalan/xsltc/runtime/output
StreamHTMLOutput.java StreamXMLOutput.java
Log:
Revision Changes Path
1.6 +57 -21 xml-xalan/java/src/org/apache/xalan/xsltc/runtime/output/StreamHTMLOutput.java
Index: StreamHTMLOutput.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/runtime/output/StreamHTMLOutput.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- StreamHTMLOutput.java 29 May 2002 20:00:45 -0000 1.5
+++ StreamHTMLOutput.java 30 May 2002 17:48:10 -0000 1.6
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: StreamHTMLOutput.java,v 1.5 2002/05/29 20:00:45 santiagopg Exp $
+ * @(#)$Id: StreamHTMLOutput.java,v 1.6 2002/05/30 17:48:10 santiagopg Exp $
*
* The Apache Software License, Version 1.1
*
@@ -244,7 +244,7 @@
name.equalsIgnoreCase(SRC_STR) ||
name.equals(CITE_STR))
{
- attr = new Attribute(name, encodeURL(value));
+ attr = new Attribute(name, escapeURL(value));
}
else {
attr = new Attribute(name, escapeNonURL(value));
@@ -314,25 +314,6 @@
}
/**
- * Replaces whitespaces in a URL with '%20'
- */
- private String encodeURL(String base) {
- final int length = base.length();
- final StringBuffer result = new StringBuffer();
-
- for (int i = 0; i < length; i++) {
- final char ch = base.charAt(i);
- if (ch == ' ') {
- result.append("%20");
- }
- else {
- result.append(ch);
- }
- }
- return result.toString();
- }
-
- /**
* Escape non ASCII characters (> u007F) as &#XXX; entities.
*/
private String escapeNonURL(String base) {
@@ -354,6 +335,61 @@
}
}
return result.toString();
+ }
+
+ /**
+ * This method escapes special characters used in HTML attribute values
+ */
+ private String escapeURL(String base) {
+ final char[] chs = base.toCharArray();
+ final StringBuffer result = new StringBuffer();
+
+ final int length = chs.length;
+ for (int i = 0; i < length; i++) {
+ final char ch = chs[i];
+
+ if (ch <= 0x20) {
+ result.append('%').append(makeHHString(ch));
+ }
+ else if (ch > '\u007F') {
+ result.append('%')
+ .append(makeHHString((ch >> 6) | 0xC0))
+ .append('%')
+ .append(makeHHString((ch & 0x3F) | 0x80));
+ }
+ else {
+ // These chars are reserved or unsafe in URLs
+ switch (ch) {
+ case '\u007F' :
+ case '\u007B' :
+ case '\u007D' :
+ case '\u007C' :
+ case '\\' :
+ case '\t' :
+ case '\u005E' :
+ case '\u007E' :
+ case '\u005B' :
+ case '\u005D' :
+ case '\u0060' :
+ case '\u0020' :
+ result.append('%')
+ .append(Integer.toHexString((int) ch));
+ break;
+ case '"':
+ result.append(""");
+ break;
+ default:
+ result.append(ch);
+ break;
+ }
+ }
+ }
+ return result.toString();
+ }
+
+ private String makeHHString(int i) {
+ final String s = Integer.toHexString(i).toUpperCase();
+ return (s.length() == 1) ? "0" + s : s;
}
/**
1.7 +72 -41 xml-xalan/java/src/org/apache/xalan/xsltc/runtime/output/StreamXMLOutput.java
Index: StreamXMLOutput.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/runtime/output/StreamXMLOutput.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- StreamXMLOutput.java 29 May 2002 20:00:45 -0000 1.6
+++ StreamXMLOutput.java 30 May 2002 17:48:10 -0000 1.7
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: StreamXMLOutput.java,v 1.6 2002/05/29 20:00:45 santiagopg Exp $
+ * @(#)$Id: StreamXMLOutput.java,v 1.7 2002/05/30 17:48:10 santiagopg Exp $
*
* The Apache Software License, Version 1.1
*
@@ -191,16 +191,12 @@
// Handle document type declaration (for first element only)
if (_firstElement) {
- if (_doctypeSystem != null || _doctypePublic != null) {
+ if (_doctypeSystem != null) {
appendDTD(elementName);
}
_firstElement = false;
}
- if (_cdata != null && _cdata.containsKey(elementName)) {
- _cdataStack.push(new Integer(_depth));
- }
-
if (_indent) {
indent(_lineFeedNextStartTag);
_lineFeedNextStartTag = true;
@@ -212,6 +208,10 @@
_depth++;
_startTagOpen = true;
+
+ if (_cdata != null && _cdata.containsKey(elementName)) {
+ _cdataStack.push(new Integer(_depth));
+ }
}
public void endElement(String elementName) throws TransletException {
@@ -244,49 +244,43 @@
_indentNextEndTag = true;
}
+ if (((Integer) _cdataStack.peek()).intValue() == _depth) {
+ _cdataStack.pop();
+ }
+
popNamespaces();
_depth--;
}
public void characters(String characters) throws TransletException {
-// System.out.println("characters() '" + characters + "'");
+ characters(characters.toCharArray(), 0, characters.length());
+ }
+
+ public void characters(char[] characters, int offset, int length)
+ throws TransletException
+ {
+// System.out.println("characters() '" + new String(characters, 0, length));
+
+ if (length <= 0) return;
+
if (_startTagOpen) {
closeStartTag();
}
final Integer I = (Integer) _cdataStack.peek();
if (I.intValue() == _depth && !_cdataTagOpen) {
- startCDATA(characters.toCharArray(), 0, characters.length());
+ startCDATA(characters, offset, length);
}
else if (_escaping) {
if (_cdataTagOpen) {
- escapeCDATA(characters.toCharArray(), 0,
- characters.length());
+ escapeCDATA(characters, 0, length);
}
else {
- escapeCharacters(characters.toCharArray(), 0,
- characters.length());
+ escapeCharacters(characters, 0, length);
}
}
else {
- _buffer.append(characters);
- }
- }
-
- public void characters(char[] characters, int offset, int length)
- throws TransletException
- {
- if (length > 0) {
- if (_startTagOpen) {
- closeStartTag();
- }
-
- if (_escaping) {
- escapeCharacters(characters, offset, length);
- }
- else {
- _buffer.append(characters, offset, length);
- }
+ _buffer.append(characters, 0, length);
}
}
@@ -297,7 +291,7 @@
if (_startTagOpen) {
int k;
final Attribute attr =
- new Attribute(patchName(name), value);
+ new Attribute(patchName(name), escapeString(value));
if ((k = _attributes.indexOf(attr)) >= 0) {
_attributes.setElementAt(attr, k);
@@ -380,7 +374,6 @@
_namespaces.put(prefix, stack = new Stack());
}
- // Quit now if the URI the prefix currently maps to is the same as this
if (!stack.empty() && uri.equals(stack.peek())) {
return false;
}
@@ -431,11 +424,11 @@
// Detect any occurence of "]]>" in the character array
for (int i = offset; i < limit - 2; i++) {
- if (ch[i] == ']' && ch[i+1] == ']' && ch[i+2] == '>') {
- _buffer.append(ch, offset, i - offset);
- _buffer.append(CNTCDATA);
+ if (ch[i] == ']' && ch[i + 1] == ']' && ch[i + 2] == '>') {
+ _buffer.append(ch, offset, i - offset)
+ .append(CNTCDATA);
offset = i + 3;
- i = i + 2; // Skip next chars ']' and '>'.
+ i += 2; // Skip next chars ']' and '>'.
}
}
@@ -455,8 +448,8 @@
* Utility method - escape special characters and pass to SAX handler
*/
private void escapeCDATA(char[] ch, int off, int len) {
- int limit = off + len;
int offset = off;
+ int limit = off + len;
if (limit > ch.length) {
limit = ch.length;
@@ -466,12 +459,10 @@
for (int i = off; i < limit; i++) {
final char current = ch[i];
- if ((current >= '\u007F' && current < '\u00A0') ||
- (_is8859Encoded && current > '\u00FF'))
- {
+ if (current > '\u00ff') {
_buffer.append(ch, offset, i - offset)
.append(CDATA_ESC_START)
- .append(Integer.toString((int) ch[i]))
+ .append(Integer.toString((int) current))
.append(CDATA_ESC_END);
offset = i + 1;
}
@@ -480,6 +471,46 @@
if (offset < limit) {
_buffer.append(ch, offset, limit - offset);
}
+ }
+
+ /**
+ * This method escapes special characters used in attribute values
+ */
+ private String escapeString(String value) {
+ final char[] ch = value.toCharArray();
+ final int limit = ch.length;
+ StringBuffer result = new StringBuffer();
+
+ int offset = 0;
+ for (int i = 0; i < limit; i++) {
+ switch (ch[i]) {
+ case '&':
+ result.append(ch, offset, i - offset).append(AMP);
+ offset = i + 1;
+ break;
+ case '"':
+ result.append(ch, offset, i - offset).append(QUOTE);
+ offset = i + 1;
+ break;
+ case '<':
+ result.append(ch, offset, i - offset).append(LT);
+ offset = i + 1;
+ break;
+ case '>':
+ result.append(ch, offset, i - offset).append(GT);
+ offset = i + 1;
+ break;
+ case '\n':
+ result.append(ch, offset, i - offset).append(CRLF);
+ offset = i + 1;
+ break;
+ }
+ }
+
+ if (offset < limit) {
+ result.append(ch, offset, limit - offset);
+ }
+ return result.toString();
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org