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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to