public static void WriteEscapedJavaScriptString (TextWriter writer, string s, char delimiter, QuoteNameHandling appendDelimitersHandling, bool[] charEscapeFlags, StringEscapeHandling stringEscapeHandling) { // leading delimiter bool appendDelimiters = appendDelimitersHandling == QuoteNameHandling.Quoted || appendDelimitersHandling == QuoteNameHandling.Auto && !IsValidIdentifier(s); if (appendDelimiters) writer.Write(delimiter); if (s != null) { char[] chars = null; char[] unicodeBuffer = null; int lastWritePosition = 0; for (int i = 0; i < s.Length; i++) { var c = s[i]; if (c < charEscapeFlags.Length && !charEscapeFlags[c]) continue; string escapedValue; switch (c) { case '\t': escapedValue = "\\t"; break; case '\n': escapedValue = "\\n"; break; case '\r': escapedValue = "\\r"; break; case '\f': escapedValue = "\\f"; break; case '\b': escapedValue = "\\b"; break; case '\\': escapedValue = "\\\\"; break; case '\u0085': // Next Line escapedValue = "\\u0085"; break; case '\u2028': // Line Separator escapedValue = "\\u2028"; break; case '\u2029': // Paragraph Separator escapedValue = "\\u2029"; break; default: if (c >= charEscapeFlags.Length && stringEscapeHandling != StringEscapeHandling.EscapeNonAscii) escapedValue = null; else if (c == '\'' && stringEscapeHandling != StringEscapeHandling.EscapeHtml) escapedValue = "\\'"; else if (c == '"' && stringEscapeHandling != StringEscapeHandling.EscapeHtml) escapedValue = "\\\""; else { if (unicodeBuffer == null) unicodeBuffer = new char[6]; StringUtils.ToCharAsUnicode(c, unicodeBuffer); // slightly hacky but it saves multiple conditions in if test escapedValue = EscapedUnicodeText; } break; } if (escapedValue == null) continue; if (i > lastWritePosition) { if (chars == null) chars = s.ToCharArray(); // write unchanged chars before writing escaped text writer.Write(chars, lastWritePosition, i - lastWritePosition); } lastWritePosition = i + 1; if (string.Equals(escapedValue, EscapedUnicodeText)) writer.Write(unicodeBuffer); else writer.Write(escapedValue); } if (lastWritePosition == 0) // no escaped text, write entire string writer.Write(s); else { if (chars == null) chars = s.ToCharArray(); // write remaining text writer.Write(chars, lastWritePosition, s.Length - lastWritePosition); } } // trailing delimiter if (appendDelimiters) writer.Write(delimiter); }
public static void WriteEscapedJavaScriptString(TextWriter writer, string s, char delimiter, QuoteNameHandling appendDelimitersHandling, bool[] charEscapeFlags, StringEscapeHandling stringEscapeHandling) { // leading delimiter bool appendDelimiters = appendDelimitersHandling == QuoteNameHandling.Quoted || appendDelimitersHandling == QuoteNameHandling.Auto && !IsValidIdentifier(s); if (appendDelimiters) { writer.Write(delimiter); } if (s != null) { char[] chars = null; char[] unicodeBuffer = null; int lastWritePosition = 0; for (int i = 0; i < s.Length; i++) { var c = s[i]; if (c < charEscapeFlags.Length && !charEscapeFlags[c]) { continue; } string escapedValue; switch (c) { case '\t': escapedValue = "\\t"; break; case '\n': escapedValue = "\\n"; break; case '\r': escapedValue = "\\r"; break; case '\f': escapedValue = "\\f"; break; case '\b': escapedValue = "\\b"; break; case '\\': escapedValue = "\\\\"; break; case '\u0085': // Next Line escapedValue = "\\u0085"; break; case '\u2028': // Line Separator escapedValue = "\\u2028"; break; case '\u2029': // Paragraph Separator escapedValue = "\\u2029"; break; default: if (c >= charEscapeFlags.Length && stringEscapeHandling != StringEscapeHandling.EscapeNonAscii) { escapedValue = null; } else if (c == '\'' && stringEscapeHandling != StringEscapeHandling.EscapeHtml) { escapedValue = "\\'"; } else if (c == '"' && stringEscapeHandling != StringEscapeHandling.EscapeHtml) { escapedValue = "\\\""; } else { if (unicodeBuffer == null) { unicodeBuffer = new char[6]; } StringUtils.ToCharAsUnicode(c, unicodeBuffer); // slightly hacky but it saves multiple conditions in if test escapedValue = EscapedUnicodeText; } break; } if (escapedValue == null) { continue; } if (i > lastWritePosition) { if (chars == null) { chars = s.ToCharArray(); } // write unchanged chars before writing escaped text writer.Write(chars, lastWritePosition, i - lastWritePosition); } lastWritePosition = i + 1; if (string.Equals(escapedValue, EscapedUnicodeText)) { writer.Write(unicodeBuffer); } else { writer.Write(escapedValue); } } if (lastWritePosition == 0) // no escaped text, write entire string { writer.Write(s); } else { if (chars == null) { chars = s.ToCharArray(); } // write remaining text writer.Write(chars, lastWritePosition, s.Length - lastWritePosition); } } // trailing delimiter if (appendDelimiters) { writer.Write(delimiter); } }