From 32e4e9dff87c7119a0933884df5b6a1b94d80998 Mon Sep 17 00:00:00 2001 From: tznind Date: Sun, 13 Jun 2021 09:33:57 +0100 Subject: [PATCH] Added word splitting --- UICatalog/Scenarios/SyntaxHighlighting.cs | 66 ++++++++++++++++++++++- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/UICatalog/Scenarios/SyntaxHighlighting.cs b/UICatalog/Scenarios/SyntaxHighlighting.cs index 98234beca..2aaec9215 100644 --- a/UICatalog/Scenarios/SyntaxHighlighting.cs +++ b/UICatalog/Scenarios/SyntaxHighlighting.cs @@ -4,10 +4,11 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; using Terminal.Gui; using static UICatalog.Scenario; - +using Attribute = Terminal.Gui.Attribute; namespace UICatalog.Scenarios { [ScenarioMetadata (Name: "Syntax Highlighting", Description: "Text editor with keyword highlighting")] @@ -35,7 +36,10 @@ namespace UICatalog.Scenarios { Height = Dim.Fill (1), }; + textView.Init(); + textView.Text = "SELECT TOP 100 * \nfrom\n MyDb.dbo.Biochemistry;"; + Win.Add (textView); var statusBar = new StatusBar (new StatusItem [] { @@ -55,11 +59,69 @@ namespace UICatalog.Scenarios { private class SqlTextView : TextView{ + private HashSet keywords = new HashSet(StringComparer.CurrentCultureIgnoreCase); + private Attribute blue; + private Attribute white; + public void Init() + { + keywords.Add("select"); + keywords.Add("distinct"); + keywords.Add("top"); + keywords.Add("from"); + + blue = Driver.MakeAttribute (Color.Cyan, Color.Black); + white = Driver.MakeAttribute (Color.White, Color.Black); + } + + protected override void ColorNormal () + { + Driver.SetAttribute (white); + } + protected override void ColorNormal (List line, int idx) { - Driver.SetAttribute (Driver.MakeAttribute (Color.Green, Color.Black)); + if(IsKeyword(line,idx)) + { + Driver.SetAttribute (blue); + } + else{ + Driver.SetAttribute (white); + } + } + + private bool IsKeyword(List line, int idx) + { + var word = IdxToWord(line,idx); + + if(string.IsNullOrWhiteSpace(word)){ + return false; + } + + return keywords.Contains(word,StringComparer.CurrentCultureIgnoreCase); + } + + private string IdxToWord(List line, int idx) + { + var words = Regex.Split( + new string(line.Select(r=>(char)r).ToArray()), + "\b"); + + + int count = 0; + string current = null; + + foreach(var word in words) + { + current = word; + count+= word.Length; + if(count >= idx){ + break; + } + } + + return current; } } }