Beispiel #1
0
        string MultilineString(string code)
        {
            var    reader = new StringReader(code);
            string line;

            line = reader.ReadLine().Trim(Spaces);

            if (line.Length < 1 || line[0] != ParenOpen)
            {
                throw new ArgumentException();
            }

            #region Scan options

            string join = "\n";
            bool   ltrim = false, rtrim = true, stripComments = true, percentResolve = true, literalEscape = false;

            if (line.Length > 2)
            {
                if (line.Contains("%"))
                {
                    percentResolve = false;
                    line           = line.Replace("%", string.Empty);
                }
                if (line.Contains("`"))
                {
                    literalEscape = true;
                    line          = line.Replace("`", string.Empty);
                }
                if (line.Contains(","))
                {
                    line = line.Replace(",", string.Empty);
                }

                string[] options = line.Substring(1).Trim().Split(Spaces, StringSplitOptions.RemoveEmptyEntries);
                foreach (var option in options)
                {
                    switch (option.ToUpperInvariant())
                    {
                    case "LTRIM":
                        ltrim = true;
                        break;

                    case "RTRIM":
                        break;

                    case "RTRIM0":
                        rtrim = false;
                        break;

                    case "COMMENTS":
                    case "COMMENT":
                    case "COM":
                    case "C":
                        stripComments = false;
                        break;

                    case "JOIN":
                        join = string.Empty;
                        break;

                    default:
                        const string joinOpt = "join";
                        if (option.Length > joinOpt.Length && option.Substring(0, joinOpt.Length).Equals(joinOpt, StringComparison.OrdinalIgnoreCase))
                        {
                            join = option.Substring(joinOpt.Length).Replace("`s", " ");
                        }
                        else
                        {
                            throw new ParseException(ExMultiStr);
                        }
                        break;
                    }
                }
            }

            #endregion

            #region String

            var    str            = new StringBuilder(code.Length);
            string resolve        = Resolve.ToString();
            string escape         = Escape.ToString();
            string cast           = Multicast.ToString();
            string resolveEscaped = string.Concat(escape, resolve);
            var    escapeEscaped  = new string(Escape, 2);
            string castEscaped    = string.Concat(escape, cast);

            while ((line = reader.ReadLine()) != null)
            {
                string check = line.Trim();
                if (check.Length > 0 && check[0] == ParenClose)
                {
                    break;
                }

                if (ltrim && rtrim)
                {
                    line = line.Trim(Spaces);
                }
                else if (ltrim)
                {
                    line = line.TrimStart(Spaces);
                }
                else if (rtrim)
                {
                    line = line.TrimEnd(Spaces);
                }

                if (stripComments)
                {
                    line = StripComment(line);
                }

                if (!percentResolve)
                {
                    line = line.Replace(resolve, resolveEscaped);
                }

                if (literalEscape)
                {
                    line = line.Replace(escape, escapeEscaped);
                }

                line = line.Replace(cast, castEscaped);

                str.Append(line);
                str.Append(join);
            }

            if (str.Length == 0)
            {
                return(string.Empty);
            }

            str.Remove(str.Length - join.Length, join.Length);

            #endregion

            return(str.ToString());
        }