fix: loop colors correctly

This commit is contained in:
Jan De Dobbeleer 2021-12-15 20:09:17 +01:00 committed by Jan De Dobbeleer
parent 5c5f0fe157
commit e8f9bb20b0

View file

@ -165,35 +165,48 @@ func (a *AnsiWriter) write(background, foreground, text string) {
} }
func (a *AnsiWriter) asAnsiColors(background, foreground string) (AnsiColor, AnsiColor) { func (a *AnsiWriter) asAnsiColors(background, foreground string) (AnsiColor, AnsiColor) {
if backgroundValue, ok := a.isKeyword(background); ok { background = a.expandKeyword(background)
background = backgroundValue foreground = a.expandKeyword(foreground)
}
if foregroundValue, ok := a.isKeyword(foreground); ok {
foreground = foregroundValue
}
inverted := foreground == Transparent && len(background) != 0 inverted := foreground == Transparent && len(background) != 0
backgroundAnsi := a.getAnsiFromColorString(background, !inverted) backgroundAnsi := a.getAnsiFromColorString(background, !inverted)
foregroundAnsi := a.getAnsiFromColorString(foreground, false) foregroundAnsi := a.getAnsiFromColorString(foreground, false)
return backgroundAnsi, foregroundAnsi return backgroundAnsi, foregroundAnsi
} }
func (a *AnsiWriter) isKeyword(color string) (string, bool) { func (a *AnsiWriter) isKeyword(color string) bool {
switch { switch color {
case color == Background && a.Colors != nil: case Transparent, ParentBackground, ParentForeground, Background, Foreground:
return a.Colors.Background, true return true
case color == Foreground && a.Colors != nil:
return a.Colors.Foreground, true
case color == ParentBackground && a.ParentColors != nil:
return a.ParentColors.Background, true
case color == ParentForeground && a.ParentColors != nil:
return a.ParentColors.Foreground, true
case (color == ParentBackground || color == ParentForeground) && a.ParentColors == nil:
return Transparent, true
default: default:
return "", false return false
} }
} }
func (a *AnsiWriter) expandKeyword(keyword string) string {
resolveKeyword := func(keyword string) string {
switch {
case keyword == Background && a.Colors != nil:
return a.Colors.Background
case keyword == Foreground && a.Colors != nil:
return a.Colors.Foreground
case keyword == ParentBackground && a.ParentColors != nil:
return a.ParentColors.Background
case keyword == ParentForeground && a.ParentColors != nil:
return a.ParentColors.Foreground
default:
return Transparent
}
}
for ok := a.isKeyword(keyword); ok; ok = a.isKeyword(keyword) {
resolved := resolveKeyword(keyword)
if resolved == keyword {
break
}
keyword = resolved
}
return keyword
}
func (a *AnsiWriter) string() string { func (a *AnsiWriter) string() string {
return a.builder.String() return a.builder.String()
} }