package highlight
import (
)
type Config struct {
Check func(n parse.Tree) error
HasCommand func(name string) bool
}
type cmdRegion struct {
seg int
cmd string
}
var MaxBlockForLate = 10 * time.Millisecond
func ( string, Config, func(ui.Text)) (ui.Text, []error) {
var []error
var []region
, := parse.Parse(parse.Source{Name: "[tty]", Code: }, parse.Config{})
if != nil {
for , := range .(*parse.Error).Entries {
if .Context.From != len() {
= append(, )
= append(,
region{
.Context.From, .Context.To,
semanticRegion, errorRegion})
}
}
}
if .Check != nil {
:= .Check()
if , := .(diag.Ranger); && .Range().From != len() {
= append(, )
= append(,
region{
.Range().From, .Range().To, semanticRegion, errorRegion})
}
}
var ui.Text
:= getRegionsInner(.Root)
= append(, ...)
= fixRegions()
:= 0
var []cmdRegion
for , := range {
if .begin > {
= append(, &ui.Segment{Text: [:.begin]})
}
:= [.begin:.end]
var ui.Styling
if .typ == commandRegion {
if .HasCommand != nil {
= append(, cmdRegion{len(), })
} else {
= stylingForGoodCommand
}
} else {
= stylingFor[.typ]
}
:= &ui.Segment{Text: }
if != nil {
= ui.StyleSegment(, )
}
= append(, )
= .end
}
if len() > {
= append(, &ui.Segment{Text: [:]})
}
if .HasCommand != nil && len() > 0 {
:= make(chan ui.Text)
go func() {
:= .Clone()
for , := range {
var ui.Styling
if .HasCommand(.cmd) {
= stylingForGoodCommand
} else {
= stylingForBadCommand
}
:= &[.seg]
* = ui.StyleSegment(*, )
}
<-
}()
select {
case := <-:
return ,
case <-time.After(MaxBlockForLate):
go func() {
(<-)
}()
return ,
}
}
return ,
}