JavaScriptUtils
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace Newtonsoft.Json.Utilities
{
internal static class JavaScriptUtils
{
private const string EscapedUnicodeText = "!";
internal static readonly bool[] SingleQuoteCharEscapeFlags;
internal static readonly bool[] DoubleQuoteCharEscapeFlags;
internal static readonly bool[] HtmlCharEscapeFlags;
static JavaScriptUtils()
{
SingleQuoteCharEscapeFlags = new bool[128];
DoubleQuoteCharEscapeFlags = new bool[128];
HtmlCharEscapeFlags = new bool[128];
IList<char> list = new List<char> {
'\n',
'\r',
'\t',
'\\',
'',
'\b'
};
for (int i = 0; i < 32; i++) {
list.Add((char)i);
}
foreach (char item in list.Union(new char[1] {
'\''
})) {
SingleQuoteCharEscapeFlags[item] = true;
}
foreach (char item2 in list.Union(new char[1] {
'"'
})) {
DoubleQuoteCharEscapeFlags[item2] = true;
}
foreach (char item3 in list.Union(new char[5] {
'"',
'\'',
'<',
'>',
'&'
})) {
HtmlCharEscapeFlags[item3] = true;
}
}
public static bool[] GetCharEscapeFlags(StringEscapeHandling stringEscapeHandling, char quoteChar)
{
if (stringEscapeHandling == StringEscapeHandling.EscapeHtml)
return HtmlCharEscapeFlags;
if (quoteChar == '"')
return DoubleQuoteCharEscapeFlags;
return SingleQuoteCharEscapeFlags;
}
public static bool ShouldEscapeJavaScriptString(string s, bool[] charEscapeFlags)
{
if (s == null)
return false;
foreach (char c in s) {
if (c >= charEscapeFlags.Length || charEscapeFlags[c])
return true;
}
return false;
}
public static void WriteEscapedJavaScriptString(TextWriter writer, string s, char delimiter, bool appendDelimiters, bool[] charEscapeFlags, StringEscapeHandling stringEscapeHandling, ref char[] writeBuffer)
{
if (appendDelimiters)
writer.Write(delimiter);
if (s != null) {
int num = 0;
for (int i = 0; i < s.Length; i++) {
char c = s[i];
if (c >= charEscapeFlags.Length || charEscapeFlags[c]) {
string text;
switch (c) {
case '\t':
text = "\\t";
break;
case '\n':
text = "\\n";
break;
case '\r':
text = "\\r";
break;
case '':
text = "\\f";
break;
case '\b':
text = "\\b";
break;
case '\\':
text = "\\\\";
break;
case '
':
text = "\\u0085";
break;
case '
':
text = "\\u2028";
break;
case '
':
text = "\\u2029";
break;
default:
if (c < charEscapeFlags.Length || stringEscapeHandling == StringEscapeHandling.EscapeNonAscii) {
if (c == '\'' && stringEscapeHandling != StringEscapeHandling.EscapeHtml)
text = "\\'";
else if (c == '"' && stringEscapeHandling != StringEscapeHandling.EscapeHtml) {
text = "\\\"";
} else {
if (writeBuffer == null)
writeBuffer = new char[6];
StringUtils.ToCharAsUnicode(c, writeBuffer);
text = "!";
}
} else
text = null;
break;
}
if (text != null) {
bool flag = string.Equals(text, "!");
if (i > num) {
int num2 = i - num + (flag ? 6 : 0);
int num3 = flag ? 6 : 0;
if (writeBuffer == null || writeBuffer.Length < num2) {
char[] array = new char[num2];
if (flag)
Array.Copy(writeBuffer, array, 6);
writeBuffer = array;
}
s.CopyTo(num, writeBuffer, num3, num2 - num3);
writer.Write(writeBuffer, num3, num2 - num3);
}
num = i + 1;
if (!flag)
writer.Write(text);
else
writer.Write(writeBuffer, 0, 6);
}
}
}
if (num == 0)
writer.Write(s);
else {
int num4 = s.Length - num;
if (writeBuffer == null || writeBuffer.Length < num4)
writeBuffer = new char[num4];
s.CopyTo(num, writeBuffer, 0, num4);
writer.Write(writeBuffer, 0, num4);
}
}
if (appendDelimiters)
writer.Write(delimiter);
}
public static string ToEscapedJavaScriptString(string value, char delimiter, bool appendDelimiters)
{
return ToEscapedJavaScriptString(value, delimiter, appendDelimiters, StringEscapeHandling.Default);
}
public static string ToEscapedJavaScriptString(string value, char delimiter, bool appendDelimiters, StringEscapeHandling stringEscapeHandling)
{
bool[] charEscapeFlags = GetCharEscapeFlags(stringEscapeHandling, delimiter);
using (StringWriter stringWriter = StringUtils.CreateStringWriter(StringUtils.GetLength(value) ?? 16)) {
char[] writeBuffer = null;
WriteEscapedJavaScriptString(stringWriter, value, delimiter, appendDelimiters, charEscapeFlags, stringEscapeHandling, ref writeBuffer);
return stringWriter.ToString();
}
}
}
}