Ejemplo n.º 1
0
        /// <summary>
        /// Escape string with backslash sequences (e.g. \r\n -> \\r\\n)
        /// </summary>
        /// <param name="s">String to escape</param>
        /// <param name="stringEscapeOptions">String escape options</param>
        /// <param name="charEscapeOptions">Char escape options</param>
        /// <param name="addQuotes">Add quotes after escaping</param>
        /// <returns>String with escape sequences for string</returns>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="ArgumentException"></exception>
        public static string Escape(string s, StringEscapeOptions stringEscapeOptions = null, CharEscapeOptions charEscapeOptions = null, bool addQuotes = false)
        {
            if (s == null)
            {
                throw new ArgumentNullException(nameof(s));
            }
            if (stringEscapeOptions == null)
            {
                stringEscapeOptions = new StringEscapeOptions();
            }
            if (charEscapeOptions == null)
            {
                charEscapeOptions = new CharEscapeOptions();
            }

            switch (charEscapeOptions.EscapeLanguage)
            {
            case CharEscapeLanguage.CSharp:
                return(EscapeCSharp(s, stringEscapeOptions, charEscapeOptions, addQuotes));

            case CharEscapeLanguage.FSharp:
                return(EscapeFSharp(s, stringEscapeOptions, charEscapeOptions, addQuotes));

            case CharEscapeLanguage.PowerShell:
                return(EscapePowerShell(s, stringEscapeOptions, charEscapeOptions, addQuotes));

            default:
                throw new ArgumentException(string.Format("{0} is not a valid {1}.", charEscapeOptions.EscapeLanguage, nameof(charEscapeOptions.EscapeLanguage)), nameof(charEscapeOptions));
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Escape string with backslash sequences (e.g. \r\n -> `r`n)
        /// </summary>
        /// <param name="s">String to escape</param>
        /// <param name="stringEscapeOptions">String escape options</param>
        /// <param name="charEscapeOptions">Char escape options</param>
        /// <param name="addQuotes">Add quotes after escaping</param>
        /// <returns>String with escape sequences for string</returns>
        /// <exception cref="ArgumentException"></exception>
        private static string EscapePowerShell(string s, StringEscapeOptions stringEscapeOptions, CharEscapeOptions charEscapeOptions, bool addQuotes)
        {
            StringBuilder sb = new StringBuilder(s.Length);

            for (int i = 0; i < s.Length; i++)
            {
                if (stringEscapeOptions.EscapeSurrogatePairs && i + 1 < s.Length && char.IsSurrogatePair(s[i], s[i + 1]))
                {
                    sb.Append(CharUtils.EscapeSurrogatePairPowerShell(s[i], s[++i], charEscapeOptions));
                }
                else
                {
                    switch (stringEscapeOptions.EscapeKind)
                    {
                    case StringEscapeKind.EscapeAll:
                        sb.Append(CharUtils.EscapePowerShell(s[i], charEscapeOptions));
                        break;

                    case StringEscapeKind.EscapeNonAscii:
                        if (s[i].IsPrintAscii() && !s[i].IsBacktick() && !s[i].IsDoubleQuote() && !s[i].IsDollarSign())
                        {
                            sb.Append(s[i]);
                        }
                        else
                        {
                            sb.Append(CharUtils.EscapePowerShell(s[i], charEscapeOptions));
                        }
                        break;

                    default:
                        throw new ArgumentException(string.Format("{0} is not a valid {1}.", stringEscapeOptions.EscapeKind, nameof(stringEscapeOptions.EscapeKind)), nameof(stringEscapeOptions));
                    }
                }
            }

            if (addQuotes)
            {
                sb.Insert(0, '\"');
                sb.Append('\"');
            }
            return(sb.ToString());
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Escape string with backslash sequences (e.g. \r\n -> \\r\\n)
        /// </summary>
        /// <param name="s">String to escape</param>
        /// <param name="stringEscapeOptions">String escape options</param>
        /// <param name="charEscapeOptions"></param>
        /// <param name="addQuotes">Add quotes after escaping</param>
        /// <returns>String with escape sequences for string</returns>
        /// <exception cref="ArgumentException"></exception>
        private static string EscapeCSharp(string s, StringEscapeOptions stringEscapeOptions, CharEscapeOptions charEscapeOptions, bool addQuotes)
        {
            CharEscapeOptions charEscapeOptionsLowerCaseX4 = new CharEscapeOptions(
                escapeLanguage: charEscapeOptions.EscapeLanguage,
                escapeLetter: CharEscapeLetter.LowerCaseX4,
                escapeLetterFallback: charEscapeOptions.EscapeLetterFallback,
                surrogatePairEscapeLetter: charEscapeOptions.SurrogatePairEscapeLetter,
                useLowerCaseHex: charEscapeOptions.UseLowerCaseHex,
                useShortEscape: charEscapeOptions.UseShortEscape
                );

            StringBuilder sb = new StringBuilder(s.Length);

            for (int i = 0; i < s.Length; i++)
            {
                if (stringEscapeOptions.EscapeSurrogatePairs && i + 1 < s.Length && char.IsSurrogatePair(s[i], s[i + 1]))
                {
                    sb.Append(CharUtils.EscapeSurrogatePairCSharp(s[i], s[++i], charEscapeOptions));
                }
                else
                {
                    switch (stringEscapeOptions.EscapeKind)
                    {
                    case StringEscapeKind.EscapeAll:
                        sb.Append(CharUtils.EscapeCSharp(s[i], charEscapeOptions));
                        break;

                    case StringEscapeKind.EscapeNonAscii:
                        if (s[i].IsPrintAscii() && !s[i].IsBackslash() && !s[i].IsDoubleQuote())
                        {
                            sb.Append(s[i]);
                        }
                        else
                        {
                            // pay special attention here because \x is variable length: H, HH, HHH, HHHH
                            // if the next char is hex then we don't want to insert it in any of the 'H' spaces
                            // instead we have to output the full fixed length \xHHHH so the next char doesn't become part of this \x sequence
                            if ((charEscapeOptions.EscapeLetter == CharEscapeLetter.LowerCaseX1 || charEscapeOptions.EscapeLetter == CharEscapeLetter.LowerCaseX2 || charEscapeOptions.EscapeLetter == CharEscapeLetter.LowerCaseX3) && i + 1 < s.Length && s[i + 1].IsHex())
                            {
                                sb.Append(CharUtils.EscapeCSharp(s[i], charEscapeOptionsLowerCaseX4));
                            }
                            else
                            {
                                sb.Append(CharUtils.EscapeCSharp(s[i], charEscapeOptions));
                            }
                        }
                        break;

                    default:
                        throw new ArgumentException(string.Format("{0} is not a valid {1}.", stringEscapeOptions.EscapeKind, nameof(stringEscapeOptions.EscapeKind)), nameof(stringEscapeOptions));
                    }
                }
            }

            if (addQuotes)
            {
                sb.Insert(0, '\"');
                sb.Append('\"');
            }
            return(sb.ToString());
        }