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("&quot;");
  +			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