mirror of
https://github.com/sourcegit-scm/sourcegit.git
synced 2024-12-26 21:17:20 -08:00
Compare commits
3 commits
30765cf7b3
...
4a3620db5e
Author | SHA1 | Date | |
---|---|---|---|
|
4a3620db5e | ||
|
0a4d5b8429 | ||
|
0dbca4fe47 |
4 changed files with 2627 additions and 40 deletions
|
@ -17,31 +17,75 @@ using TextMateSharp.Themes;
|
|||
|
||||
namespace SourceGit.Models
|
||||
{
|
||||
public class RegistryOptionsWrapper : IRegistryOptions
|
||||
public static class GrammarUtility
|
||||
{
|
||||
public RegistryOptionsWrapper(ThemeName defaultTheme)
|
||||
{
|
||||
_backend = new RegistryOptions(defaultTheme);
|
||||
_extraGrammars = new List<IRawGrammar>();
|
||||
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"),
|
||||
];
|
||||
|
||||
string[] extraGrammarFiles = ["toml.json", "kotlin.json"];
|
||||
foreach (var file in extraGrammarFiles)
|
||||
public static string GetExtension(string file)
|
||||
{
|
||||
var asset = AssetLoader.Open(new Uri($"avares://SourceGit/Resources/Grammars/{file}",
|
||||
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";
|
||||
|
||||
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
|
||||
{
|
||||
var grammar = GrammarReader.ReadGrammarSync(new StreamReader(asset));
|
||||
_extraGrammars.Add(grammar);
|
||||
return GrammarReader.ReadGrammarSync(new StreamReader(asset));
|
||||
}
|
||||
catch
|
||||
{
|
||||
// ignore
|
||||
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<string> 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<IRawGrammar> _extraGrammars;
|
||||
private readonly RegistryOptions _backend = new(defaultTheme);
|
||||
}
|
||||
|
||||
public static class TextMateHelper
|
||||
|
|
2488
src/Resources/Grammars/haxe.json
Normal file
2488
src/Resources/Grammars/haxe.json
Normal file
File diff suppressed because it is too large
Load diff
70
src/Resources/Grammars/hxml.json
Normal file
70
src/Resources/Grammars/hxml.json
Normal 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"
|
||||
}
|
Loading…
Reference in a new issue