Merge pull request #3259 from dmaluka/default-syntax-followup

Follow-ups after adding `default.yaml` support
This commit is contained in:
Dmytro Maluka 2024-04-21 22:48:33 +02:00 committed by GitHub
commit 169a9a65fa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 56 additions and 46 deletions

View file

@ -727,7 +727,7 @@ func findRealRuntimeSyntaxDef(name string, header *highlight.Header) *highlight.
} }
// findRuntimeSyntaxDef finds a specific syntax definition // findRuntimeSyntaxDef finds a specific syntax definition
// in the runtime files // in the built-in syntax files
func findRuntimeSyntaxDef(name string, header *highlight.Header) *highlight.Def { func findRuntimeSyntaxDef(name string, header *highlight.Header) *highlight.Def {
for _, f := range config.ListRuntimeFiles(config.RTSyntax) { for _, f := range config.ListRuntimeFiles(config.RTSyntax) {
if f.Name() == name { if f.Name() == name {
@ -740,6 +740,45 @@ func findRuntimeSyntaxDef(name string, header *highlight.Header) *highlight.Def
return nil return nil
} }
func resolveIncludes(syndef *highlight.Def) {
includes := highlight.GetIncludes(syndef)
if len(includes) == 0 {
return
}
var files []*highlight.File
for _, f := range config.ListRuntimeFiles(config.RTSyntax) {
data, err := f.Data()
if err != nil {
screen.TermMessage("Error loading syntax file " + f.Name() + ": " + err.Error())
continue
}
header, err := highlight.MakeHeaderYaml(data)
if err != nil {
screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error())
continue
}
for _, i := range includes {
if header.FileType == i {
file, err := highlight.ParseFile(data)
if err != nil {
screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error())
continue
}
files = append(files, file)
break
}
}
if len(files) >= len(includes) {
break
}
}
highlight.ResolveIncludes(syndef, files)
}
// UpdateRules updates the syntax rules and filetype for this buffer // UpdateRules updates the syntax rules and filetype for this buffer
// This is called when the colorscheme changes // This is called when the colorscheme changes
func (b *Buffer) UpdateRules() { func (b *Buffer) UpdateRules() {
@ -753,6 +792,8 @@ func (b *Buffer) UpdateRules() {
return return
} }
b.SyntaxDef = nil
// syntaxFileInfo is an internal helper structure // syntaxFileInfo is an internal helper structure
// to store properties of one single syntax file // to store properties of one single syntax file
type syntaxFileInfo struct { type syntaxFileInfo struct {
@ -828,7 +869,7 @@ func (b *Buffer) UpdateRules() {
} }
if !foundDef { if !foundDef {
// search for the syntax file in the runtime files // search for the syntax file in the built-in syntax files
for _, f := range config.ListRuntimeFiles(config.RTSyntaxHeader) { for _, f := range config.ListRuntimeFiles(config.RTSyntaxHeader) {
data, err := f.Data() data, err := f.Data()
if err != nil { if err != nil {
@ -909,53 +950,19 @@ func (b *Buffer) UpdateRules() {
b.SyntaxDef = findRuntimeSyntaxDef(syntaxFile, header) b.SyntaxDef = findRuntimeSyntaxDef(syntaxFile, header)
} }
if b.SyntaxDef != nil && highlight.HasIncludes(b.SyntaxDef) {
includes := highlight.GetIncludes(b.SyntaxDef)
var files []*highlight.File
for _, f := range config.ListRuntimeFiles(config.RTSyntax) {
data, err := f.Data()
if err != nil {
screen.TermMessage("Error loading syntax file " + f.Name() + ": " + err.Error())
continue
}
header, err := highlight.MakeHeaderYaml(data)
if err != nil {
screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error())
continue
}
for _, i := range includes {
if header.FileType == i {
file, err := highlight.ParseFile(data)
if err != nil {
screen.TermMessage("Error parsing syntax file " + f.Name() + ": " + err.Error())
continue
}
files = append(files, file)
break
}
}
if len(files) >= len(includes) {
break
}
}
highlight.ResolveIncludes(b.SyntaxDef, files)
}
if b.Highlighter == nil || syntaxFile != "" {
if b.SyntaxDef != nil { if b.SyntaxDef != nil {
b.Settings["filetype"] = b.SyntaxDef.FileType b.Settings["filetype"] = b.SyntaxDef.FileType
} else { } else {
// search for the default file in the user's custom syntax files // search for the default file in the user's custom syntax files
b.SyntaxDef = findRealRuntimeSyntaxDef("default", nil) b.SyntaxDef = findRealRuntimeSyntaxDef("default", nil)
if b.SyntaxDef == nil { if b.SyntaxDef == nil {
// search for the default file in the runtime files // search for the default file in the built-in syntax files
b.SyntaxDef = findRuntimeSyntaxDef("default", nil) b.SyntaxDef = findRuntimeSyntaxDef("default", nil)
} }
} }
if b.SyntaxDef != nil {
resolveIncludes(b.SyntaxDef)
} }
if b.SyntaxDef != nil { if b.SyntaxDef != nil {

View file

@ -392,3 +392,6 @@ example, the following is possible for html:
rules: rules:
- include: "css" - include: "css"
``` ```
Note that nested include (i.e. including syntax files that include other syntax
files) is not supported yet.