Skip to content

Commit

Permalink
feat: allow color templates
Browse files Browse the repository at this point in the history
relates to #397
  • Loading branch information
JanDeDobbeleer committed Feb 13, 2021
1 parent acfda5c commit 375184c
Show file tree
Hide file tree
Showing 3 changed files with 132 additions and 27 deletions.
24 changes: 10 additions & 14 deletions src/engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ func (e *engine) getPowerlineColor(foreground bool) string {
if foreground && e.previousActiveSegment.Style != Powerline {
return Transparent
}
return e.previousActiveSegment.Background
return e.previousActiveSegment.background()
}

func (e *engine) writePowerLineSeparator(background, foreground string, end bool) {
Expand All @@ -58,12 +58,12 @@ func (e *engine) endPowerline() {
e.activeSegment.Style != Powerline &&
e.previousActiveSegment != nil &&
e.previousActiveSegment.Style == Powerline {
e.writePowerLineSeparator(e.getPowerlineColor(false), e.previousActiveSegment.Background, true)
e.writePowerLineSeparator(e.getPowerlineColor(false), e.previousActiveSegment.background(), true)
}
}

func (e *engine) renderPowerLineSegment(text string) {
e.writePowerLineSeparator(e.activeSegment.Background, e.getPowerlineColor(true), false)
e.writePowerLineSeparator(e.activeSegment.background(), e.getPowerlineColor(true), false)
e.renderText(text)
}

Expand All @@ -72,22 +72,22 @@ func (e *engine) renderPlainSegment(text string) {
}

func (e *engine) renderDiamondSegment(text string) {
e.color.write(Transparent, e.activeSegment.Background, e.activeSegment.LeadingDiamond)
e.color.write(Transparent, e.activeSegment.background(), e.activeSegment.LeadingDiamond)
e.renderText(text)
e.color.write(Transparent, e.activeSegment.Background, e.activeSegment.TrailingDiamond)
e.color.write(Transparent, e.activeSegment.background(), e.activeSegment.TrailingDiamond)
}

func (e *engine) renderText(text string) {
defaultValue := " "
if e.activeSegment.Background != "" {
defaultValue = fmt.Sprintf("<%s>\u2588</>", e.activeSegment.Background)
if e.activeSegment.background() != "" {
defaultValue = fmt.Sprintf("<%s>\u2588</>", e.activeSegment.background())
}

text = e.color.formats.generateHyperlink(text)

prefix := e.activeSegment.getValue(Prefix, defaultValue)
postfix := e.activeSegment.getValue(Postfix, defaultValue)
e.color.write(e.activeSegment.Background, e.activeSegment.Foreground, fmt.Sprintf("%s%s%s", prefix, text, postfix))
e.color.write(e.activeSegment.background(), e.activeSegment.foreground(), fmt.Sprintf("%s%s%s", prefix, text, postfix))
}

func (e *engine) renderSegmentText(text string) {
Expand All @@ -112,12 +112,10 @@ func (e *engine) renderBlockSegments(block *Block) string {
}
e.activeSegment = segment
e.endPowerline()
e.activeSegment.Background = segment.props.background
e.activeSegment.Foreground = segment.props.foreground
e.renderSegmentText(segment.stringValue)
}
if e.previousActiveSegment != nil && e.previousActiveSegment.Style == Powerline {
e.writePowerLineSeparator(Transparent, e.previousActiveSegment.Background, true)
e.writePowerLineSeparator(Transparent, e.previousActiveSegment.background(), true)
}
return e.color.string()
}
Expand Down Expand Up @@ -211,11 +209,9 @@ func (e *engine) debug() {
segmentTiming.stringDuration = time.Since(start)
e.previousActiveSegment = nil
e.activeSegment = segment
e.activeSegment.Background = segment.props.background
e.activeSegment.Foreground = segment.props.foreground
e.renderSegmentText(segmentTiming.stringValue)
if e.activeSegment.Style == Powerline {
e.writePowerLineSeparator(Transparent, e.activeSegment.Background, true)
e.writePowerLineSeparator(Transparent, e.activeSegment.background(), true)
}
segmentTiming.stringValue = e.color.string()
e.color.builder.Reset()
Expand Down
62 changes: 49 additions & 13 deletions src/segment.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,21 @@ import (

// Segment represent a single segment and it's configuration
type Segment struct {
Type SegmentType `json:"type"`
Style SegmentStyle `json:"style"`
PowerlineSymbol string `json:"powerline_symbol"`
InvertPowerline bool `json:"invert_powerline"`
Foreground string `json:"foreground"`
Background string `json:"background"`
LeadingDiamond string `json:"leading_diamond"`
TrailingDiamond string `json:"trailing_diamond"`
Properties map[Property]interface{} `json:"properties"`
props *properties
writer SegmentWriter
stringValue string
active bool
Type SegmentType `json:"type"`
Style SegmentStyle `json:"style"`
PowerlineSymbol string `json:"powerline_symbol"`
InvertPowerline bool `json:"invert_powerline"`
Foreground string `json:"foreground"`
ForegroundTemplates []string `json:"foreground_templates"`
Background string `json:"background"`
BackgroundTemplates []string `json:"background_templates"`
LeadingDiamond string `json:"leading_diamond"`
TrailingDiamond string `json:"trailing_diamond"`
Properties map[Property]interface{} `json:"properties"`
props *properties
writer SegmentWriter
stringValue string
active bool
}

// SegmentWriter is the interface used to define what and if to write to the prompt
Expand Down Expand Up @@ -123,6 +125,40 @@ func (segment *Segment) shouldIgnoreFolder(cwd string) bool {
return false
}

func (segment *Segment) getColor(templates []string, defaultColor string) string {
if len(templates) == 0 {
return defaultColor
}
txtTemplate := &textTemplate{
Context: segment.writer,
}
for _, template := range templates {
txtTemplate.Template = template
value := txtTemplate.render()
if value == "" {
continue
}
return value
}
return defaultColor
}

func (segment *Segment) foreground() string {
color := segment.Foreground
if segment.props != nil {
color = segment.props.foreground
}
return segment.getColor(segment.ForegroundTemplates, color)
}

func (segment *Segment) background() string {
color := segment.Background
if segment.props != nil {
color = segment.props.background
}
return segment.getColor(segment.BackgroundTemplates, color)
}

func (segment *Segment) mapSegmentWithWriter(env environmentInfo) error {
functions := map[SegmentType]SegmentWriter{
Session: &session{},
Expand Down
73 changes: 73 additions & 0 deletions src/segment_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,3 +109,76 @@ func TestShouldIgnoreFolderRegexInvertedNonEscaped(t *testing.T) {
}()
segment.shouldIgnoreFolder(cwd)
}

func TestGetColors(t *testing.T) {
cases := []struct {
Case string
Background bool
ExpectedString string
Templates []string
DefaultColor string
Region string
Profile string
}{
{Case: "No template - foreground", ExpectedString: "color", Background: false, DefaultColor: "color"},
{Case: "No template - background", ExpectedString: "color", Background: true, DefaultColor: "color"},
{Case: "Nil template", ExpectedString: "color", DefaultColor: "color", Templates: nil},
{
Case: "Template - default",
ExpectedString: "color",
DefaultColor: "color",
Templates: []string{
"{{if contains \"john\" .Profile}}color2{{end}}",
},
Profile: "doe",
},
{
Case: "Template - override",
ExpectedString: "color2",
DefaultColor: "color",
Templates: []string{
"{{if contains \"john\" .Profile}}color2{{end}}",
},
Profile: "john",
},
{
Case: "Template - override multiple",
ExpectedString: "color3",
DefaultColor: "color",
Templates: []string{
"{{if contains \"doe\" .Profile}}color2{{end}}",
"{{if contains \"john\" .Profile}}color3{{end}}",
},
Profile: "john",
},
{
Case: "Template - override multiple no match",
ExpectedString: "color",
DefaultColor: "color",
Templates: []string{
"{{if contains \"doe\" .Profile}}color2{{end}}",
"{{if contains \"philip\" .Profile}}color3{{end}}",
},
Profile: "john",
},
}
for _, tc := range cases {
segment := &Segment{
writer: &aws{
Profile: tc.Profile,
Region: tc.Region,
},
}
if tc.Background {
segment.Background = tc.DefaultColor
segment.BackgroundTemplates = tc.Templates
color := segment.background()
assert.Equal(t, tc.ExpectedString, color, tc.Case)
continue
}
segment.Foreground = tc.DefaultColor
segment.ForegroundTemplates = tc.Templates
color := segment.foreground()
assert.Equal(t, tc.ExpectedString, color, tc.Case)
}
}

0 comments on commit 375184c

Please sign in to comment.