示例#1
0
        public void ReplacementTest()
        {
            Pattern.IsFriendly = true;
            var source        = "'foobar' AND 'foobaz' OR 'foo' AND 'bar'";
            var delimitedText = DelimitedText.AsSql();

            delimitedText.Replace(source, "/b 'AND' | 'OR' /b; f", slice => slice.Text.Same("AND") ? "OR" : "AND");
            Console.WriteLine(delimitedText);

            source = "'foobar' && 'foobaz' || 'foo' && 'bar'";
            delimitedText.Replace(source, "/b 'AND' | 'OR' /b; f", slice => slice.Text.Same("AND") ? "OR" : "AND");
            Console.WriteLine(delimitedText);

            delimitedText.Replace(source, "'&&' | '||'; f", slice => slice.Text == "&&" ? "||" : "&&");
            Console.WriteLine(delimitedText);

            Console.WriteLine("---");

            delimitedText.Status = DelimitedTextStatus.Inside;
            delimitedText.Replace(source, "/w+; f", slice => slice.Text.ToUpper());
            Console.WriteLine(delimitedText);

            delimitedText.Replace(source, "/w+; f", "?");
            Console.WriteLine(delimitedText);
        }
示例#2
0
        public void BasicDelimitedTextTest()
        {
            var delimitedText = DelimitedText.AsSql();

            delimitedText.ExceptReplacement = "'".Some();
            var source = "SELECT foobar as 'can''t';";

            Console.WriteLine(source);

            foreach (var(text, index, status) in delimitedText.Enumerable(source))
            {
                switch (status)
                {
                case DelimitedTextStatus.Inside:
                    Console.Write("   Inside: ");
                    break;

                case DelimitedTextStatus.Outside:
                    Console.Write("Outside: ");
                    break;

                case DelimitedTextStatus.BeginDelimiter:
                    Console.Write("[");
                    break;

                case DelimitedTextStatus.EndDelimiter:
                    Console.Write("]");
                    break;
                }

                Console.WriteLine($"<<{text}>>@{index}");
            }
        }
示例#3
0
        protected static string[] splitArguments(string arguments)
        {
            var delimitedText = DelimitedText.BothQuotes();
            var destringified = delimitedText.Destringify(arguments.Replace(@"\", @"\\"));

            return(destringified.Split("/s+; f").Select(s => delimitedText.Restringify(s, RestringifyQuotes.None)).ToArray());
        }
示例#4
0
 public Replacer(string source)
 {
     this.source   = source;
     delimitedText = DelimitedText.BothQuotes();
     formatter     = new Formatter();
     macros        = new List <Macro>();
 }
示例#5
0
        public void EmbeddedStringsTest()
        {
            Pattern.IsFriendly = false;
            var source        = "find -P\"^ 'A'\" -F '.'";
            var delimitedText = DelimitedText.BothQuotes();

            foreach (var(text, _, status) in delimitedText.Enumerable(source))
            {
                switch (status)
                {
                case DelimitedTextStatus.Outside:
                    Console.WriteLine($"outside: {text.Guillemetify()}");
                    break;

                case DelimitedTextStatus.Inside:
                    Console.WriteLine($"inside: {text.Guillemetify()}");
                    break;

                case DelimitedTextStatus.BeginDelimiter:
                    Console.WriteLine($"begin delimiter: {text.Guillemetify()}");
                    break;

                case DelimitedTextStatus.EndDelimiter:
                    Console.WriteLine($"end delimiter: {text.Guillemetify()}");
                    break;
                }
            }
        }
示例#6
0
        public override Verb CreateVerb(string[] tokens)
        {
            Color(position, length, Arrays);
            var index   = position + length;
            var matcher = new Matcher();

            if (matcher.IsMatch(source.Substring(index), "-/{)} ')'", false, true))
            {
                var values = matcher[0, 1];
                Color(index, matcher[0].Length, Arrays);
                values = values.Trim();
                Array array;
                if (values.IsEmpty())
                {
                    array = new Array();
                }
                else
                {
                    var destringifier = DelimitedText.BothQuotes();
                    var items         = destringifier.Destringify(values).Split("/s+");
                    for (var i = 0; i < items.Length; i++)
                    {
                        items[i] = destringifier.Restringify(items[i], RestringifyQuotes.None);
                    }

                    array = new Array(items);
                }

                result.Value     = array;
                overridePosition = index + matcher[0].Length;
                return(new PushArrayLiteral(array));
            }

            return(null);
        }
示例#7
0
        public void Transforming2Test()
        {
            Pattern.IsFriendly = false;
            var delimitedText = DelimitedText.AsSql();
            var result        = delimitedText.Transform("'9/1/2020' BETWEEN '1/1/2020' AND '12/31/2020'", "$0 BETWEEN $1 AND $2", "$0 >= $1 AND $0 <= $2");

            Console.WriteLine(result);
        }
示例#8
0
        public void Transforming1Test()
        {
            Pattern.IsFriendly = false;
            var delimitedText = DelimitedText.AsSql();
            var result        = delimitedText.Transform("a BETWEEN 0 AND 100", "$0 BETWEEN $1 AND $2", "$0 >= $1 AND $0 <= $2");

            Console.WriteLine(result);
        }
示例#9
0
        public void UnusualDelimiterTest()
        {
            var delimitedText = new DelimitedText("^ '('; f", "^ ')'; f", @"^ '\)'; f");

            foreach (var(text, _, _) in delimitedText.Enumerable("foo(bar)baz").Where(i => i.status == DelimitedTextStatus.Outside))
            {
                Console.Write(text);
            }
        }
示例#10
0
        public void DestringifyAsSqlTest()
        {
            var source        = "SELECT 'I can''t do this' from foobar --yes you can\r\nprint ''";
            var delimitedText = DelimitedText.AsSql();
            var parsed        = delimitedText.Destringify(source);

            Console.WriteLine(parsed);
            Console.WriteLine(delimitedText.Restringify(parsed, RestringifyQuotes.SingleQuote));
        }
示例#11
0
        public void EnumerationTest()
        {
            var source        = "'foobar' AND 'foobaz' OR 'foo' AND 'bar'";
            var delimitedText = DelimitedText.AsSql();

            foreach (var(index, _) in delimitedText.Substrings(source, "AND"))
            {
                delimitedText[index, 3] = "&&";
            }

            source = delimitedText.ToString();
            delimitedText.Status[DelimitedTextStatus.Outside]        = false;
            delimitedText.Status[DelimitedTextStatus.BeginDelimiter] = true;
            delimitedText.Status[DelimitedTextStatus.EndDelimiter]   = true;

            foreach (var(index, status) in delimitedText.Substrings(source, "'"))
            {
                delimitedText[index, 1] = status switch
                {
                    DelimitedTextStatus.BeginDelimiter => "<<",
                    DelimitedTextStatus.EndDelimiter => ">>",
                    _ => delimitedText[index, 1]
                };
            }

            Console.WriteLine(delimitedText);

            source = delimitedText.ToString();
            delimitedText.BeginPattern = "'<<'; f";
            delimitedText.EndPattern   = ((Pattern)"'>>'; f").Some();
            delimitedText.Status[DelimitedTextStatus.Outside] = true;
            delimitedText.Status[DelimitedTextStatus.Inside]  = true;

            foreach (var(text, index, status) in delimitedText.Matches(source, "'&&' | '<<' | '>>' | 'foo'; f"))
            {
                switch (status)
                {
                case DelimitedTextStatus.Outside:
                    delimitedText[index, text.Length] = "AND";
                    break;

                case DelimitedTextStatus.Inside:
                    delimitedText[index, text.Length] = "???";
                    break;

                case DelimitedTextStatus.BeginDelimiter:
                case DelimitedTextStatus.EndDelimiter:
                    delimitedText[index, text.Length] = "\"";
                    break;
                }
            }

            Console.WriteLine(delimitedText);
        }
示例#12
0
        public void Transforming3Test()
        {
            Pattern.IsFriendly = false;
            var delimitedText = DelimitedText.AsSql();
            var result        = delimitedText.Transform("(111 + 123       - 153) / 3", "($0+$1-$2) / 3", "sum('$0', '$1', '$2') / n('$0', '$1', '$2')");

            Console.WriteLine(result);

            delimitedText.TransformingMap = func <string, string>(s => s.Trim()).Some();
            result = delimitedText.Transform("(111 + 123       - 153) / 3", "($0+$1-$2) / 3", "sum('$0', '$1', '$2') / n('$0', '$1', '$2')");
            Console.WriteLine(result);

            delimitedText.TransformingMap = func <string, string>(s1 => s1.Split("/s* '+' /s*").Select(s2 => s2.Trim().Quotify()).ToString(", ")).Some();
            result = delimitedText.Transform("(111 + 123       + 153) / 3", "($0) / 3", "sum($0) / n($0)");
            Console.WriteLine(result);
        }
示例#13
0
        public void SplitTest()
        {
            Pattern.IsFriendly = false;
            var source        = "'foobar' AND 'foobaz' OR 'foo' AND 'bar'";
            var delimitedText = DelimitedText.AsSql();
            var slices        = delimitedText.Split(source, "/s+ 'OR' /s+; f").ToArray();

            foreach (var slice in slices)
            {
                Console.WriteLine($"<{slice.Text}>");
            }

            var withParentheses = slices.Select(s => $"({s.Text})").ToString(" OR ");

            Console.WriteLine("---");
            Console.WriteLine(withParentheses);
        }
示例#14
0
        public void DestringifyAsSqlTest2()
        {
            Pattern.IsFriendly = false;
            var source        = "UPDATE Foobar SET A = -A, B = 'This is a test' /*a test*/;";
            var delimitedText = DelimitedText.AsSql();
            var parsed        = delimitedText.Destringify(source);

            Console.WriteLine(parsed);
            Console.WriteLine(delimitedText.Restringify(parsed, RestringifyQuotes.SingleQuote));

            var inOutside = new DelimitedText("'", "'", "''");

            foreach (var(text, _, _) in inOutside.Enumerable(source))
            {
                Console.WriteLine($"<{text}>");
            }
        }
示例#15
0
        public void SwapTest()
        {
            Pattern.IsFriendly = false;
            var delimitedText = DelimitedText.AsSql();
            var source        = "'a = b' != 'b = a'";
            var result        = delimitedText.Enumerable(source)
                                .Where(t => t.status == DelimitedTextStatus.Outside && t.text.Contains("="))
                                .ToArray();

            if (result.Length == 1 && result[0].text.FindByRegex("/s+ ['!=<>'] '=' /s+; f").If(out var slice))
            {
                var index  = slice.Index + result[0].index;
                var length = slice.Length;
                Console.Write(source.Drop(index + length));
                Console.Write(source.Drop(index).Keep(length));
                Console.WriteLine(source.Keep(index));
            }
        }
示例#16
0
        public static ObjectGraph FromSingleLine(string singleLine)
        {
            var delimitedText = DelimitedText.BothQuotes();
            var parsed        = delimitedText.Destringify(singleLine);

            var matcher = new Matcher();

            using (var writer = new ObjectGraphWriter())
            {
                foreach (var token in parsed.Split("/s* /(['{};']) /s*"))
                {
                    switch (token)
                    {
                    case "{":
                        writer.Begin();
                        break;

                    case "}":
                        writer.End();
                        break;

                    default:
                        if (matcher.IsMatch(token, REGEX_LINE))
                        {
                            var name  = matcher[0, 1];
                            var type  = matcher[0, 2];
                            var value = matcher[0, 3];
                            value = delimitedText.Restringify(value, RestringifyQuotes.None);
                            writer.Write(name, value, type);
                        }
                        else if (matcher.IsMatch(token, REGEX_GROUP))
                        {
                            var name = matcher[0, 1];
                            var type = matcher[0, 2];
                            writer.Write(name, type: type);
                        }

                        break;
                    }
                }

                return(writer.ToObjectGraph());
            }
        }
示例#17
0
        public void EmptyStringTest()
        {
            Pattern.IsFriendly = false;
            var delimitedText = DelimitedText.AsSql();
            var source        = "'a', '', 'b'";

            foreach (var(text, _, _) in delimitedText.Enumerable(source).Where(t => t.status == DelimitedTextStatus.Inside))
            {
                Console.WriteLine($"<<{text}>>");
            }

            Console.WriteLine("---");

            var strings = delimitedText.StringsOnly(source).Select(t => t.text);

            foreach (var @string in strings)
            {
                Console.WriteLine($"<<{@string}>>");
            }
        }
示例#18
0
        public void SlicerTest()
        {
            Pattern.IsFriendly = false;
            var source        = "'foobar' ELSE-1 'ELSE-1'";
            var delimitedText = DelimitedText.AsSql();

            foreach (var(text, index, _) in delimitedText.Enumerable(source).Where(t => t.status == DelimitedTextStatus.Outside))
            {
                foreach (var(_, sliceIndex, length) in text.FindAllByRegex("/b 'ELSE' ['-+']; f"))
                {
                    var fullIndex = index + sliceIndex;
                    delimitedText[fullIndex, length] = "ELSE -";
                }
            }

            Console.WriteLine(delimitedText);

            delimitedText.Status[DelimitedTextStatus.Inside] = true;
            delimitedText.Replace(source, "/b 'ELSE' ['-+'] /d+; f", "?");
            Console.WriteLine(delimitedText);
        }
示例#19
0
        public void DestringifyingAndRestringifyingTest()
        {
            Pattern.IsFriendly = false;
            var source        = "'a' and 'b' equals 'a' plus 'b'";
            var delimitedText = DelimitedText.AsSql();

            var destringified = delimitedText.Destringify(source);

            Console.WriteLine(destringified);

            foreach (var(index, item) in delimitedText.Strings.IndexedEnumerable())
            {
                Console.WriteLine($"{index}: {item}");
            }

            destringified = destringified.ToUpper();

            Console.WriteLine("---");

            var restringed = delimitedText.Restringify(destringified, RestringifyQuotes.DoubleQuote);

            Console.WriteLine(restringed);
        }
示例#20
0
        public string Invoke(string sourceText)
        {
            var matcher       = new Matcher();
            var delimitedText = DelimitedText.BothQuotes();
            var source        = delimitedText.Destringify(sourceText, true);

            if (matcher.IsMatch(source, pattern))
            {
                for (var i = 0; i < matcher.MatchCount; i++)
                {
                    var arguments = matcher[i, 1].Split("/s* ',' /s*");
                    for (var j = 0; j < arguments.Length; j++)
                    {
                        arguments[j] = delimitedText.Restringify(arguments[j], RestringifyQuotes.None);
                    }

                    matcher[i] = Invoke(arguments);
                }

                return(delimitedText.Restringify(matcher.ToString(), RestringifyQuotes.None));
            }

            return(sourceText);
        }