2004-04-24 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.XML / Mono.Xml.Xsl / XmlWriterEmitter.cs
1 //
2 // XmlWriterEmitter.cs
3 //
4 // Authors:
5 //      Oleg Tkachenko (oleg@tkachenko.com)
6 //      Atsushi Enomoto (atsushi@ximian.com)
7 //      
8 // (C) 2003 Oleg Tkachenko
9 // (C) 2004 Atsushi Enomoto
10 //
11
12 using System;
13 using System.Text;
14 using System.Xml;
15
16 namespace Mono.Xml.Xsl 
17 {
18         /// <summary>
19         /// Emitter, which emits result tree to a XmlWriter.
20         /// </summary>
21         internal class XmlWriterEmitter : Emitter 
22         {
23                 XmlWriter writer;
24                         
25                 public XmlWriterEmitter (XmlWriter writer) {
26                         this.writer = writer;
27                 }
28
29                 #region # Emitter's methods implementaion                       
30                 
31                 public override void WriteStartDocument (Encoding encoding, StandaloneType standalone)
32                 {
33 #if docent
34                         if (standalone == StandaloneType.NONE)
35                                 writer.WriteStartDocument ();
36                         else
37                                 writer.WriteStartDocument (standalone == StandaloneType.YES);
38 #else
39                         string standaloneStr = "";
40                         switch (standalone) {
41                         case StandaloneType.YES:
42                                 standaloneStr = " standalone=\"yes\"";
43                                 break;
44                         case StandaloneType.NO:
45                                 standaloneStr = " standalone=\"no\"";
46                                 break;
47                         }
48
49                         if (encoding == null)
50                                 writer.WriteProcessingInstruction ("xml", "version=\"1.0\"" + standaloneStr);
51                         else
52                                 writer.WriteProcessingInstruction ("xml", 
53                                         "version=\"1.0\" encoding=\"" 
54                                         + encoding.WebName + "\"" 
55                                         + standaloneStr);
56 #endif
57                 }
58                 
59                 public override void WriteEndDocument ()
60                 {
61 #if docent
62                         writer.WriteEndDocument ();
63 #endif
64                 }
65
66                 public override void WriteDocType (string type, string publicId, string systemId)
67                 {
68                         if (publicId != null && publicId != String.Empty &&
69                                 (systemId == null || systemId == String.Empty))
70                                 // This is an error.
71                                 // when PUBLIC id exists, SYSTEM id is required.
72                                 return;
73                         writer.WriteDocType (type, publicId, systemId, null);
74                 }
75
76                 public override void WriteStartElement (string prefix, string localName, string nsURI)
77                 {
78                         writer.WriteStartElement (prefix, localName, nsURI);
79                 }
80
81                 public override void WriteEndElement ()
82                 {
83                         writer.WriteEndElement ();
84                 }
85
86                 public override void WriteFullEndElement ()
87                 {
88                         writer.WriteFullEndElement ();
89                 }
90
91                 public override void WriteAttributeString (string prefix, string localName, string nsURI, string value)
92                 {
93                         writer.WriteAttributeString (prefix, localName, nsURI, value);
94                 }               
95
96                 public override void WriteComment (string text) {
97                         if (text.IndexOf ("--") >= 0)
98                                 text = text.Replace ("--", "- -");
99
100                         if (text.EndsWith ("-"))
101                                 writer.WriteComment (text + ' ');
102                         else
103                                 writer.WriteComment (text);
104                 }
105
106                 public override void WriteProcessingInstruction (string name, string text)
107                 {
108                         writer.WriteProcessingInstruction (name, text);
109                 }
110
111                 public override void WriteString (string text)
112                 {
113                         writer.WriteString (text);
114                 }
115
116                 public override void WriteRaw (string data)
117                 {
118                         writer.WriteRaw (data);
119                 }
120
121                 public override void WriteCDataSection (string text)
122                 {
123                         int index = text.IndexOf ("]]>");
124                         if (index >= 0) {
125                                 writer.WriteCData (text.Substring (0, index + 2));
126                                 WriteCDataSection (text.Substring (index + 2));
127                         } else 
128                                 writer.WriteCData (text);
129                 }
130
131                 public override void WriteWhitespace (string value)
132                 {
133                         writer.WriteWhitespace (value);
134                 }
135
136                 public override void Done ()
137                 {
138                         writer.Flush ();
139                 }
140                 #endregion
141         }
142 }