Terraria v1.4.4.9
Terraria source code documentation
All Classes Namespaces Files Functions Variables Enumerations Enumerator Properties Events Macros
ElementWriter.cs
Go to the documentation of this file.
3
4namespace System.Xml.Linq;
5
6internal struct ElementWriter
7{
8 private readonly XmlWriter _writer;
9
11
13 {
16 }
17
18 public void WriteElement(XElement e)
19 {
21 XNode xNode = e;
22 while (true)
23 {
25 {
27 if (xElement.content == null)
28 {
30 }
31 else
32 {
33 if (!(xElement.content is string text))
34 {
35 xNode = ((XNode)xElement.content).next;
36 continue;
37 }
40 }
41 }
42 else
43 {
44 xNode.WriteTo(_writer);
45 }
46 while (xNode != e && xNode == xNode.parent.content)
47 {
48 xNode = xNode.parent;
50 }
51 if (xNode != e)
52 {
53 xNode = xNode.next;
54 continue;
55 }
56 break;
57 }
58 }
59
61 {
63 XNode i = e;
64 while (true)
65 {
66 if (i is XElement current)
67 {
69 if (current.content == null)
70 {
72 }
73 else
74 {
75 if (!(current.content is string text))
76 {
77 i = ((XNode)current.content).next;
78 continue;
79 }
80 cancellationToken.ThrowIfCancellationRequested();
83 }
84 }
85 else
86 {
87 await i.WriteToAsync(_writer, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
88 }
89 while (i != e && i == i.parent.content)
90 {
91 i = i.parent;
93 }
94 if (i != e)
95 {
96 i = i.next;
97 continue;
98 }
99 break;
100 }
101 }
102
104 {
105 string namespaceName = ns.NamespaceName;
106 if (namespaceName.Length == 0)
107 {
108 return string.Empty;
109 }
111 if (prefixOfNamespace != null)
112 {
113 return prefixOfNamespace;
114 }
115 if ((object)namespaceName == "http://www.w3.org/XML/1998/namespace")
116 {
117 return "xml";
118 }
119 if ((object)namespaceName == "http://www.w3.org/2000/xmlns/")
120 {
121 return "xmlns";
122 }
123 return null;
124 }
125
126 private void PushAncestors(XElement e)
127 {
128 while (true)
129 {
130 e = e.parent as XElement;
131 if (e == null)
132 {
133 break;
134 }
136 if (xAttribute == null)
137 {
138 continue;
139 }
140 do
141 {
143 if (xAttribute.IsNamespaceDeclaration)
144 {
145 _resolver.AddFirst((xAttribute.Name.NamespaceName.Length == 0) ? string.Empty : xAttribute.Name.LocalName, XNamespace.Get(xAttribute.Value));
146 }
147 }
148 while (xAttribute != e.lastAttr);
149 }
150 }
151
152 private void PushElement(XElement e)
153 {
156 if (xAttribute == null)
157 {
158 return;
159 }
160 do
161 {
163 if (xAttribute.IsNamespaceDeclaration)
164 {
165 _resolver.Add((xAttribute.Name.NamespaceName.Length == 0) ? string.Empty : xAttribute.Name.LocalName, XNamespace.Get(xAttribute.Value));
166 }
167 }
168 while (xAttribute != e.lastAttr);
169 }
170
171 private void WriteEndElement()
172 {
175 }
176
183
184 private void WriteFullEndElement()
185 {
188 }
189
196
198 {
199 PushElement(e);
200 XNamespace @namespace = e.Name.Namespace;
201 _writer.WriteStartElement(GetPrefixOfNamespace(@namespace, allowDefaultNamespace: true), e.Name.LocalName, @namespace.NamespaceName);
202 XAttribute xAttribute = e.lastAttr;
203 if (xAttribute != null)
204 {
205 do
206 {
207 xAttribute = xAttribute.next;
208 @namespace = xAttribute.Name.Namespace;
209 string localName = xAttribute.Name.LocalName;
210 string namespaceName = @namespace.NamespaceName;
211 _writer.WriteAttributeString(GetPrefixOfNamespace(@namespace, allowDefaultNamespace: false), localName, (namespaceName.Length == 0 && localName == "xmlns") ? "http://www.w3.org/2000/xmlns/" : namespaceName, xAttribute.Value);
212 }
213 while (xAttribute != e.lastAttr);
214 }
215 }
216
217 private async Task WriteStartElementAsync(XElement e, CancellationToken cancellationToken)
218 {
219 PushElement(e);
220 XNamespace @namespace = e.Name.Namespace;
221 await _writer.WriteStartElementAsync(GetPrefixOfNamespace(@namespace, allowDefaultNamespace: true), e.Name.LocalName, @namespace.NamespaceName).ConfigureAwait(continueOnCapturedContext: false);
222 XAttribute a = e.lastAttr;
223 if (a != null)
224 {
225 do
226 {
227 a = a.next;
228 @namespace = a.Name.Namespace;
229 string localName = a.Name.LocalName;
230 string namespaceName = @namespace.NamespaceName;
231 await _writer.WriteAttributeStringAsync(GetPrefixOfNamespace(@namespace, allowDefaultNamespace: false), localName, (namespaceName.Length == 0 && localName == "xmlns") ? "http://www.w3.org/2000/xmlns/" : namespaceName, a.Value).ConfigureAwait(continueOnCapturedContext: false);
232 }
233 while (a != e.lastAttr);
234 }
235 }
236}
new ConfiguredTaskAwaitable< TResult > ConfigureAwait(bool continueOnCapturedContext)
Definition Task.cs:226
static XNamespace Get(string namespaceName)
Definition XNamespace.cs:51
XContainer parent
Definition XObject.cs:7
void WriteString(string? text)
virtual Task WriteStringAsync(string? text)
Definition XmlWriter.cs:668
virtual Task WriteFullEndElementAsync()
Definition XmlWriter.cs:606
virtual Task WriteEndElementAsync()
Definition XmlWriter.cs:601
async Task WriteFullEndElementAsync(CancellationToken cancellationToken)
readonly XmlWriter _writer
async Task WriteElementAsync(XElement e, CancellationToken cancellationToken)
ElementWriter(XmlWriter writer)
async Task WriteStartElementAsync(XElement e, CancellationToken cancellationToken)
async Task WriteEndElementAsync(CancellationToken cancellationToken)
string GetPrefixOfNamespace(XNamespace ns, bool allowDefaultNamespace)
void WriteStartElement(XElement e)
string GetPrefixOfNamespace(XNamespace ns, bool allowDefaultNamespace)
void AddFirst(string prefix, XNamespace ns)
void Add(string prefix, XNamespace ns)