Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
HtmlUtf8RawTextWriter.cs
Go to the documentation of this file.
1using System.IO;
2
3namespace System.Xml;
4
6{
8
10
12
13 private bool _endsWithAmpersand;
14
15 private byte[] _uriEscapingBuffer;
16
17 private string _mediaType;
18
20
22
24
26 : base(stream, settings)
27 {
28 Init(settings);
29 }
30
32 {
33 }
34
35 internal override void WriteXmlDeclaration(string xmldecl)
36 {
37 }
38
39 public override void WriteDocType(string name, string pubid, string sysid, string subset)
40 {
41 RawText("<!DOCTYPE ");
42 if (name == "HTML")
43 {
44 RawText("HTML");
45 }
46 else
47 {
48 RawText("html");
49 }
50 if (pubid != null)
51 {
52 RawText(" PUBLIC \"");
54 if (sysid != null)
55 {
56 RawText("\" \"");
58 }
59 _bufBytes[_bufPos++] = 34;
60 }
61 else if (sysid != null)
62 {
63 RawText(" SYSTEM \"");
65 _bufBytes[_bufPos++] = 34;
66 }
67 else
68 {
69 _bufBytes[_bufPos++] = 32;
70 }
71 if (subset != null)
72 {
73 _bufBytes[_bufPos++] = 91;
75 _bufBytes[_bufPos++] = 93;
76 }
77 _bufBytes[_bufPos++] = 62;
78 }
79
80 public override void WriteStartElement(string prefix, string localName, string ns)
81 {
83 if (ns.Length == 0)
84 {
85 _currentElementProperties = (ElementProperties)_elementPropertySearch.FindCaseInsensitiveString(localName);
86 _bufBytes[_bufPos++] = 60;
87 RawText(localName);
89 }
90 else
91 {
93 base.WriteStartElement(prefix, localName, ns);
94 }
95 }
96
97 internal override void StartElementContent()
98 {
99 _bufBytes[_bufPos++] = 62;
102 {
104 }
105 }
106
107 internal override void WriteEndElement(string prefix, string localName, string ns)
108 {
109 if (ns.Length == 0)
110 {
112 {
113 _bufBytes[_bufPos++] = 60;
114 _bufBytes[_bufPos++] = 47;
115 RawText(localName);
116 _bufBytes[_bufPos++] = 62;
117 }
118 }
119 else
120 {
121 base.WriteEndElement(prefix, localName, ns);
122 }
124 }
125
126 internal override void WriteFullEndElement(string prefix, string localName, string ns)
127 {
128 if (ns.Length == 0)
129 {
131 {
132 _bufBytes[_bufPos++] = 60;
133 _bufBytes[_bufPos++] = 47;
134 RawText(localName);
135 _bufBytes[_bufPos++] = 62;
136 }
137 }
138 else
139 {
140 base.WriteFullEndElement(prefix, localName, ns);
141 }
143 }
144
145 public override void WriteStartAttribute(string prefix, string localName, string ns)
146 {
147 if (ns.Length == 0)
148 {
149 if (_attrEndPos == _bufPos)
150 {
151 _bufBytes[_bufPos++] = 32;
152 }
153 RawText(localName);
155 {
156 _currentAttributeProperties = (AttributeProperties)((uint)_attributePropertySearch.FindCaseInsensitiveString(localName) & (uint)_currentElementProperties);
158 {
159 _inAttributeValue = true;
160 return;
161 }
162 }
163 else
164 {
166 }
167 _bufBytes[_bufPos++] = 61;
168 _bufBytes[_bufPos++] = 34;
169 }
170 else
171 {
172 base.WriteStartAttribute(prefix, localName, ns);
174 }
175 _inAttributeValue = true;
176 }
177
178 public override void WriteEndAttribute()
179 {
181 {
183 }
184 else
185 {
187 {
189 _endsWithAmpersand = false;
190 }
191 _bufBytes[_bufPos++] = 34;
192 }
193 _inAttributeValue = false;
195 }
196
197 public override void WriteProcessingInstruction(string target, string text)
198 {
199 _bufBytes[_bufPos++] = 60;
200 _bufBytes[_bufPos++] = 63;
201 RawText(target);
202 _bufBytes[_bufPos++] = 32;
204 _bufBytes[_bufPos++] = 62;
205 if (_bufPos > _bufLen)
206 {
207 FlushBuffer();
208 }
209 }
210
211 public unsafe override void WriteString(string text)
212 {
213 fixed (char* ptr = text)
214 {
215 char* pSrcEnd = ptr + text.Length;
217 {
219 }
220 else
221 {
223 }
224 }
225 }
226
227 public override void WriteEntityRef(string name)
228 {
230 }
231
232 public override void WriteCharEntity(char ch)
233 {
235 }
236
237 public override void WriteSurrogateCharEntity(char lowChar, char highChar)
238 {
240 }
241
242 public unsafe override void WriteChars(char[] buffer, int index, int count)
243 {
244 fixed (char* ptr = &buffer[index])
245 {
247 {
249 }
250 else
251 {
253 }
254 }
255 }
256
270
271 protected void WriteMetaElement()
272 {
273 RawText("<META http-equiv=\"Content-Type\"");
274 if (_mediaType == null)
275 {
276 _mediaType = "text/html";
277 }
278 RawText(" content=\"");
280 RawText("; charset=");
281 RawText(_encoding.WebName);
282 RawText("\">");
283 }
284
285 protected unsafe void WriteHtmlElementTextBlock(char* pSrc, char* pSrcEnd)
286 {
287 if ((_currentElementProperties & ElementProperties.NO_ENTITIES) != 0)
288 {
290 }
291 else
292 {
294 }
295 }
296
297 protected unsafe void WriteHtmlAttributeTextBlock(char* pSrc, char* pSrcEnd)
298 {
300 {
302 {
304 {
306 }
307 else
308 {
310 }
311 }
312 }
313 else if ((_currentElementProperties & ElementProperties.HAS_NS) != 0)
314 {
316 }
317 else
318 {
320 }
321 }
322
323 private unsafe void WriteHtmlAttributeText(char* pSrc, char* pSrcEnd)
324 {
326 {
327 if (pSrcEnd - pSrc > 0 && *pSrc != '{')
328 {
330 }
331 _endsWithAmpersand = false;
332 }
333 fixed (byte* ptr = _bufBytes)
334 {
335 byte* pDst = ptr + _bufPos;
336 char c = '\0';
337 while (true)
338 {
339 byte* ptr2 = pDst + (pSrcEnd - pSrc);
340 if (ptr2 > ptr + _bufLen)
341 {
342 ptr2 = ptr + _bufLen;
343 }
344 while (pDst < ptr2 && XmlCharType.IsAttributeValueChar(c = *pSrc) && c <= '\u007f')
345 {
346 *(pDst++) = (byte)c;
347 pSrc++;
348 }
349 if (pSrc >= pSrcEnd)
350 {
351 break;
352 }
353 if (pDst >= ptr2)
354 {
355 _bufPos = (int)(pDst - ptr);
356 FlushBuffer();
357 pDst = ptr + 1;
358 continue;
359 }
360 switch (c)
361 {
362 case '&':
363 if (pSrc + 1 == pSrcEnd)
364 {
365 _endsWithAmpersand = true;
366 }
367 else if (pSrc[1] != '{')
368 {
370 break;
371 }
372 *(pDst++) = (byte)c;
373 break;
374 case '"':
376 break;
377 case '\t':
378 case '\'':
379 case '<':
380 case '>':
381 *(pDst++) = (byte)c;
382 break;
383 case '\r':
385 break;
386 case '\n':
388 break;
389 default:
391 continue;
392 }
393 pSrc++;
394 }
395 _bufPos = (int)(pDst - ptr);
396 }
397 }
398
399 private unsafe void WriteUriAttributeText(char* pSrc, char* pSrcEnd)
400 {
402 {
403 if (pSrcEnd - pSrc > 0 && *pSrc != '{')
404 {
406 }
407 _endsWithAmpersand = false;
408 }
409 fixed (byte* ptr = _bufBytes)
410 {
411 byte* ptr2 = ptr + _bufPos;
412 char c = '\0';
413 while (true)
414 {
415 byte* ptr3 = ptr2 + (pSrcEnd - pSrc);
416 if (ptr3 > ptr + _bufLen)
417 {
418 ptr3 = ptr + _bufLen;
419 }
420 while (ptr2 < ptr3 && XmlCharType.IsAttributeValueChar(c = *pSrc) && c < '\u0080')
421 {
422 *(ptr2++) = (byte)c;
423 pSrc++;
424 }
425 if (pSrc >= pSrcEnd)
426 {
427 break;
428 }
429 if (ptr2 >= ptr3)
430 {
431 _bufPos = (int)(ptr2 - ptr);
432 FlushBuffer();
433 ptr2 = ptr + 1;
434 continue;
435 }
436 switch (c)
437 {
438 case '&':
439 if (pSrc + 1 == pSrcEnd)
440 {
441 _endsWithAmpersand = true;
442 }
443 else if (pSrc[1] != '{')
444 {
446 break;
447 }
448 *(ptr2++) = (byte)c;
449 break;
450 case '"':
452 break;
453 case '\t':
454 case '\'':
455 case '<':
456 case '>':
457 *(ptr2++) = (byte)c;
458 break;
459 case '\r':
461 break;
462 case '\n':
464 break;
465 default:
467 {
468 byte* ptr5 = ptr4;
469 byte* pDst = ptr5;
471 for (; ptr5 < pDst; ptr5++)
472 {
473 *(ptr2++) = 37;
474 *(ptr2++) = (byte)System.HexConverter.ToCharUpper(*ptr5 >> 4);
475 *(ptr2++) = (byte)System.HexConverter.ToCharUpper(*ptr5);
476 }
477 }
478 continue;
479 }
480 pSrc++;
481 }
482 _bufPos = (int)(ptr2 - ptr);
483 }
484 }
485
486 private void OutputRestAmps()
487 {
488 _bufBytes[_bufPos++] = 97;
489 _bufBytes[_bufPos++] = 109;
490 _bufBytes[_bufPos++] = 112;
491 _bufBytes[_bufPos++] = 59;
492 }
493}
static char ToCharUpper(int value)
static string Xml_InvalidOperation
Definition SR.cs:18
Definition SR.cs:7
void Push(byte data)
Definition ByteStack.cs:21
unsafe void WriteHtmlAttributeTextBlock(char *pSrc, char *pSrcEnd)
void Init(XmlWriterSettings settings)
HtmlUtf8RawTextWriter(Stream stream, XmlWriterSettings settings)
override void WriteStartAttribute(string prefix, string localName, string ns)
unsafe void WriteHtmlElementTextBlock(char *pSrc, char *pSrcEnd)
static TernaryTreeReadOnly _attributePropertySearch
AttributeProperties _currentAttributeProperties
override void WriteDocType(string name, string pubid, string sysid, string subset)
unsafe override void WriteChars(char[] buffer, int index, int count)
static TernaryTreeReadOnly _elementPropertySearch
override void WriteEntityRef(string name)
unsafe void WriteUriAttributeText(char *pSrc, char *pSrcEnd)
override void WriteFullEndElement(string prefix, string localName, string ns)
override void WriteXmlDeclaration(string xmldecl)
unsafe void WriteHtmlAttributeText(char *pSrc, char *pSrcEnd)
override void WriteProcessingInstruction(string target, string text)
unsafe override void WriteString(string text)
override void WriteStartElement(string prefix, string localName, string ns)
override void WriteXmlDeclaration(XmlStandalone standalone)
override void WriteSurrogateCharEntity(char lowChar, char highChar)
override void WriteEndElement(string prefix, string localName, string ns)
static bool IsAttributeValueChar(char ch)
unsafe void EncodeChar(ref char *pSrc, char *pSrcEnd, ref byte *pDst)
static unsafe byte * AmpEntity(byte *pDst)
static unsafe void CharToUTF8(ref char *pSrc, char *pSrcEnd, ref byte *pDst)
static unsafe byte * CarriageReturnEntity(byte *pDst)
unsafe void WriteElementTextBlock(char *pSrc, char *pSrcEnd)
static unsafe byte * QuoteEntity(byte *pDst)
unsafe void WriteCommentOrPi(string text, int stopChar)
unsafe void WriteAttributeTextBlock(char *pSrc, char *pSrcEnd)
static unsafe byte * LineFeedEntity(byte *pDst)