Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
DefaultJavaScriptEncoder.cs
Go to the documentation of this file.
3
5
7{
9 {
10 internal static readonly EscaperImplementation Singleton = new EscaperImplementation(allowMinimalEscaping: false);
11
12 internal static readonly EscaperImplementation SingletonMinimallyEscaped = new EscaperImplementation(allowMinimalEscaping: true);
13
14 private readonly AsciiByteMap _preescapedMap;
15
16 private EscaperImplementation(bool allowMinimalEscaping)
17 {
24 if (allowMinimalEscaping)
25 {
27 }
28 }
29
30 internal override int EncodeUtf8(Rune value, Span<byte> destination)
31 {
32 if (_preescapedMap.TryLookup(value, out var value2))
33 {
34 if (SpanUtility.IsValidIndex(destination, 1))
35 {
36 destination[0] = 92;
37 destination[1] = value2;
38 return 2;
39 }
40 return -1;
41 }
42 return TryEncodeScalarAsHex(this, value, destination);
43 static int TryEncodeScalarAsHex(object @this, Rune value, Span<byte> destination)
44 {
45 if (value.IsBmp)
46 {
47 if (SpanUtility.IsValidIndex(destination, 5))
48 {
49 destination[0] = 92;
50 destination[1] = 117;
52 System.HexConverter.ToBytesBuffer((byte)((uint)value.Value >> 8), destination, 2);
53 return 6;
54 }
55 }
56 else
57 {
58 UnicodeHelpers.GetUtf16SurrogatePairFromAstralScalarValue((uint)value.Value, out var highSurrogate, out var lowSurrogate);
59 if (SpanUtility.IsValidIndex(destination, 11))
60 {
61 destination[0] = 92;
62 destination[1] = 117;
63 System.HexConverter.ToBytesBuffer((byte)highSurrogate, destination, 4);
64 System.HexConverter.ToBytesBuffer((byte)((uint)highSurrogate >> 8), destination, 2);
65 destination[6] = 92;
66 destination[7] = 117;
67 System.HexConverter.ToBytesBuffer((byte)lowSurrogate, destination, 10);
68 System.HexConverter.ToBytesBuffer((byte)((uint)lowSurrogate >> 8), destination, 8);
69 return 12;
70 }
71 }
72 return -1;
73 }
74 }
75
77 {
78 if (_preescapedMap.TryLookup(value, out var value2))
79 {
80 if (SpanUtility.IsValidIndex(destination, 1))
81 {
82 destination[0] = '\\';
83 destination[1] = (char)value2;
84 return 2;
85 }
86 return -1;
87 }
88 return TryEncodeScalarAsHex(this, value, destination);
89 static int TryEncodeScalarAsHex(object @this, Rune value, Span<char> destination)
90 {
91 if (value.IsBmp)
92 {
93 if (SpanUtility.IsValidIndex(destination, 5))
94 {
95 destination[0] = '\\';
96 destination[1] = 'u';
98 System.HexConverter.ToCharsBuffer((byte)((uint)value.Value >> 8), destination, 2);
99 return 6;
100 }
101 }
102 else
103 {
104 UnicodeHelpers.GetUtf16SurrogatePairFromAstralScalarValue((uint)value.Value, out var highSurrogate, out var lowSurrogate);
105 if (SpanUtility.IsValidIndex(destination, 11))
106 {
107 destination[0] = '\\';
108 destination[1] = 'u';
109 System.HexConverter.ToCharsBuffer((byte)highSurrogate, destination, 4);
110 System.HexConverter.ToCharsBuffer((byte)((uint)highSurrogate >> 8), destination, 2);
111 destination[6] = '\\';
112 destination[7] = 'u';
113 System.HexConverter.ToCharsBuffer((byte)lowSurrogate, destination, 10);
114 System.HexConverter.ToCharsBuffer((byte)((uint)lowSurrogate >> 8), destination, 8);
115 return 12;
116 }
117 }
118 return -1;
119 }
120 }
121 }
122
124
126
128
129 public override int MaxOutputCharactersPerInputCharacter => 6;
130
132 : this(settings, allowMinimalJsonEscaping: false)
133 {
134 }
135
136 private DefaultJavaScriptEncoder(TextEncoderSettings settings, bool allowMinimalJsonEscaping)
137 {
138 if (settings == null)
139 {
140 throw new ArgumentNullException("settings");
141 }
142 OptimizedInboxTextEncoder innerEncoder;
143 if (allowMinimalJsonEscaping)
144 {
146 ref readonly AllowedBmpCodePointsBitmap allowedCodePointsBitmap = ref settings.GetAllowedCodePointsBitmap();
147 Span<char> span = stackalloc char[2] { '"', '\\' };
148 innerEncoder = new OptimizedInboxTextEncoder(singletonMinimallyEscaped, in allowedCodePointsBitmap, forbidHtmlSensitiveCharacters: false, span);
149 }
150 else
151 {
153 ref readonly AllowedBmpCodePointsBitmap allowedCodePointsBitmap2 = ref settings.GetAllowedCodePointsBitmap();
154 Span<char> span = stackalloc char[2] { '\\', '`' };
155 innerEncoder = new OptimizedInboxTextEncoder(singleton, in allowedCodePointsBitmap2, forbidHtmlSensitiveCharacters: true, span);
156 }
157 _innerEncoder = innerEncoder;
158 }
159
160 private protected override OperationStatus EncodeCore(ReadOnlySpan<char> source, Span<char> destination, out int charsConsumed, out int charsWritten, bool isFinalBlock)
161 {
162 return _innerEncoder.Encode(source, destination, out charsConsumed, out charsWritten, isFinalBlock);
163 }
164
165 private protected override OperationStatus EncodeUtf8Core(ReadOnlySpan<byte> utf8Source, Span<byte> utf8Destination, out int bytesConsumed, out int bytesWritten, bool isFinalBlock)
166 {
167 return _innerEncoder.EncodeUtf8(utf8Source, utf8Destination, out bytesConsumed, out bytesWritten, isFinalBlock);
168 }
169
170 private protected override int FindFirstCharacterToEncode(ReadOnlySpan<char> text)
171 {
173 }
174
175 public unsafe override int FindFirstCharacterToEncode(char* text, int textLength)
176 {
178 }
179
181 {
183 }
184
185 public unsafe override bool TryEncodeUnicodeScalar(int unicodeScalar, char* buffer, int bufferLength, out int numberOfCharactersWritten)
186 {
187 return _innerEncoder.TryEncodeUnicodeScalar(unicodeScalar, buffer, bufferLength, out numberOfCharactersWritten);
188 }
189
190 public override bool WillEncode(int unicodeScalar)
191 {
192 return !_innerEncoder.IsScalarValueAllowed(new Rune(unicodeScalar));
193 }
194}
static void ToCharsBuffer(byte value, Span< char > buffer, int startingIndex=0, Casing casing=Casing.Upper)
static void ToBytesBuffer(byte value, Span< byte > buffer, int startingIndex=0, Casing casing=Casing.Upper)
override int FindFirstCharacterToEncodeUtf8(ReadOnlySpan< byte > utf8Text)
override int FindFirstCharacterToEncode(ReadOnlySpan< char > text)
DefaultJavaScriptEncoder(TextEncoderSettings settings, bool allowMinimalJsonEscaping)
override OperationStatus EncodeCore(ReadOnlySpan< char > source, Span< char > destination, out int charsConsumed, out int charsWritten, bool isFinalBlock)
static readonly DefaultJavaScriptEncoder BasicLatinSingleton
unsafe override bool TryEncodeUnicodeScalar(int unicodeScalar, char *buffer, int bufferLength, out int numberOfCharactersWritten)
unsafe override int FindFirstCharacterToEncode(char *text, int textLength)
static readonly DefaultJavaScriptEncoder UnsafeRelaxedEscapingSingleton
override OperationStatus EncodeUtf8Core(ReadOnlySpan< byte > utf8Source, Span< byte > utf8Destination, out int bytesConsumed, out int bytesWritten, bool isFinalBlock)
OperationStatus Encode(ReadOnlySpan< char > source, Span< char > destination, out int charsConsumed, out int charsWritten, bool isFinalBlock)
unsafe bool TryEncodeUnicodeScalar(int unicodeScalar, char *buffer, int bufferLength, out int numberOfCharactersWritten)
unsafe int GetIndexOfFirstByteToEncode(ReadOnlySpan< byte > data)
unsafe int GetIndexOfFirstCharToEncode(ReadOnlySpan< char > data)
unsafe int FindFirstCharacterToEncode(char *text, int textLength)
OperationStatus EncodeUtf8(ReadOnlySpan< byte > source, Span< byte > destination, out int bytesConsumed, out int bytesWritten, bool isFinalBlock)
ref readonly AllowedBmpCodePointsBitmap GetAllowedCodePointsBitmap()
static void GetUtf16SurrogatePairFromAstralScalarValue(uint scalar, out char highSurrogate, out char lowSurrogate)
unsafe void InsertAsciiChar(char key, byte value)
unsafe readonly bool TryLookup(Rune key, out byte value)