<PackageReference Include="System.Text.Encodings.Web" Version="9.0.2" />

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 DefaultJavaScriptEncoder(TextEncoderSettings settings, bool allowMinimalJsonEscaping) { if (settings == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.settings); object innerEncoder; if (!allowMinimalJsonEscaping) { EscaperImplementation singleton = EscaperImplementation.Singleton; ref AllowedBmpCodePointsBitmap allowedCodePointsBitmap = ref settings.GetAllowedCodePointsBitmap(); object obj = global::<PrivateImplementationDetails>.7533ADF00A145D285CDFDCD7A63332C731915F01A2A9BB101362BB8D0CF847C4_A1; if (obj == null) { obj = new char[2] { '\\', '`' }; global::<PrivateImplementationDetails>.7533ADF00A145D285CDFDCD7A63332C731915F01A2A9BB101362BB8D0CF847C4_A1 = (char[])obj; } innerEncoder = new OptimizedInboxTextEncoder(singleton, ref allowedCodePointsBitmap, true, new ReadOnlySpan<char>((char[])obj)); } else { EscaperImplementation singletonMinimallyEscaped = EscaperImplementation.SingletonMinimallyEscaped; ref AllowedBmpCodePointsBitmap allowedCodePointsBitmap2 = ref settings.GetAllowedCodePointsBitmap(); object obj2 = global::<PrivateImplementationDetails>.580978A21F179B0480F4AC4BBAA7E699110F4C9E1282B63758A7E9653CA0EDE4_A1; if (obj2 == null) { obj2 = new char[2] { '"', '\\' }; global::<PrivateImplementationDetails>.580978A21F179B0480F4AC4BBAA7E699110F4C9E1282B63758A7E9653CA0EDE4_A1 = (char[])obj2; } innerEncoder = new OptimizedInboxTextEncoder(singletonMinimallyEscaped, ref allowedCodePointsBitmap2, false, new ReadOnlySpan<char>((char[])obj2)); } _innerEncoder = (OptimizedInboxTextEncoder)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)); } } }