From 4dc5d9895ac0804fbc6d5d8660fe28d4cd4fd617 Mon Sep 17 00:00:00 2001 From: NoobNotFound Date: Sun, 19 Jan 2025 13:38:56 +0530 Subject: [PATCH 1/6] Add SyntaxHighlighter for syntax highlighting Introduced a new `SyntaxHighlighter` class in `SyntaxHighlighter.cs` to handle syntax highlighting for different programming languages. This class includes a dictionary mapping languages to syntax rules, a method to display highlighted code, and a `SyntaxRule` class. Updated `InteractiveMode` and `Program` classes to use `SyntaxHighlighter` for displaying code with syntax highlighting instead of plain text. Added a user prompt to press any key at the end of the `InteractiveMode` method to improve user interaction. --- .../Helpers/SyntaxHighlighter.cs | 307 ++++++++++++++++++ .../InteractiveMode.cs | 7 +- src/Riverside.JsonBinder.Console/Program.cs | 3 +- 3 files changed, 314 insertions(+), 3 deletions(-) create mode 100644 src/Riverside.JsonBinder.Console/Helpers/SyntaxHighlighter.cs diff --git a/src/Riverside.JsonBinder.Console/Helpers/SyntaxHighlighter.cs b/src/Riverside.JsonBinder.Console/Helpers/SyntaxHighlighter.cs new file mode 100644 index 0000000..bef7728 --- /dev/null +++ b/src/Riverside.JsonBinder.Console/Helpers/SyntaxHighlighter.cs @@ -0,0 +1,307 @@ +using System.Text.RegularExpressions; + +namespace Riverside.JsonBinder.Console.Helpers; + +public class SyntaxHighlighter +{ + private static readonly Dictionary> SyntaxRulesByLanguage = new() + { + { + SerializableLanguage.CSharp, new List + { + // Core keywords + new(@"\b(abstract|as|base|break|case|catch|checked|class|const|continue|default|delegate|do|else|enum|event|explicit|extern|finally|fixed|for|foreach|goto|if|implicit|in|interface|internal|is|lock|namespace|new|operator|out|override|params|private|protected|public|readonly|ref|return|sealed|sizeof|stackalloc|static|switch|this|throw|try|typeof|unchecked|unsafe|using|virtual|volatile|while|get|set)\b", ConsoleColor.Magenta), + + // Types + new(@"\b(bool|byte|char|decimal|double|float|int|long|object|sbyte|short|string|uint|ulong|ushort|void|var)\b", ConsoleColor.DarkCyan), + + // Type definitions (classes, interfaces, etc.) + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + + // Properties and methods + new(@"\b[a-z][a-zA-Z0-9_]*(?=\s*[{<])", ConsoleColor.Yellow), + + // Generic type parameters + new(@"<[^>]+>", ConsoleColor.DarkYellow), + + // Numbers + new(@"\b\d+\b", ConsoleColor.Green), + + // Strings + new(@"""[^""\\]*(?:\\.[^""\\]*)*""", ConsoleColor.DarkGreen), + } + }, + { + SerializableLanguage.Python, new List + { + // Keywords + new(@"\b(and|as|assert|async|await|break|class|continue|def|del|elif|else|except|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|raise|return|try|while|with|yield)\b", ConsoleColor.Magenta), + + // Built-in types and values + new(@"\b(True|False|None|bool|int|float|str|list|dict|set|tuple)\b", ConsoleColor.DarkCyan), + + // Class names + new(@"(?<=\bclass\s+)\w+", ConsoleColor.Cyan), + + // Function definitions + new(@"(?<=\bdef\s+)\w+", ConsoleColor.Yellow), + + // Decorators + new(@"@\w+", ConsoleColor.DarkYellow), + + // Numbers + new(@"\b\d+\b", ConsoleColor.Green), + + // Strings + new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'", ConsoleColor.DarkGreen), + } + }, + { + SerializableLanguage.JavaScript, new List + { + // Keywords + new(@"\b(async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|export|extends|finally|for|function|if|import|in|instanceof|let|new|of|return|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b", ConsoleColor.Magenta), + + // Built-in objects and types + new(@"\b(Array|Boolean|Date|Error|Function|JSON|Math|Number|Object|RegExp|String|Promise|Map|Set|Symbol|BigInt)\b", ConsoleColor.DarkCyan), + + // Class names and custom types + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + + // Function declarations + new(@"(?<=\bfunction\s+)\w+", ConsoleColor.Yellow), + + // Arrow functions + new(@"=>\s*{", ConsoleColor.DarkYellow), + + // Numbers + new(@"\b\d+(\.\d+)?\b", ConsoleColor.Green), + + // Strings + new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'|`[^`\\]*(?:\\.[^`\\]*)*`", ConsoleColor.DarkGreen), + } + }, + { + SerializableLanguage.TypeScript, new List + { + // TypeScript-specific keywords + new(@"\b(abstract|as|asserts|async|await|break|case|catch|class|const|continue|debugger|declare|default|delete|do|else|enum|export|extends|finally|for|from|function|if|implements|import|in|infer|instanceof|interface|is|keyof|let|module|namespace|new|null|of|return|super|switch|this|throw|try|type|typeof|undefined|unique|unknown|var|void|while|with|yield)\b", ConsoleColor.Magenta), + + // Types and type operators + new(@"\b(any|boolean|number|string|symbol|never|object|bigint|readonly|private|protected|public|static)\b", ConsoleColor.DarkCyan), + + // Classes and interfaces + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + + // Generics + new(@"<[^>]+>", ConsoleColor.Yellow), + + // Decorators + new(@"@\w+", ConsoleColor.DarkYellow), + + // Numbers + new(@"\b\d+(\.\d+)?\b", ConsoleColor.Green), + + // Strings + new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'|`[^`\\]*(?:\\.[^`\\]*)*`", ConsoleColor.DarkGreen), + } + }, + { + SerializableLanguage.Java, new List + { + // Keywords + new(@"\b(abstract|assert|break|case|catch|class|const|continue|default|do|else|enum|extends|final|finally|for|if|implements|import|instanceof|interface|native|new|package|private|protected|public|return|static|strictfp|super|switch|synchronized|this|throw|throws|transient|try|volatile|while)\b", ConsoleColor.Magenta), + + // Types + new(@"\b(boolean|byte|char|double|float|int|long|short|void|var)\b", ConsoleColor.DarkCyan), + + // Class names and custom types + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + + // Method declarations + new(@"(?<=\b\w+\s+)\w+(?=\s*\()", ConsoleColor.Yellow), + + // Generics + new(@"<[^>]+>", ConsoleColor.DarkYellow), + + // Annotations + new(@"@\w+", ConsoleColor.DarkYellow), + + // Numbers + new(@"\b\d+(\.\d+)?[dDfFlL]?\b", ConsoleColor.Green), + + // Strings + new(@"""[^""\\]*(?:\\.[^""\\]*)*""", ConsoleColor.DarkGreen), + } + }, + { + SerializableLanguage.PHP, new List + { + // Keywords + new(@"\b(abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|yield|yield from)\b", ConsoleColor.Magenta), + + // Types and type hints + new(@"\b(bool|boolean|int|integer|float|double|string|array|object|callable|iterable|void|null|mixed|never|true|false)\b", ConsoleColor.DarkCyan), + + // Class names and namespaces + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + + // Function declarations + new(@"(?<=\bfunction\s+)\w+", ConsoleColor.Yellow), + + // Variables + new(@"\$\w+", ConsoleColor.DarkYellow), + + // Numbers + new(@"\b\d+(\.\d+)?\b", ConsoleColor.Green), + + // Strings + new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'", ConsoleColor.DarkGreen), + } + }, + { + SerializableLanguage.Ruby, new List + { + // Keywords + new(@"\b(alias|and|begin|break|case|class|def|defined\?|do|else|elsif|end|ensure|false|for|if|in|module|next|nil|not|or|redo|rescue|retry|return|self|super|then|true|undef|unless|until|when|while|yield)\b", ConsoleColor.Magenta), + + // Built-in classes and modules + new(@"\b(Array|Hash|String|Integer|Float|Symbol|Range|Regexp|Time|File|Dir|Class|Module|Enumerable|Comparable|Kernel|Process|Thread)\b", ConsoleColor.DarkCyan), + + // Class and module names + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + + // Method declarations + new(@"(?<=\bdef\s+)\w+", ConsoleColor.Yellow), + + // Symbols + new(@":\w+", ConsoleColor.DarkYellow), + + // Instance variables + new(@"@{1,2}\w+", ConsoleColor.DarkYellow), + + // Numbers + new(@"\b\d+(\.\d+)?(e[+-]?\d+)?\b", ConsoleColor.Green), + + // Strings + new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'|%[qQ]?\{[^}]*\}|%[qQ]?\[[^\]]*\]|%[qQ]?\([^)]*\)|%[qQ]?<[^>]*>", ConsoleColor.DarkGreen), + } + }, + { + SerializableLanguage.Swift, new List + { + // Keywords + new(@"\b(associatedtype|class|deinit|enum|extension|fileprivate|func|import|init|inout|internal|let|open|operator|private|precedencegroup|protocol|public|rethrows|static|struct|subscript|typealias|var|break|case|continue|default|defer|do|else|fallthrough|for|guard|if|in|repeat|return|switch|where|while|as|Any|catch|false|is|nil|super|self|Self|throw|throws|true|try)\b", ConsoleColor.Magenta), + + // Types + new(@"\b(Int|Double|Float|Bool|String|Character|Optional|Array|Dictionary|Set|Result|Error)\b", ConsoleColor.DarkCyan), + + // Type names and protocols + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + + // Function declarations + new(@"(?<=\bfunc\s+)\w+", ConsoleColor.Yellow), + + // Property wrappers and attributes + new(@"@\w+", ConsoleColor.DarkYellow), + + // Generics + new(@"<[^>]+>", ConsoleColor.DarkYellow), + + // Numbers + new(@"\b\d+(\.\d+)?([eE][+-]?\d+)?\b", ConsoleColor.Green), + + // Strings + new(@"""[^""\\]*(?:\\.[^""\\]*)*""", ConsoleColor.DarkGreen), + } + } + }; + + + + public void DisplayCodeWithColors(string code, SerializableLanguage language) + { + if (!SyntaxRulesByLanguage.ContainsKey(language)) + { + System.Console.WriteLine(code); + return; + } + + var rules = SyntaxRulesByLanguage[language]; + var spans = new List<(int start, int end, ConsoleColor color)>(); + + // Collect all matches + foreach (var rule in rules) + { + var matches = Regex.Matches(code, rule.Pattern, RegexOptions.Compiled); + foreach (Match match in matches) + { + spans.Add((match.Index, match.Index + match.Length, rule.Color)); + } + } + + // Sort spans by start position and handle overlaps + spans.Sort((a, b) => a.start.CompareTo(b.start)); + var mergedSpans = new List<(int start, int end, ConsoleColor color)>(); + + for (int i = 0; i < spans.Count; i++) + { + var current = spans[i]; + bool overlap = false; + + // Check if this span overlaps with any previous span + for (int j = 0; j < mergedSpans.Count; j++) + { + if (current.start < mergedSpans[j].end && current.end > mergedSpans[j].start) + { + overlap = true; + break; + } + } + + if (!overlap) + { + mergedSpans.Add(current); + } + } + + // Print with colors + int currentPos = 0; + foreach (var span in mergedSpans) + { + // Print text before the colored span + if (currentPos < span.start) + { + System.Console.ResetColor(); + System.Console.Write(code.Substring(currentPos, span.start - currentPos)); + } + + // Print the colored span + System.Console.ForegroundColor = span.color; + System.Console.Write(code.Substring(span.start, span.end - span.start)); + currentPos = span.end; + } + + // Print any remaining text + if (currentPos < code.Length) + { + System.Console.ResetColor(); + System.Console.Write(code.Substring(currentPos)); + } + + System.Console.ResetColor(); + System.Console.WriteLine(); + } +} + +public class SyntaxRule +{ + public string Pattern { get; } + public ConsoleColor Color { get; } + + public SyntaxRule(string pattern, ConsoleColor color) + { + Pattern = pattern; + Color = color; + } +} diff --git a/src/Riverside.JsonBinder.Console/InteractiveMode.cs b/src/Riverside.JsonBinder.Console/InteractiveMode.cs index de85a19..56fd08b 100644 --- a/src/Riverside.JsonBinder.Console/InteractiveMode.cs +++ b/src/Riverside.JsonBinder.Console/InteractiveMode.cs @@ -81,7 +81,7 @@ private static void ConvertJsonToClasses() System.Console.WriteLine("========================================="); System.Console.WriteLine(" Generating Classes"); System.Console.WriteLine("========================================="); - + var syntaxHighlighter = new SyntaxHighlighter(); foreach (var language in selectedLanguages) { try @@ -90,7 +90,9 @@ private static void ConvertJsonToClasses() System.Console.ForegroundColor = ConsoleColor.Green; System.Console.WriteLine($"\n{language} Classes:\n"); System.Console.ResetColor(); - System.Console.WriteLine(result); + + // Use SyntaxHighlighter to display the code with colors + syntaxHighlighter.DisplayCodeWithColors(result, language); } catch (JsonException ex) { @@ -102,6 +104,7 @@ private static void ConvertJsonToClasses() } } + ConsoleHelpers.PressAnyKey(); } diff --git a/src/Riverside.JsonBinder.Console/Program.cs b/src/Riverside.JsonBinder.Console/Program.cs index d529ab9..d24a0d4 100644 --- a/src/Riverside.JsonBinder.Console/Program.cs +++ b/src/Riverside.JsonBinder.Console/Program.cs @@ -53,6 +53,7 @@ private static void ConvertJsonToClasses(string json, string[] languages) return; } + var syntaxHighlighter = new SyntaxHighlighter(); foreach (string choice in languages) { if (Enum.TryParse(choice.Trim(), true, out var selectedLanguage)) @@ -61,7 +62,7 @@ private static void ConvertJsonToClasses(string json, string[] languages) { string result = JsonSerializer.ConvertTo(json, selectedLanguage); System.Console.WriteLine($"\n{selectedLanguage} Classes:\n"); - System.Console.WriteLine(result); + syntaxHighlighter.DisplayCodeWithColors(result, selectedLanguage); } catch (JsonException ex) { From 45c38ea1f75fb291c1c788206142ab36d55f449a Mon Sep 17 00:00:00 2001 From: Lamparter <71598437+Lamparter@users.noreply.github.com> Date: Sun, 19 Jan 2025 08:40:18 +0000 Subject: [PATCH 2/6] Fix CLI launch --- .../Properties/launchSettings.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Riverside.JsonBinder.Console/Properties/launchSettings.json b/src/Riverside.JsonBinder.Console/Properties/launchSettings.json index 7c385d8..58329b2 100644 --- a/src/Riverside.JsonBinder.Console/Properties/launchSettings.json +++ b/src/Riverside.JsonBinder.Console/Properties/launchSettings.json @@ -1,8 +1,10 @@ { "profiles": { "JsonBinder Console": { - "commandName": "Project", - "commandLineArgs": "", + "commandName": "Executable", + "executablePath": "powershell.exe", + "workingDirectory": "$(OutputPath)", + "commandLineArgs": "-NoExit -Command \"& { .\\bin\\Debug\\net9.0\\Riverside.JsonBinder.Console.exe }\"", "launchBrowser": false }, "JsonBinder Classic": { @@ -11,5 +13,4 @@ "launchBrowser": false } } -} - +} \ No newline at end of file From 58ec8ba0a66a5ee701fac023cee02259bf14404f Mon Sep 17 00:00:00 2001 From: Lamparter <71598437+Lamparter@users.noreply.github.com> Date: Sun, 19 Jan 2025 08:40:34 +0000 Subject: [PATCH 3/6] Mark syntax highlighter helper as static helper --- .../Helpers/SyntaxHighlighter.cs | 18 ++---------------- src/Riverside.JsonBinder.Console/SyntaxRule.cs | 13 +++++++++++++ 2 files changed, 15 insertions(+), 16 deletions(-) create mode 100644 src/Riverside.JsonBinder.Console/SyntaxRule.cs diff --git a/src/Riverside.JsonBinder.Console/Helpers/SyntaxHighlighter.cs b/src/Riverside.JsonBinder.Console/Helpers/SyntaxHighlighter.cs index bef7728..38443d5 100644 --- a/src/Riverside.JsonBinder.Console/Helpers/SyntaxHighlighter.cs +++ b/src/Riverside.JsonBinder.Console/Helpers/SyntaxHighlighter.cs @@ -2,7 +2,7 @@ namespace Riverside.JsonBinder.Console.Helpers; -public class SyntaxHighlighter +public static class SyntaxHighlighter { private static readonly Dictionary> SyntaxRulesByLanguage = new() { @@ -217,9 +217,7 @@ public class SyntaxHighlighter } }; - - - public void DisplayCodeWithColors(string code, SerializableLanguage language) + public static void DisplayCodeWithColors(string code, SerializableLanguage language) { if (!SyntaxRulesByLanguage.ContainsKey(language)) { @@ -293,15 +291,3 @@ public void DisplayCodeWithColors(string code, SerializableLanguage language) System.Console.WriteLine(); } } - -public class SyntaxRule -{ - public string Pattern { get; } - public ConsoleColor Color { get; } - - public SyntaxRule(string pattern, ConsoleColor color) - { - Pattern = pattern; - Color = color; - } -} diff --git a/src/Riverside.JsonBinder.Console/SyntaxRule.cs b/src/Riverside.JsonBinder.Console/SyntaxRule.cs new file mode 100644 index 0000000..4916343 --- /dev/null +++ b/src/Riverside.JsonBinder.Console/SyntaxRule.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Riverside.JsonBinder.Console; + +public class SyntaxRule(string pattern, ConsoleColor color) +{ + public string Pattern { get; } = pattern; + public ConsoleColor Color { get; } = color; +} From 1b5cd52266d0b200bad1817f8896270a820d8901 Mon Sep 17 00:00:00 2001 From: Lamparter <71598437+Lamparter@users.noreply.github.com> Date: Sun, 19 Jan 2025 08:41:05 +0000 Subject: [PATCH 4/6] Convert object reference into static usage --- src/Riverside.JsonBinder.Console/InteractiveMode.cs | 3 +-- src/Riverside.JsonBinder.Console/Program.cs | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Riverside.JsonBinder.Console/InteractiveMode.cs b/src/Riverside.JsonBinder.Console/InteractiveMode.cs index 56fd08b..ac30183 100644 --- a/src/Riverside.JsonBinder.Console/InteractiveMode.cs +++ b/src/Riverside.JsonBinder.Console/InteractiveMode.cs @@ -81,7 +81,6 @@ private static void ConvertJsonToClasses() System.Console.WriteLine("========================================="); System.Console.WriteLine(" Generating Classes"); System.Console.WriteLine("========================================="); - var syntaxHighlighter = new SyntaxHighlighter(); foreach (var language in selectedLanguages) { try @@ -92,7 +91,7 @@ private static void ConvertJsonToClasses() System.Console.ResetColor(); // Use SyntaxHighlighter to display the code with colors - syntaxHighlighter.DisplayCodeWithColors(result, language); + SyntaxHighlighter.DisplayCodeWithColors(result, language); } catch (JsonException ex) { diff --git a/src/Riverside.JsonBinder.Console/Program.cs b/src/Riverside.JsonBinder.Console/Program.cs index d24a0d4..9380118 100644 --- a/src/Riverside.JsonBinder.Console/Program.cs +++ b/src/Riverside.JsonBinder.Console/Program.cs @@ -53,7 +53,6 @@ private static void ConvertJsonToClasses(string json, string[] languages) return; } - var syntaxHighlighter = new SyntaxHighlighter(); foreach (string choice in languages) { if (Enum.TryParse(choice.Trim(), true, out var selectedLanguage)) @@ -62,7 +61,7 @@ private static void ConvertJsonToClasses(string json, string[] languages) { string result = JsonSerializer.ConvertTo(json, selectedLanguage); System.Console.WriteLine($"\n{selectedLanguage} Classes:\n"); - syntaxHighlighter.DisplayCodeWithColors(result, selectedLanguage); + SyntaxHighlighter.DisplayCodeWithColors(result, selectedLanguage); } catch (JsonException ex) { From 326791890b0bff0bde5e64487c5567975663a75b Mon Sep 17 00:00:00 2001 From: Lamparter <71598437+Lamparter@users.noreply.github.com> Date: Sun, 19 Jan 2025 08:48:03 +0000 Subject: [PATCH 5/6] Undo formatting changes --- .../Helpers/SyntaxHighlighter.cs | 338 +++++++++--------- .../InteractiveMode.cs | 2 +- src/Riverside.JsonBinder.Console/Program.cs | 2 +- .../SyntaxRule.cs | 8 +- 4 files changed, 172 insertions(+), 178 deletions(-) diff --git a/src/Riverside.JsonBinder.Console/Helpers/SyntaxHighlighter.cs b/src/Riverside.JsonBinder.Console/Helpers/SyntaxHighlighter.cs index 38443d5..cecf25c 100644 --- a/src/Riverside.JsonBinder.Console/Helpers/SyntaxHighlighter.cs +++ b/src/Riverside.JsonBinder.Console/Helpers/SyntaxHighlighter.cs @@ -9,210 +9,210 @@ public static class SyntaxHighlighter { SerializableLanguage.CSharp, new List { - // Core keywords - new(@"\b(abstract|as|base|break|case|catch|checked|class|const|continue|default|delegate|do|else|enum|event|explicit|extern|finally|fixed|for|foreach|goto|if|implicit|in|interface|internal|is|lock|namespace|new|operator|out|override|params|private|protected|public|readonly|ref|return|sealed|sizeof|stackalloc|static|switch|this|throw|try|typeof|unchecked|unsafe|using|virtual|volatile|while|get|set)\b", ConsoleColor.Magenta), - - // Types - new(@"\b(bool|byte|char|decimal|double|float|int|long|object|sbyte|short|string|uint|ulong|ushort|void|var)\b", ConsoleColor.DarkCyan), - - // Type definitions (classes, interfaces, etc.) - new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), - - // Properties and methods - new(@"\b[a-z][a-zA-Z0-9_]*(?=\s*[{<])", ConsoleColor.Yellow), - - // Generic type parameters - new(@"<[^>]+>", ConsoleColor.DarkYellow), - - // Numbers - new(@"\b\d+\b", ConsoleColor.Green), - - // Strings - new(@"""[^""\\]*(?:\\.[^""\\]*)*""", ConsoleColor.DarkGreen), + // Core keywords + new(@"\b(abstract|as|base|break|case|catch|checked|class|const|continue|default|delegate|do|else|enum|event|explicit|extern|finally|fixed|for|foreach|goto|if|implicit|in|interface|internal|is|lock|namespace|new|operator|out|override|params|private|protected|public|readonly|ref|return|sealed|sizeof|stackalloc|static|switch|this|throw|try|typeof|unchecked|unsafe|using|virtual|volatile|while|get|set)\b", ConsoleColor.Magenta), + + // Types + new(@"\b(bool|byte|char|decimal|double|float|int|long|object|sbyte|short|string|uint|ulong|ushort|void|var)\b", ConsoleColor.DarkCyan), + + // Type definitions (classes, interfaces, etc.) + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + + // Properties and methods + new(@"\b[a-z][a-zA-Z0-9_]*(?=\s*[{<])", ConsoleColor.Yellow), + + // Generic type parameters + new(@"<[^>]+>", ConsoleColor.DarkYellow), + + // Numbers + new(@"\b\d+\b", ConsoleColor.Green), + + // Strings + new(@"""[^""\\]*(?:\\.[^""\\]*)*""", ConsoleColor.DarkGreen), } }, { SerializableLanguage.Python, new List { - // Keywords - new(@"\b(and|as|assert|async|await|break|class|continue|def|del|elif|else|except|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|raise|return|try|while|with|yield)\b", ConsoleColor.Magenta), - - // Built-in types and values - new(@"\b(True|False|None|bool|int|float|str|list|dict|set|tuple)\b", ConsoleColor.DarkCyan), - - // Class names - new(@"(?<=\bclass\s+)\w+", ConsoleColor.Cyan), - - // Function definitions - new(@"(?<=\bdef\s+)\w+", ConsoleColor.Yellow), - - // Decorators - new(@"@\w+", ConsoleColor.DarkYellow), - - // Numbers - new(@"\b\d+\b", ConsoleColor.Green), - - // Strings - new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'", ConsoleColor.DarkGreen), + // Keywords + new(@"\b(and|as|assert|async|await|break|class|continue|def|del|elif|else|except|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|raise|return|try|while|with|yield)\b", ConsoleColor.Magenta), + + // Built-in types and values + new(@"\b(True|False|None|bool|int|float|str|list|dict|set|tuple)\b", ConsoleColor.DarkCyan), + + // Class names + new(@"(?<=\bclass\s+)\w+", ConsoleColor.Cyan), + + // Function definitions + new(@"(?<=\bdef\s+)\w+", ConsoleColor.Yellow), + + // Decorators + new(@"@\w+", ConsoleColor.DarkYellow), + + // Numbers + new(@"\b\d+\b", ConsoleColor.Green), + + // Strings + new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'", ConsoleColor.DarkGreen), } }, { SerializableLanguage.JavaScript, new List { - // Keywords - new(@"\b(async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|export|extends|finally|for|function|if|import|in|instanceof|let|new|of|return|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b", ConsoleColor.Magenta), - - // Built-in objects and types - new(@"\b(Array|Boolean|Date|Error|Function|JSON|Math|Number|Object|RegExp|String|Promise|Map|Set|Symbol|BigInt)\b", ConsoleColor.DarkCyan), - - // Class names and custom types - new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), - - // Function declarations - new(@"(?<=\bfunction\s+)\w+", ConsoleColor.Yellow), - - // Arrow functions - new(@"=>\s*{", ConsoleColor.DarkYellow), - - // Numbers - new(@"\b\d+(\.\d+)?\b", ConsoleColor.Green), - - // Strings - new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'|`[^`\\]*(?:\\.[^`\\]*)*`", ConsoleColor.DarkGreen), + // Keywords + new(@"\b(async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|export|extends|finally|for|function|if|import|in|instanceof|let|new|of|return|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b", ConsoleColor.Magenta), + + // Built-in objects and types + new(@"\b(Array|Boolean|Date|Error|Function|JSON|Math|Number|Object|RegExp|String|Promise|Map|Set|Symbol|BigInt)\b", ConsoleColor.DarkCyan), + + // Class names and custom types + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + + // Function declarations + new(@"(?<=\bfunction\s+)\w+", ConsoleColor.Yellow), + + // Arrow functions + new(@"=>\s*{", ConsoleColor.DarkYellow), + + // Numbers + new(@"\b\d+(\.\d+)?\b", ConsoleColor.Green), + + // Strings + new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'|`[^`\\]*(?:\\.[^`\\]*)*`", ConsoleColor.DarkGreen), } }, { SerializableLanguage.TypeScript, new List { - // TypeScript-specific keywords - new(@"\b(abstract|as|asserts|async|await|break|case|catch|class|const|continue|debugger|declare|default|delete|do|else|enum|export|extends|finally|for|from|function|if|implements|import|in|infer|instanceof|interface|is|keyof|let|module|namespace|new|null|of|return|super|switch|this|throw|try|type|typeof|undefined|unique|unknown|var|void|while|with|yield)\b", ConsoleColor.Magenta), - - // Types and type operators - new(@"\b(any|boolean|number|string|symbol|never|object|bigint|readonly|private|protected|public|static)\b", ConsoleColor.DarkCyan), - - // Classes and interfaces - new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), - - // Generics - new(@"<[^>]+>", ConsoleColor.Yellow), - - // Decorators - new(@"@\w+", ConsoleColor.DarkYellow), - - // Numbers - new(@"\b\d+(\.\d+)?\b", ConsoleColor.Green), - - // Strings - new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'|`[^`\\]*(?:\\.[^`\\]*)*`", ConsoleColor.DarkGreen), + // TypeScript-specific keywords + new(@"\b(abstract|as|asserts|async|await|break|case|catch|class|const|continue|debugger|declare|default|delete|do|else|enum|export|extends|finally|for|from|function|if|implements|import|in|infer|instanceof|interface|is|keyof|let|module|namespace|new|null|of|return|super|switch|this|throw|try|type|typeof|undefined|unique|unknown|var|void|while|with|yield)\b", ConsoleColor.Magenta), + + // Types and type operators + new(@"\b(any|boolean|number|string|symbol|never|object|bigint|readonly|private|protected|public|static)\b", ConsoleColor.DarkCyan), + + // Classes and interfaces + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + + // Generics + new(@"<[^>]+>", ConsoleColor.Yellow), + + // Decorators + new(@"@\w+", ConsoleColor.DarkYellow), + + // Numbers + new(@"\b\d+(\.\d+)?\b", ConsoleColor.Green), + + // Strings + new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'|`[^`\\]*(?:\\.[^`\\]*)*`", ConsoleColor.DarkGreen), } }, { SerializableLanguage.Java, new List { - // Keywords - new(@"\b(abstract|assert|break|case|catch|class|const|continue|default|do|else|enum|extends|final|finally|for|if|implements|import|instanceof|interface|native|new|package|private|protected|public|return|static|strictfp|super|switch|synchronized|this|throw|throws|transient|try|volatile|while)\b", ConsoleColor.Magenta), - - // Types - new(@"\b(boolean|byte|char|double|float|int|long|short|void|var)\b", ConsoleColor.DarkCyan), - - // Class names and custom types - new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), - - // Method declarations - new(@"(?<=\b\w+\s+)\w+(?=\s*\()", ConsoleColor.Yellow), - - // Generics - new(@"<[^>]+>", ConsoleColor.DarkYellow), - - // Annotations - new(@"@\w+", ConsoleColor.DarkYellow), - - // Numbers - new(@"\b\d+(\.\d+)?[dDfFlL]?\b", ConsoleColor.Green), - - // Strings - new(@"""[^""\\]*(?:\\.[^""\\]*)*""", ConsoleColor.DarkGreen), + // Keywords + new(@"\b(abstract|assert|break|case|catch|class|const|continue|default|do|else|enum|extends|final|finally|for|if|implements|import|instanceof|interface|native|new|package|private|protected|public|return|static|strictfp|super|switch|synchronized|this|throw|throws|transient|try|volatile|while)\b", ConsoleColor.Magenta), + + // Types + new(@"\b(boolean|byte|char|double|float|int|long|short|void|var)\b", ConsoleColor.DarkCyan), + + // Class names and custom types + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + + // Method declarations + new(@"(?<=\b\w+\s+)\w+(?=\s*\()", ConsoleColor.Yellow), + + // Generics + new(@"<[^>]+>", ConsoleColor.DarkYellow), + + // Annotations + new(@"@\w+", ConsoleColor.DarkYellow), + + // Numbers + new(@"\b\d+(\.\d+)?[dDfFlL]?\b", ConsoleColor.Green), + + // Strings + new(@"""[^""\\]*(?:\\.[^""\\]*)*""", ConsoleColor.DarkGreen), } }, { SerializableLanguage.PHP, new List { - // Keywords - new(@"\b(abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|yield|yield from)\b", ConsoleColor.Magenta), - - // Types and type hints - new(@"\b(bool|boolean|int|integer|float|double|string|array|object|callable|iterable|void|null|mixed|never|true|false)\b", ConsoleColor.DarkCyan), - - // Class names and namespaces - new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), - - // Function declarations - new(@"(?<=\bfunction\s+)\w+", ConsoleColor.Yellow), - - // Variables - new(@"\$\w+", ConsoleColor.DarkYellow), - - // Numbers - new(@"\b\d+(\.\d+)?\b", ConsoleColor.Green), - - // Strings - new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'", ConsoleColor.DarkGreen), + // Keywords + new(@"\b(abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|yield|yield from)\b", ConsoleColor.Magenta), + + // Types and type hints + new(@"\b(bool|boolean|int|integer|float|double|string|array|object|callable|iterable|void|null|mixed|never|true|false)\b", ConsoleColor.DarkCyan), + + // Class names and namespaces + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + + // Function declarations + new(@"(?<=\bfunction\s+)\w+", ConsoleColor.Yellow), + + // Variables + new(@"\$\w+", ConsoleColor.DarkYellow), + + // Numbers + new(@"\b\d+(\.\d+)?\b", ConsoleColor.Green), + + // Strings + new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'", ConsoleColor.DarkGreen), } }, { SerializableLanguage.Ruby, new List { - // Keywords - new(@"\b(alias|and|begin|break|case|class|def|defined\?|do|else|elsif|end|ensure|false|for|if|in|module|next|nil|not|or|redo|rescue|retry|return|self|super|then|true|undef|unless|until|when|while|yield)\b", ConsoleColor.Magenta), - - // Built-in classes and modules - new(@"\b(Array|Hash|String|Integer|Float|Symbol|Range|Regexp|Time|File|Dir|Class|Module|Enumerable|Comparable|Kernel|Process|Thread)\b", ConsoleColor.DarkCyan), - - // Class and module names - new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), - - // Method declarations - new(@"(?<=\bdef\s+)\w+", ConsoleColor.Yellow), - - // Symbols - new(@":\w+", ConsoleColor.DarkYellow), - - // Instance variables - new(@"@{1,2}\w+", ConsoleColor.DarkYellow), - - // Numbers - new(@"\b\d+(\.\d+)?(e[+-]?\d+)?\b", ConsoleColor.Green), - - // Strings - new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'|%[qQ]?\{[^}]*\}|%[qQ]?\[[^\]]*\]|%[qQ]?\([^)]*\)|%[qQ]?<[^>]*>", ConsoleColor.DarkGreen), + // Keywords + new(@"\b(alias|and|begin|break|case|class|def|defined\?|do|else|elsif|end|ensure|false|for|if|in|module|next|nil|not|or|redo|rescue|retry|return|self|super|then|true|undef|unless|until|when|while|yield)\b", ConsoleColor.Magenta), + + // Built-in classes and modules + new(@"\b(Array|Hash|String|Integer|Float|Symbol|Range|Regexp|Time|File|Dir|Class|Module|Enumerable|Comparable|Kernel|Process|Thread)\b", ConsoleColor.DarkCyan), + + // Class and module names + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + + // Method declarations + new(@"(?<=\bdef\s+)\w+", ConsoleColor.Yellow), + + // Symbols + new(@":\w+", ConsoleColor.DarkYellow), + + // Instance variables + new(@"@{1,2}\w+", ConsoleColor.DarkYellow), + + // Numbers + new(@"\b\d+(\.\d+)?(e[+-]?\d+)?\b", ConsoleColor.Green), + + // Strings + new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'|%[qQ]?\{[^}]*\}|%[qQ]?\[[^\]]*\]|%[qQ]?\([^)]*\)|%[qQ]?<[^>]*>", ConsoleColor.DarkGreen), } }, { SerializableLanguage.Swift, new List { - // Keywords - new(@"\b(associatedtype|class|deinit|enum|extension|fileprivate|func|import|init|inout|internal|let|open|operator|private|precedencegroup|protocol|public|rethrows|static|struct|subscript|typealias|var|break|case|continue|default|defer|do|else|fallthrough|for|guard|if|in|repeat|return|switch|where|while|as|Any|catch|false|is|nil|super|self|Self|throw|throws|true|try)\b", ConsoleColor.Magenta), - - // Types - new(@"\b(Int|Double|Float|Bool|String|Character|Optional|Array|Dictionary|Set|Result|Error)\b", ConsoleColor.DarkCyan), - - // Type names and protocols - new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), - - // Function declarations - new(@"(?<=\bfunc\s+)\w+", ConsoleColor.Yellow), - - // Property wrappers and attributes - new(@"@\w+", ConsoleColor.DarkYellow), - - // Generics - new(@"<[^>]+>", ConsoleColor.DarkYellow), - - // Numbers - new(@"\b\d+(\.\d+)?([eE][+-]?\d+)?\b", ConsoleColor.Green), - - // Strings - new(@"""[^""\\]*(?:\\.[^""\\]*)*""", ConsoleColor.DarkGreen), + // Keywords + new(@"\b(associatedtype|class|deinit|enum|extension|fileprivate|func|import|init|inout|internal|let|open|operator|private|precedencegroup|protocol|public|rethrows|static|struct|subscript|typealias|var|break|case|continue|default|defer|do|else|fallthrough|for|guard|if|in|repeat|return|switch|where|while|as|Any|catch|false|is|nil|super|self|Self|throw|throws|true|try)\b", ConsoleColor.Magenta), + + // Types + new(@"\b(Int|Double|Float|Bool|String|Character|Optional|Array|Dictionary|Set|Result|Error)\b", ConsoleColor.DarkCyan), + + // Type names and protocols + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + + // Function declarations + new(@"(?<=\bfunc\s+)\w+", ConsoleColor.Yellow), + + // Property wrappers and attributes + new(@"@\w+", ConsoleColor.DarkYellow), + + // Generics + new(@"<[^>]+>", ConsoleColor.DarkYellow), + + // Numbers + new(@"\b\d+(\.\d+)?([eE][+-]?\d+)?\b", ConsoleColor.Green), + + // Strings + new(@"""[^""\\]*(?:\\.[^""\\]*)*""", ConsoleColor.DarkGreen), } } }; diff --git a/src/Riverside.JsonBinder.Console/InteractiveMode.cs b/src/Riverside.JsonBinder.Console/InteractiveMode.cs index ac30183..e0d75fe 100644 --- a/src/Riverside.JsonBinder.Console/InteractiveMode.cs +++ b/src/Riverside.JsonBinder.Console/InteractiveMode.cs @@ -81,6 +81,7 @@ private static void ConvertJsonToClasses() System.Console.WriteLine("========================================="); System.Console.WriteLine(" Generating Classes"); System.Console.WriteLine("========================================="); + foreach (var language in selectedLanguages) { try @@ -103,7 +104,6 @@ private static void ConvertJsonToClasses() } } - ConsoleHelpers.PressAnyKey(); } diff --git a/src/Riverside.JsonBinder.Console/Program.cs b/src/Riverside.JsonBinder.Console/Program.cs index 9380118..916cbd8 100644 --- a/src/Riverside.JsonBinder.Console/Program.cs +++ b/src/Riverside.JsonBinder.Console/Program.cs @@ -1,7 +1,7 @@ +using Riverside.JsonBinder.Console.Helpers; using System.CommandLine; using System.CommandLine.NamingConventionBinder; using System.Text.Json; -using Riverside.JsonBinder.Console.Helpers; namespace Riverside.JsonBinder.Console; diff --git a/src/Riverside.JsonBinder.Console/SyntaxRule.cs b/src/Riverside.JsonBinder.Console/SyntaxRule.cs index 4916343..269a5df 100644 --- a/src/Riverside.JsonBinder.Console/SyntaxRule.cs +++ b/src/Riverside.JsonBinder.Console/SyntaxRule.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Riverside.JsonBinder.Console; +namespace Riverside.JsonBinder.Console; public class SyntaxRule(string pattern, ConsoleColor color) { From 050bacbf61a895008713fd5af19b2926f4619162 Mon Sep 17 00:00:00 2001 From: Lamparter <71598437+Lamparter@users.noreply.github.com> Date: Sun, 19 Jan 2025 09:11:18 +0000 Subject: [PATCH 6/6] Use official syntax highlighting colours These are specific to .NET, but it looks good universally. --- .../Helpers/SyntaxHighlighter.cs | 96 +++++++++---------- .../InteractiveMode.cs | 2 +- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/src/Riverside.JsonBinder.Console/Helpers/SyntaxHighlighter.cs b/src/Riverside.JsonBinder.Console/Helpers/SyntaxHighlighter.cs index cecf25c..48807d4 100644 --- a/src/Riverside.JsonBinder.Console/Helpers/SyntaxHighlighter.cs +++ b/src/Riverside.JsonBinder.Console/Helpers/SyntaxHighlighter.cs @@ -10,116 +10,116 @@ public static class SyntaxHighlighter SerializableLanguage.CSharp, new List { // Core keywords - new(@"\b(abstract|as|base|break|case|catch|checked|class|const|continue|default|delegate|do|else|enum|event|explicit|extern|finally|fixed|for|foreach|goto|if|implicit|in|interface|internal|is|lock|namespace|new|operator|out|override|params|private|protected|public|readonly|ref|return|sealed|sizeof|stackalloc|static|switch|this|throw|try|typeof|unchecked|unsafe|using|virtual|volatile|while|get|set)\b", ConsoleColor.Magenta), + new(@"\b(abstract|as|base|break|case|catch|checked|class|const|continue|default|delegate|do|else|enum|event|explicit|extern|finally|fixed|for|foreach|goto|if|implicit|in|interface|internal|is|lock|namespace|new|operator|out|override|params|private|protected|public|readonly|ref|return|sealed|sizeof|stackalloc|static|switch|this|throw|try|typeof|unchecked|unsafe|using|virtual|volatile|while|get|set)\b", ConsoleColor.Red), // Types - new(@"\b(bool|byte|char|decimal|double|float|int|long|object|sbyte|short|string|uint|ulong|ushort|void|var)\b", ConsoleColor.DarkCyan), + new(@"\b(bool|byte|char|decimal|double|float|int|long|object|sbyte|short|string|uint|ulong|ushort|void|var)\b", ConsoleColor.White), // Type definitions (classes, interfaces, etc.) - new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Gray), // Properties and methods - new(@"\b[a-z][a-zA-Z0-9_]*(?=\s*[{<])", ConsoleColor.Yellow), + new(@"\b[a-z][a-zA-Z0-9_]*(?=\s*[{<])", ConsoleColor.Magenta), // Generic type parameters new(@"<[^>]+>", ConsoleColor.DarkYellow), // Numbers - new(@"\b\d+\b", ConsoleColor.Green), + new(@"\b\d+\b", ConsoleColor.Blue), // Strings - new(@"""[^""\\]*(?:\\.[^""\\]*)*""", ConsoleColor.DarkGreen), + new(@"""[^""\\]*(?:\\.[^""\\]*)*""", ConsoleColor.Cyan), } }, { SerializableLanguage.Python, new List { // Keywords - new(@"\b(and|as|assert|async|await|break|class|continue|def|del|elif|else|except|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|raise|return|try|while|with|yield)\b", ConsoleColor.Magenta), + new(@"\b(and|as|assert|async|await|break|class|continue|def|del|elif|else|except|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|raise|return|try|while|with|yield)\b", ConsoleColor.Red), // Built-in types and values - new(@"\b(True|False|None|bool|int|float|str|list|dict|set|tuple)\b", ConsoleColor.DarkCyan), + new(@"\b(True|False|None|bool|int|float|str|list|dict|set|tuple)\b", ConsoleColor.White), // Class names - new(@"(?<=\bclass\s+)\w+", ConsoleColor.Cyan), + new(@"(?<=\bclass\s+)\w+", ConsoleColor.Gray), // Function definitions - new(@"(?<=\bdef\s+)\w+", ConsoleColor.Yellow), + new(@"(?<=\bdef\s+)\w+", ConsoleColor.Magenta), // Decorators new(@"@\w+", ConsoleColor.DarkYellow), // Numbers - new(@"\b\d+\b", ConsoleColor.Green), + new(@"\b\d+\b", ConsoleColor.Blue), // Strings - new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'", ConsoleColor.DarkGreen), + new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'", ConsoleColor.Cyan), } }, { SerializableLanguage.JavaScript, new List { // Keywords - new(@"\b(async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|export|extends|finally|for|function|if|import|in|instanceof|let|new|of|return|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b", ConsoleColor.Magenta), + new(@"\b(async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|export|extends|finally|for|function|if|import|in|instanceof|let|new|of|return|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b", ConsoleColor.Red), // Built-in objects and types - new(@"\b(Array|Boolean|Date|Error|Function|JSON|Math|Number|Object|RegExp|String|Promise|Map|Set|Symbol|BigInt)\b", ConsoleColor.DarkCyan), + new(@"\b(Array|Boolean|Date|Error|Function|JSON|Math|Number|Object|RegExp|String|Promise|Map|Set|Symbol|BigInt)\b", ConsoleColor.White), // Class names and custom types - new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Gray), // Function declarations - new(@"(?<=\bfunction\s+)\w+", ConsoleColor.Yellow), + new(@"(?<=\bfunction\s+)\w+", ConsoleColor.Magenta), // Arrow functions new(@"=>\s*{", ConsoleColor.DarkYellow), // Numbers - new(@"\b\d+(\.\d+)?\b", ConsoleColor.Green), + new(@"\b\d+(\.\d+)?\b", ConsoleColor.Blue), // Strings - new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'|`[^`\\]*(?:\\.[^`\\]*)*`", ConsoleColor.DarkGreen), + new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'|`[^`\\]*(?:\\.[^`\\]*)*`", ConsoleColor.Cyan), } }, { SerializableLanguage.TypeScript, new List { // TypeScript-specific keywords - new(@"\b(abstract|as|asserts|async|await|break|case|catch|class|const|continue|debugger|declare|default|delete|do|else|enum|export|extends|finally|for|from|function|if|implements|import|in|infer|instanceof|interface|is|keyof|let|module|namespace|new|null|of|return|super|switch|this|throw|try|type|typeof|undefined|unique|unknown|var|void|while|with|yield)\b", ConsoleColor.Magenta), + new(@"\b(abstract|as|asserts|async|await|break|case|catch|class|const|continue|debugger|declare|default|delete|do|else|enum|export|extends|finally|for|from|function|if|implements|import|in|infer|instanceof|interface|is|keyof|let|module|namespace|new|null|of|return|super|switch|this|throw|try|type|typeof|undefined|unique|unknown|var|void|while|with|yield)\b", ConsoleColor.Red), // Types and type operators - new(@"\b(any|boolean|number|string|symbol|never|object|bigint|readonly|private|protected|public|static)\b", ConsoleColor.DarkCyan), + new(@"\b(any|boolean|number|string|symbol|never|object|bigint|readonly|private|protected|public|static)\b", ConsoleColor.White), // Classes and interfaces - new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Gray), // Generics - new(@"<[^>]+>", ConsoleColor.Yellow), + new(@"<[^>]+>", ConsoleColor.Magenta), // Decorators new(@"@\w+", ConsoleColor.DarkYellow), // Numbers - new(@"\b\d+(\.\d+)?\b", ConsoleColor.Green), + new(@"\b\d+(\.\d+)?\b", ConsoleColor.Blue), // Strings - new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'|`[^`\\]*(?:\\.[^`\\]*)*`", ConsoleColor.DarkGreen), + new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'|`[^`\\]*(?:\\.[^`\\]*)*`", ConsoleColor.Cyan), } }, { SerializableLanguage.Java, new List { // Keywords - new(@"\b(abstract|assert|break|case|catch|class|const|continue|default|do|else|enum|extends|final|finally|for|if|implements|import|instanceof|interface|native|new|package|private|protected|public|return|static|strictfp|super|switch|synchronized|this|throw|throws|transient|try|volatile|while)\b", ConsoleColor.Magenta), + new(@"\b(abstract|assert|break|case|catch|class|const|continue|default|do|else|enum|extends|final|finally|for|if|implements|import|instanceof|interface|native|new|package|private|protected|public|return|static|strictfp|super|switch|synchronized|this|throw|throws|transient|try|volatile|while)\b", ConsoleColor.Red), // Types - new(@"\b(boolean|byte|char|double|float|int|long|short|void|var)\b", ConsoleColor.DarkCyan), + new(@"\b(boolean|byte|char|double|float|int|long|short|void|var)\b", ConsoleColor.White), // Class names and custom types - new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Gray), // Method declarations - new(@"(?<=\b\w+\s+)\w+(?=\s*\()", ConsoleColor.Yellow), + new(@"(?<=\b\w+\s+)\w+(?=\s*\()", ConsoleColor.Magenta), // Generics new(@"<[^>]+>", ConsoleColor.DarkYellow), @@ -128,51 +128,51 @@ public static class SyntaxHighlighter new(@"@\w+", ConsoleColor.DarkYellow), // Numbers - new(@"\b\d+(\.\d+)?[dDfFlL]?\b", ConsoleColor.Green), + new(@"\b\d+(\.\d+)?[dDfFlL]?\b", ConsoleColor.Blue), // Strings - new(@"""[^""\\]*(?:\\.[^""\\]*)*""", ConsoleColor.DarkGreen), + new(@"""[^""\\]*(?:\\.[^""\\]*)*""", ConsoleColor.Cyan), } }, { SerializableLanguage.PHP, new List { // Keywords - new(@"\b(abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|yield|yield from)\b", ConsoleColor.Magenta), + new(@"\b(abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|yield|yield from)\b", ConsoleColor.Red), // Types and type hints - new(@"\b(bool|boolean|int|integer|float|double|string|array|object|callable|iterable|void|null|mixed|never|true|false)\b", ConsoleColor.DarkCyan), + new(@"\b(bool|boolean|int|integer|float|double|string|array|object|callable|iterable|void|null|mixed|never|true|false)\b", ConsoleColor.White), // Class names and namespaces - new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Gray), // Function declarations - new(@"(?<=\bfunction\s+)\w+", ConsoleColor.Yellow), + new(@"(?<=\bfunction\s+)\w+", ConsoleColor.Magenta), // Variables new(@"\$\w+", ConsoleColor.DarkYellow), // Numbers - new(@"\b\d+(\.\d+)?\b", ConsoleColor.Green), + new(@"\b\d+(\.\d+)?\b", ConsoleColor.Blue), // Strings - new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'", ConsoleColor.DarkGreen), + new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'", ConsoleColor.Cyan), } }, { SerializableLanguage.Ruby, new List { // Keywords - new(@"\b(alias|and|begin|break|case|class|def|defined\?|do|else|elsif|end|ensure|false|for|if|in|module|next|nil|not|or|redo|rescue|retry|return|self|super|then|true|undef|unless|until|when|while|yield)\b", ConsoleColor.Magenta), + new(@"\b(alias|and|begin|break|case|class|def|defined\?|do|else|elsif|end|ensure|false|for|if|in|module|next|nil|not|or|redo|rescue|retry|return|self|super|then|true|undef|unless|until|when|while|yield)\b", ConsoleColor.Red), // Built-in classes and modules - new(@"\b(Array|Hash|String|Integer|Float|Symbol|Range|Regexp|Time|File|Dir|Class|Module|Enumerable|Comparable|Kernel|Process|Thread)\b", ConsoleColor.DarkCyan), + new(@"\b(Array|Hash|String|Integer|Float|Symbol|Range|Regexp|Time|File|Dir|Class|Module|Enumerable|Comparable|Kernel|Process|Thread)\b", ConsoleColor.White), // Class and module names - new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Gray), // Method declarations - new(@"(?<=\bdef\s+)\w+", ConsoleColor.Yellow), + new(@"(?<=\bdef\s+)\w+", ConsoleColor.Magenta), // Symbols new(@":\w+", ConsoleColor.DarkYellow), @@ -181,26 +181,26 @@ public static class SyntaxHighlighter new(@"@{1,2}\w+", ConsoleColor.DarkYellow), // Numbers - new(@"\b\d+(\.\d+)?(e[+-]?\d+)?\b", ConsoleColor.Green), + new(@"\b\d+(\.\d+)?(e[+-]?\d+)?\b", ConsoleColor.Blue), // Strings - new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'|%[qQ]?\{[^}]*\}|%[qQ]?\[[^\]]*\]|%[qQ]?\([^)]*\)|%[qQ]?<[^>]*>", ConsoleColor.DarkGreen), + new(@"""[^""\\]*(?:\\.[^""\\]*)*""|'[^'\\]*(?:\\.[^'\\]*)*'|%[qQ]?\{[^}]*\}|%[qQ]?\[[^\]]*\]|%[qQ]?\([^)]*\)|%[qQ]?<[^>]*>", ConsoleColor.Cyan), } }, { SerializableLanguage.Swift, new List { // Keywords - new(@"\b(associatedtype|class|deinit|enum|extension|fileprivate|func|import|init|inout|internal|let|open|operator|private|precedencegroup|protocol|public|rethrows|static|struct|subscript|typealias|var|break|case|continue|default|defer|do|else|fallthrough|for|guard|if|in|repeat|return|switch|where|while|as|Any|catch|false|is|nil|super|self|Self|throw|throws|true|try)\b", ConsoleColor.Magenta), + new(@"\b(associatedtype|class|deinit|enum|extension|fileprivate|func|import|init|inout|internal|let|open|operator|private|precedencegroup|protocol|public|rethrows|static|struct|subscript|typealias|var|break|case|continue|default|defer|do|else|fallthrough|for|guard|if|in|repeat|return|switch|where|while|as|Any|catch|false|is|nil|super|self|Self|throw|throws|true|try)\b", ConsoleColor.Red), // Types - new(@"\b(Int|Double|Float|Bool|String|Character|Optional|Array|Dictionary|Set|Result|Error)\b", ConsoleColor.DarkCyan), + new(@"\b(Int|Double|Float|Bool|String|Character|Optional|Array|Dictionary|Set|Result|Error)\b", ConsoleColor.White), // Type names and protocols - new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Cyan), + new(@"\b[A-Z][a-zA-Z0-9_]*\b", ConsoleColor.Gray), // Function declarations - new(@"(?<=\bfunc\s+)\w+", ConsoleColor.Yellow), + new(@"(?<=\bfunc\s+)\w+", ConsoleColor.Magenta), // Property wrappers and attributes new(@"@\w+", ConsoleColor.DarkYellow), @@ -209,10 +209,10 @@ public static class SyntaxHighlighter new(@"<[^>]+>", ConsoleColor.DarkYellow), // Numbers - new(@"\b\d+(\.\d+)?([eE][+-]?\d+)?\b", ConsoleColor.Green), + new(@"\b\d+(\.\d+)?([eE][+-]?\d+)?\b", ConsoleColor.Blue), // Strings - new(@"""[^""\\]*(?:\\.[^""\\]*)*""", ConsoleColor.DarkGreen), + new(@"""[^""\\]*(?:\\.[^""\\]*)*""", ConsoleColor.Cyan), } } }; diff --git a/src/Riverside.JsonBinder.Console/InteractiveMode.cs b/src/Riverside.JsonBinder.Console/InteractiveMode.cs index e0d75fe..1517fbe 100644 --- a/src/Riverside.JsonBinder.Console/InteractiveMode.cs +++ b/src/Riverside.JsonBinder.Console/InteractiveMode.cs @@ -87,7 +87,7 @@ private static void ConvertJsonToClasses() try { string result = JsonSerializer.ConvertTo(json, language); - System.Console.ForegroundColor = ConsoleColor.Green; + System.Console.ForegroundColor = ConsoleColor.Blue; System.Console.WriteLine($"\n{language} Classes:\n"); System.Console.ResetColor();