Ignore SynchronizationAttribute on MT
[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 //
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
20 // 
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
23 // 
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 //
32
33 using System;
34 using System.Text;
35 using System.Xml;
36
37 namespace Mono.Xml.Xsl 
38 {
39         /// <summary>
40         /// Emitter, which emits result tree to a XmlWriter.
41         /// </summary>
42         internal class XmlWriterEmitter : Emitter 
43         {
44                 XmlWriter writer;
45                         
46                 public XmlWriterEmitter (XmlWriter writer) {
47                         this.writer = writer;
48                 }
49
50                 #region # Emitter's methods implementaion
51                 
52                 public override void WriteStartDocument (Encoding encoding, StandaloneType standalone)
53                 {
54 #if docent
55                         if (standalone == StandaloneType.NONE)
56                                 writer.WriteStartDocument ();
57                         else
58                                 writer.WriteStartDocument (standalone == StandaloneType.YES);
59 #else
60                         string standaloneStr = "";
61                         switch (standalone) {
62                         case StandaloneType.YES:
63                                 standaloneStr = " standalone=\"yes\"";
64                                 break;
65                         case StandaloneType.NO:
66                                 standaloneStr = " standalone=\"no\"";
67                                 break;
68                         }
69
70                         if (encoding == null)
71                                 writer.WriteProcessingInstruction ("xml", "version=\"1.0\"" + standaloneStr);
72                         else
73                                 writer.WriteProcessingInstruction ("xml", 
74                                         "version=\"1.0\" encoding=\"" 
75                                         + encoding.WebName + "\"" 
76                                         + standaloneStr);
77 #endif
78                 }
79                 
80                 public override void WriteEndDocument ()
81                 {
82 #if docent
83                         writer.WriteEndDocument ();
84 #endif
85                 }
86
87                 public override void WriteDocType (string type, string publicId, string systemId)
88                 {
89                         if (systemId == null) {
90                                 return;
91                         }
92                         writer.WriteDocType (type, publicId, systemId, null);
93                 }
94
95                 public override void WriteStartElement (string prefix, string localName, string nsURI)
96                 {
97                         writer.WriteStartElement (prefix, localName, nsURI);
98                 }
99
100                 public override void WriteEndElement ()
101                 {
102                         writer.WriteEndElement ();
103                 }
104
105                 public override void WriteFullEndElement ()
106                 {
107                         writer.WriteFullEndElement ();
108                 }
109
110                 public override void WriteAttributeString (string prefix, string localName, string nsURI, string value)
111                 {
112                         writer.WriteAttributeString (prefix, localName, nsURI, value);
113                 }               
114
115                 public override void WriteComment (string text) {
116                         //FIXME: horrible performance!!!
117                         while (text.IndexOf ("--")>=0)
118                                 text = text.Replace ("--", "- -");
119
120                         if ((text.EndsWith("-")))
121                                 text += ' ';
122
123                         writer.WriteComment (text);
124                 }
125
126                 public override void WriteProcessingInstruction (string name, string text)
127                 {
128                         while (text.IndexOf ("?>") >= 0)
129                                 text = text.Replace ("?>", "? >");
130                         writer.WriteProcessingInstruction (name, text);
131                 }
132
133                 public override void WriteString (string text)
134                 {
135                         writer.WriteString (text);
136                 }
137
138                 public override void WriteRaw (string data)
139                 {
140                         writer.WriteRaw (data);
141                 }
142
143                 public override void WriteCDataSection (string text)
144                 {
145                         int index = text.IndexOf ("]]>");
146                         if (index >= 0) {
147                                 writer.WriteCData (text.Substring (0, index + 2));
148                                 WriteCDataSection (text.Substring (index + 2));
149                         } else 
150                                 writer.WriteCData (text);
151                 }
152
153                 public override void WriteWhitespace (string value)
154                 {
155                         writer.WriteWhitespace (value);
156                 }
157
158                 public override void Done ()
159                 {
160                         writer.Flush ();
161                 }
162                 #endregion
163         }
164 }