Compare commits

...

3 commits

Author SHA1 Message Date
leo
4a3620db5e
refactor: rewrites the built-in grammar extension
Some checks are pending
Continuous Integration / Build (push) Waiting to run
Continuous Integration / Prepare version string (push) Waiting to run
Continuous Integration / Package (push) Blocked by required conditions
2024-09-21 16:34:00 +08:00
leo
0a4d5b8429
Merge pull request #496 from Gama11/feature/haxe-syntax-highlighting
Add syntax highlighting for Haxe
2024-09-21 15:40:54 +08:00
Jens Fischer
0dbca4fe47 Add syntax highlighting for Haxe 2024-09-20 16:30:40 +02:00
4 changed files with 2627 additions and 40 deletions

View file

@ -17,31 +17,75 @@ using TextMateSharp.Themes;
namespace SourceGit.Models 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); var extension = Path.GetExtension(file);
_extraGrammars = new List<IRawGrammar>(); 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"]; return extension;
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
}
}
} }
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) public IRawTheme GetTheme(string scopeName)
{ {
return _backend.GetTheme(scopeName); return _backend.GetTheme(scopeName);
@ -49,8 +93,7 @@ namespace SourceGit.Models
public IRawGrammar GetGrammar(string scopeName) public IRawGrammar GetGrammar(string scopeName)
{ {
var grammar = _extraGrammars.Find(x => x.GetScopeName().Equals(scopeName, StringComparison.Ordinal)); return GrammarUtility.Load(scopeName) ?? _backend.GetGrammar(scopeName);
return grammar ?? _backend.GetGrammar(scopeName);
} }
public ICollection<string> GetInjections(string scopeName) public ICollection<string> GetInjections(string scopeName)
@ -70,25 +113,11 @@ namespace SourceGit.Models
public string GetScopeByFileName(string filename) public string GetScopeByFileName(string filename)
{ {
var extension = Path.GetExtension(filename); var ext = GrammarUtility.GetExtension(filename);
if (extension == ".h") return GrammarUtility.GetScopeByExtension(ext) ?? _backend.GetScopeByExtension(ext);
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);
} }
private readonly RegistryOptions _backend; private readonly RegistryOptions _backend = new(defaultTheme);
private readonly List<IRawGrammar> _extraGrammars;
} }
public static class TextMateHelper public static class TextMateHelper

View file

@ -202,7 +202,7 @@ namespace SourceGit.Native
private void FixWindowFrameOnWin10(Window w) private void FixWindowFrameOnWin10(Window w)
{ {
if (w.WindowState != WindowState.Normal) if (w.WindowState != WindowState.Normal)
w.SystemDecorations = SystemDecorations.Full; w.SystemDecorations = SystemDecorations.Full;
else else
w.SystemDecorations = SystemDecorations.BorderOnly; w.SystemDecorations = SystemDecorations.BorderOnly;
} }

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,70 @@
{
"information_for_contributors": [
"This file has been copied from https://github.com/vshaxe/haxe-TmLanguage/blob/ddad8b4c6d0781ac20be0481174ec1be772c5da5/hxml.tmLanguage",
"and converted to JSON using https://marketplace.visualstudio.com/items?itemName=pedro-w.tmlanguage"
],
"fileTypes": [
"hxml"
],
"foldingStartMarker": "--next",
"foldingStopMarker": "\\n\\n",
"keyEquivalent": "^@H",
"name": "Hxml",
"patterns": [
{
"captures": {
"1": {
"name": "punctuation.definition.comment.hxml"
}
},
"match": "(#).*$\\n?",
"name": "comment.line.number-sign.hxml"
},
{
"begin": "(?<!\\w)(--macro)\\b",
"beginCaptures": {
"1": {
"name": "keyword.other.hxml"
}
},
"end": "\\n",
"patterns": [
{
"include": "source.hx#block-contents"
}
]
},
{
"match": "(?<!\\w)(-m|-main|--main|--run)\\b\\s*\\b(?:(([a-z][a-zA-Z0-9]*\\.)*)(_*[A-Z]\\w*))?\\b",
"captures": {
"1": {
"name": "keyword.other.hxml"
},
"2": {
"name": "support.package.hx"
},
"4": {
"name": "entity.name.type.hx"
}
}
},
{
"match": "(?<!\\w)(-cppia|-cpp?|-js|-as3|-swf-(header|version|lib(-extern)?)|-swf9?|-neko|-python|-php|-cs|-java-lib|-java|-xml|-lua|-hl|-x|-lib|-D|-resource|-exclude|-version|-v|-debug|-prompt|-cmd|-dce\\s+(std|full|no)?|--flash-strict|--no-traces|--flash-use-stage|--neko-source|--gen-hx-classes|-net-lib|-net-std|-c-arg|--each|--next|--display|--no-output|--times|--no-inline|--no-opt|--php-front|--php-lib|--php-prefix|--remap|--help-defines|--help-metas|-help|--help|-java|-cs|--js-modern|--interp|--eval|--dce|--wait|--connect|--cwd|--run).*$",
"captures": {
"1": {
"name": "keyword.other.hxml"
}
}
},
{
"match": "(?<!\\w)(--js(on)?|--lua|--swf-(header|version|lib(-extern)?)|--swf|--as3|--neko|--php|--cppia|--cpp|--cppia|--cs|--java-lib(-extern)?|--java|--jvm|--python|--hl|-p|--class-path|-L|--library|--define|-r|--resource|--cmd|-C|--verbose|--debug|--prompt|--xml|--json|--net-lib|--net-std|--c-arg|--version|--haxelib-global|-h|--main|--server-connect|--server-listen).*$",
"captures": {
"1": {
"name": "keyword.other.hxml"
}
}
}
],
"scopeName": "source.hxml",
"uuid": "CB1B853A-C4C8-42C3-BA70-1B1605BE51C1"
}