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); }
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}"); } }
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()); }
public Replacer(string source) { this.source = source; delimitedText = DelimitedText.BothQuotes(); formatter = new Formatter(); macros = new List <Macro>(); }
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; } } }
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); }
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); }
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); }
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); } }
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)); }
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); }
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); }
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); }
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}>"); } }
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)); } }
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()); } }
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}>>"); } }
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); }
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); }
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); }