<PackageReference Include="System.Text.Encodings.Web" Version="8.0.0-preview.4.23259.5" />

DefaultJavaScriptEncoder

using System.Buffers; using System.Text.Unicode; namespace System.Text.Encodings.Web { internal sealed class DefaultJavaScriptEncoder : JavaScriptEncoder { private sealed class EscaperImplementation : ScalarEscaperBase { internal static readonly EscaperImplementation Singleton = new EscaperImplementation(false); internal static readonly EscaperImplementation SingletonMinimallyEscaped = new EscaperImplementation(true); private readonly AsciiByteMap _preescapedMap; private EscaperImplementation(bool allowMinimalEscaping) { _preescapedMap.InsertAsciiChar('\b', 98); _preescapedMap.InsertAsciiChar('\t', 116); _preescapedMap.InsertAsciiChar('\n', 110); _preescapedMap.InsertAsciiChar(' ', 102); _preescapedMap.InsertAsciiChar('\r', 114); _preescapedMap.InsertAsciiChar('\\', 92); if (allowMinimalEscaping) _preescapedMap.InsertAsciiChar('"', 34); } internal override int EncodeUtf8(System.Text.Rune value, Span<byte> destination) { if (_preescapedMap.TryLookup(value, out byte value2)) { if (SpanUtility.IsValidIndex(destination, 1)) { destination[0] = 92; destination[1] = value2; return 2; } return -1; } return <EncodeUtf8>g__TryEncodeScalarAsHex|4_0(this, value, destination); } internal override int EncodeUtf16(System.Text.Rune value, Span<char> destination) { if (_preescapedMap.TryLookup(value, out byte value2)) { if (SpanUtility.IsValidIndex(destination, 1)) { destination[0] = '\\'; destination[1] = (char)value2; return 2; } return -1; } return <EncodeUtf16>g__TryEncodeScalarAsHex|5_0(this, value, destination); } } internal static readonly DefaultJavaScriptEncoder BasicLatinSingleton = new DefaultJavaScriptEncoder(new TextEncoderSettings(UnicodeRanges.BasicLatin)); internal static readonly DefaultJavaScriptEncoder UnsafeRelaxedEscapingSingleton = new DefaultJavaScriptEncoder(new TextEncoderSettings(UnicodeRanges.All), true); private readonly OptimizedInboxTextEncoder _innerEncoder; public override int MaxOutputCharactersPerInputCharacter => 6; internal DefaultJavaScriptEncoder(TextEncoderSettings settings) : this(settings, false) { } private unsafe DefaultJavaScriptEncoder(TextEncoderSettings settings, bool allowMinimalJsonEscaping) { if (settings == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.settings); OptimizedInboxTextEncoder innerEncoder; if (allowMinimalJsonEscaping) { ScalarEscaperBase singletonMinimallyEscaped = EscaperImplementation.SingletonMinimallyEscaped; ref AllowedBmpCodePointsBitmap allowedCodePointsBitmap = ref settings.GetAllowedCodePointsBitmap(); byte* intPtr = stackalloc byte[4]; *(short*)intPtr = 34; *(short*)(intPtr + 2) = 92; Span<char> span = new Span<char>(intPtr, 2); innerEncoder = new OptimizedInboxTextEncoder(singletonMinimallyEscaped, ref allowedCodePointsBitmap, false, span); } else { ScalarEscaperBase singleton = EscaperImplementation.Singleton; ref AllowedBmpCodePointsBitmap allowedCodePointsBitmap2 = ref settings.GetAllowedCodePointsBitmap(); byte* intPtr2 = stackalloc byte[4]; *(short*)intPtr2 = 92; *(short*)(intPtr2 + 2) = 96; Span<char> span = new Span<char>(intPtr2, 2); innerEncoder = new OptimizedInboxTextEncoder(singleton, ref allowedCodePointsBitmap2, true, span); } _innerEncoder = innerEncoder; } private protected override OperationStatus EncodeCore(ReadOnlySpan<char> source, Span<char> destination, out int charsConsumed, out int charsWritten, bool isFinalBlock) { return _innerEncoder.Encode(source, destination, out charsConsumed, out charsWritten, isFinalBlock); } private protected override OperationStatus EncodeUtf8Core(ReadOnlySpan<byte> utf8Source, Span<byte> utf8Destination, out int bytesConsumed, out int bytesWritten, bool isFinalBlock) { return _innerEncoder.EncodeUtf8(utf8Source, utf8Destination, out bytesConsumed, out bytesWritten, isFinalBlock); } private protected override int FindFirstCharacterToEncode(ReadOnlySpan<char> text) { return _innerEncoder.GetIndexOfFirstCharToEncode(text); } public unsafe override int FindFirstCharacterToEncode(char* text, int textLength) { return _innerEncoder.FindFirstCharacterToEncode(text, textLength); } public override int FindFirstCharacterToEncodeUtf8(ReadOnlySpan<byte> utf8Text) { return _innerEncoder.GetIndexOfFirstByteToEncode(utf8Text); } public unsafe override bool TryEncodeUnicodeScalar(int unicodeScalar, char* buffer, int bufferLength, out int numberOfCharactersWritten) { return _innerEncoder.TryEncodeUnicodeScalar(unicodeScalar, buffer, bufferLength, out numberOfCharactersWritten); } public override bool WillEncode(int unicodeScalar) { return !_innerEncoder.IsScalarValueAllowed(new System.Text.Rune(unicodeScalar)); } } }