santiagopg    2002/06/18 08:12:41

  Modified:    java/src/org/apache/xalan/xsltc/compiler Parser.java
               java/src/org/apache/xalan/xsltc/runtime/output
                        StreamUnknownOutput.java
  Log:
  Added support for XHTML in output system (c.f. embed04).
  
  Revision  Changes    Path
  1.48      +6 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Parser.java
  
  Index: Parser.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Parser.java,v
  retrieving revision 1.47
  retrieving revision 1.48
  diff -u -r1.47 -r1.48
  --- Parser.java       18 Jun 2002 13:04:12 -0000      1.47
  +++ Parser.java       18 Jun 2002 15:12:41 -0000      1.48
  @@ -383,7 +383,11 @@
                stylesheet.setSimplified();
                stylesheet.addElement(element);
                stylesheet.setAttributes(element.getAttributes());
  -             element.addPrefixMapping(EMPTYSTRING, EMPTYSTRING);
  +
  +             // Map the default NS if not already defined
  +             if (element.lookupNamespace(EMPTYSTRING) == null) {
  +                 element.addPrefixMapping(EMPTYSTRING, EMPTYSTRING);
  +             }
            }
            stylesheet.setParser(this);
            return stylesheet;
  
  
  
  1.4       +139 -34   
xml-xalan/java/src/org/apache/xalan/xsltc/runtime/output/StreamUnknownOutput.java
  
  Index: StreamUnknownOutput.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/runtime/output/StreamUnknownOutput.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- StreamUnknownOutput.java  11 Jun 2002 20:11:18 -0000      1.3
  +++ StreamUnknownOutput.java  18 Jun 2002 15:12:41 -0000      1.4
  @@ -63,9 +63,7 @@
   
   package org.apache.xalan.xsltc.runtime.output;
   
  -import java.util.Stack;
  -import java.util.HashSet;
  -import java.util.Iterator;
  +import java.util.ArrayList;
   
   import java.io.Writer;
   import java.io.IOException;
  @@ -80,7 +78,24 @@
   public class StreamUnknownOutput extends StreamOutput {
   
       private StreamOutput _handler;
  -    private boolean      _callStartDocument = false;
  +    private boolean      _callStartDocument  = false;
  +
  +    private boolean      _isHtmlOutput = false;
  +    private boolean      _firstTagOpen  = false;
  +    private boolean      _firstElement = true;
  +    private String       _firstTagPrefix, _firstTag;
  +
  +    private ArrayList    _attributes = null;
  +    private ArrayList    _namespaces = null;
  +
  +    static class Pair {
  +     public String name, value;
  +
  +     public Pair(String name, String value) {
  +         this.name = name;
  +         this.value = value;
  +     }
  +    }
   
       public StreamUnknownOutput(Writer writer, String encoding) {
        super(writer, encoding);
  @@ -96,68 +111,144 @@
   // System.out.println("StreamUnknownOutput.<init>");
       }
   
  -    public void startDocument() throws TransletException { 
  +    public void startDocument() 
  +     throws TransletException 
  +    { 
        _callStartDocument = true;
       }
   
  -    public void endDocument() throws TransletException { 
  -     if (_callStartDocument) {
  +    public void endDocument() 
  +     throws TransletException 
  +    { 
  +     if (_firstTagOpen) {
  +         initStreamOutput();
  +     }
  +     else if (_callStartDocument) {
            _handler.startDocument();
        }
        _handler.endDocument();
       }
   
  -    public void startElement(String elementName) throws TransletException { 
  +    public void startElement(String elementName) 
  +     throws TransletException 
  +    { 
  +// System.out.println("startElement() = " + elementName);
        if (_firstElement) {
  -         // If first element is HTML, create a new handler
  -         if (elementName.equalsIgnoreCase("html")) {
  -             _handler = new StreamHTMLOutput(_handler);
  -         }
  -         if (_callStartDocument) {
  -             _handler.startDocument();
  -             _callStartDocument = false;
  -         }
            _firstElement = false;
  +
  +         _firstTag = elementName;
  +         _firstTagPrefix = BasisLibrary.getPrefix(elementName);
  +         if (_firstTagPrefix == null) {
  +             _firstTagPrefix = EMPTYSTRING;
  +         }
  +
  +         _firstTagOpen = true;
  +         _isHtmlOutput = BasisLibrary.getLocalName(elementName)
  +                                     .equalsIgnoreCase("html");
  +     }
  +     else {
  +         if (_firstTagOpen) {
  +             initStreamOutput();
  +         }
  +         _handler.startElement(elementName);
        }
  -     _handler.startElement(elementName);
       }
   
       public void endElement(String elementName) 
        throws TransletException 
       { 
  +     if (_firstTagOpen) {
  +         initStreamOutput();
  +     }
        _handler.endElement(elementName);
       }
   
       public void characters(String characters) 
        throws TransletException 
       { 
  +     if (_firstTagOpen) {
  +         initStreamOutput();
  +     }
        _handler.characters(characters);
       }
   
       public void characters(char[] characters, int offset, int length)
        throws TransletException 
       { 
  +     if (_firstTagOpen) {
  +         initStreamOutput();
  +     }
        _handler.characters(characters, offset, length);
       }
   
       public void attribute(String name, String value)
        throws TransletException 
       { 
  -     _handler.attribute(name, value);
  +     if (_firstTagOpen) {
  +         if (_attributes == null) {
  +             _attributes = new ArrayList();
  +         }
  +         _attributes.add(new Pair(name, value));
  +     }
  +     else {
  +         _handler.attribute(name, value);
  +     }
  +    }
  +
  +    public void namespace(String prefix, String uri)
  +     throws TransletException 
  +    {
  +// System.out.println("namespace() = " + prefix + " " + uri);
  +     if (_firstTagOpen) {
  +         if (_namespaces == null) {
  +             _namespaces = new ArrayList();
  +         }
  +         _namespaces.add(new Pair(prefix, uri));
  +
  +         // Check if output is XHTML instead of HTML
  +         if (_firstTagPrefix.equals(prefix) && !uri.equals(EMPTYSTRING)) {
  +             _isHtmlOutput = false;
  +         }
  +     }
  +     else {
  +         _handler.namespace(prefix, uri);
  +     }
       }
   
       public void comment(String comment) 
        throws TransletException 
       { 
  +     if (_firstTagOpen) {
  +         initStreamOutput();
  +     }
        _handler.comment(comment);
       }
   
       public void processingInstruction(String target, String data)
        throws TransletException 
       { 
  +     if (_firstTagOpen) {
  +         initStreamOutput();
  +     }
        _handler.processingInstruction(target, data);
       }
   
  +    public void setDoctype(String system, String pub) {
  +     _handler.setDoctype(system, pub);
  +    }
  +
  +    public void setIndent(boolean indent) { 
  +     _handler.setIndent(indent);
  +    }
  +
  +    public void omitHeader(boolean value) {
  +     _handler.omitHeader(value);
  +    }
  +
  +    public void setStandalone(String standalone) {
  +     _handler.setStandalone(standalone);
  +    }
  +
       public boolean setEscaping(boolean escape) 
        throws TransletException 
       { 
  @@ -168,26 +259,40 @@
        _handler.setCdataElements(elements);
       }
   
  -    public void namespace(String prefix, String uri)
  +    private void initStreamOutput() 
        throws TransletException 
       {
  -     _handler.namespace(prefix, uri);
  -    }
  +     // Create a new handler if output is HTML
  +     if (_isHtmlOutput) {
  +         _handler = new StreamHTMLOutput(_handler);
  +     }
  +     if (_callStartDocument) {
  +         _handler.startDocument();
  +         _callStartDocument = false;
  +     }
   
  -    public void setDoctype(String system, String pub) {
  -     _handler.setDoctype(system, pub);
  -    }
  +     // Output first tag
  +     _handler.startElement(_firstTag);
   
  -    public void setIndent(boolean indent) { 
  -     _handler.setIndent(indent);
  -    }
  +     // Output namespaces of first tag
  +     if (_namespaces != null) {
  +         final int n = _namespaces.size();
  +         for (int i = 0; i < n; i++) {
  +             final Pair pair = (Pair) _namespaces.get(i);
  +             _handler.namespace(pair.name, pair.value);
  +         }
  +     }
   
  -    public void omitHeader(boolean value) {
  -     _handler.omitHeader(value);
  -    }
  +     // Output attributes of first tag
  +     if (_attributes != null) {
  +         final int n = _attributes.size();
  +         for (int i = 0; i < n; i++) {
  +             final Pair pair = (Pair) _attributes.get(i);
  +             _handler.attribute(pair.name, pair.value);
  +         }
  +     }
   
  -    public void setStandalone(String standalone) {
  -     _handler.setStandalone(standalone);
  +     // Close first tag
  +     _firstTagOpen = false;
       }
  -
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to