From 4a3620db5e05480e9313f76ade8c1cadcc6d600e Mon Sep 17 00:00:00 2001 From: leo Date: Sat, 21 Sep 2024 16:33:34 +0800 Subject: [PATCH] refactor: rewrites the built-in grammar extension --- src/Models/TextMateHelper.cs | 107 ++++++++++++++++++++++------------- src/Native/Windows.cs | 2 +- 2 files changed, 69 insertions(+), 40 deletions(-) diff --git a/src/Models/TextMateHelper.cs b/src/Models/TextMateHelper.cs index fdb2cb66..b1cf15af 100644 --- a/src/Models/TextMateHelper.cs +++ b/src/Models/TextMateHelper.cs @@ -17,31 +17,75 @@ using TextMateSharp.Themes; namespace SourceGit.Models { - public class RegistryOptionsWrapper : IRegistryOptions + public static class GrammarUtility { - public RegistryOptionsWrapper(ThemeName defaultTheme) + private static readonly ExtraGrammar[] s_extraGrammas = + [ + new ExtraGrammar("source.toml", ".toml", "toml.json"), + new ExtraGrammar("source.kotlin", ".kotlin", "kotlin.json"), + new ExtraGrammar("source.hx", ".hx", "haxe.json"), + new ExtraGrammar("source.hxml", ".hxml", "hxml.json"), + ]; + + public static string GetExtension(string file) { - _backend = new RegistryOptions(defaultTheme); - _extraGrammars = new List(); + var extension = Path.GetExtension(file); + if (extension == ".h") + extension = ".cpp"; + else if (extension == ".resx" || extension == ".plist" || extension == ".manifest") + extension = ".xml"; + else if (extension == ".command") + extension = ".sh"; + else if (extension == ".kt" || extension == ".kts") + extension = ".kotlin"; - string[] extraGrammarFiles = ["toml.json", "kotlin.json", "haxe.json", "hxml.json"]; - foreach (var file in extraGrammarFiles) - { - var asset = AssetLoader.Open(new Uri($"avares://SourceGit/Resources/Grammars/{file}", - UriKind.RelativeOrAbsolute)); - - try - { - var grammar = GrammarReader.ReadGrammarSync(new StreamReader(asset)); - _extraGrammars.Add(grammar); - } - catch - { - // ignore - } - } + return extension; } + public static string GetScopeByExtension(string extension) + { + foreach (var grammar in s_extraGrammas) + { + if (grammar.Extension.Equals(extension, StringComparison.OrdinalIgnoreCase)) + return grammar.Scope; + } + + return null; + } + + public static IRawGrammar Load(string scopeName) + { + foreach (var grammar in s_extraGrammas) + { + if (grammar.Scope.Equals(scopeName, StringComparison.OrdinalIgnoreCase)) + { + var asset = AssetLoader.Open(new Uri($"avares://SourceGit/Resources/Grammars/{grammar.File}", + UriKind.RelativeOrAbsolute)); + + try + { + return GrammarReader.ReadGrammarSync(new StreamReader(asset)); + } + catch + { + break; + } + } + } + + return null; + } + + private record ExtraGrammar(string Scope, string Extension, string File) + { + public readonly string Scope = Scope; + public readonly string Extension = Extension; + public readonly string File = File; + } + } + + public class RegistryOptionsWrapper(ThemeName defaultTheme) : IRegistryOptions + { public IRawTheme GetTheme(string scopeName) { return _backend.GetTheme(scopeName); @@ -49,8 +93,7 @@ namespace SourceGit.Models public IRawGrammar GetGrammar(string scopeName) { - var grammar = _extraGrammars.Find(x => x.GetScopeName().Equals(scopeName, StringComparison.Ordinal)); - return grammar ?? _backend.GetGrammar(scopeName); + return GrammarUtility.Load(scopeName) ?? _backend.GetGrammar(scopeName); } public ICollection GetInjections(string scopeName) @@ -70,25 +113,11 @@ namespace SourceGit.Models public string GetScopeByFileName(string filename) { - var extension = Path.GetExtension(filename); - if (extension == ".h") - extension = ".cpp"; - else if (extension == ".resx" || extension == ".plist" || extension == ".manifest") - extension = ".xml"; - else if (extension == ".command") - extension = ".sh"; - else if (extension == ".kt" || extension == ".kts") - extension = ".kotlin"; - - var grammar = _extraGrammars.Find(x => x.GetScopeName().EndsWith(extension, StringComparison.OrdinalIgnoreCase)); - if (grammar != null) - return grammar.GetScopeName(); - - return _backend.GetScopeByExtension(extension); + var ext = GrammarUtility.GetExtension(filename); + return GrammarUtility.GetScopeByExtension(ext) ?? _backend.GetScopeByExtension(ext); } - private readonly RegistryOptions _backend; - private readonly List _extraGrammars; + private readonly RegistryOptions _backend = new(defaultTheme); } public static class TextMateHelper diff --git a/src/Native/Windows.cs b/src/Native/Windows.cs index 0f2e458d..b02112cc 100644 --- a/src/Native/Windows.cs +++ b/src/Native/Windows.cs @@ -202,7 +202,7 @@ namespace SourceGit.Native private void FixWindowFrameOnWin10(Window w) { if (w.WindowState != WindowState.Normal) - w.SystemDecorations = SystemDecorations.Full; + w.SystemDecorations = SystemDecorations.Full; else w.SystemDecorations = SystemDecorations.BorderOnly; }