Ejemplo n.º 1
0
            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);
            }
Ejemplo n.º 2
0
            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);
                }
            }