forked from toolshed/abra
		
	
		
			
				
	
	
		
			113 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package survey
 | 
						|
 | 
						|
import (
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"github.com/AlecAivazis/survey/v2/terminal"
 | 
						|
)
 | 
						|
 | 
						|
type Multiline struct {
 | 
						|
	Renderer
 | 
						|
	Message string
 | 
						|
	Default string
 | 
						|
	Help    string
 | 
						|
}
 | 
						|
 | 
						|
// data available to the templates when processing
 | 
						|
type MultilineTemplateData struct {
 | 
						|
	Multiline
 | 
						|
	Answer     string
 | 
						|
	ShowAnswer bool
 | 
						|
	ShowHelp   bool
 | 
						|
	Config     *PromptConfig
 | 
						|
}
 | 
						|
 | 
						|
// Templates with Color formatting. See Documentation: https://github.com/mgutz/ansi#style-format
 | 
						|
var MultilineQuestionTemplate = `
 | 
						|
{{- if .ShowHelp }}{{- color .Config.Icons.Help.Format }}{{ .Config.Icons.Help.Text }} {{ .Help }}{{color "reset"}}{{"\n"}}{{end}}
 | 
						|
{{- color .Config.Icons.Question.Format }}{{ .Config.Icons.Question.Text }} {{color "reset"}}
 | 
						|
{{- color "default+hb"}}{{ .Message }} {{color "reset"}}
 | 
						|
{{- if .ShowAnswer}}
 | 
						|
  {{- "\n"}}{{color "cyan"}}{{.Answer}}{{color "reset"}}
 | 
						|
  {{- if .Answer }}{{ "\n" }}{{ end }}
 | 
						|
{{- else }}
 | 
						|
  {{- if .Default}}{{color "white"}}({{.Default}}) {{color "reset"}}{{end}}
 | 
						|
  {{- color "cyan"}}[Enter 2 empty lines to finish]{{color "reset"}}
 | 
						|
{{- end}}`
 | 
						|
 | 
						|
func (i *Multiline) Prompt(config *PromptConfig) (interface{}, error) {
 | 
						|
	// render the template
 | 
						|
	err := i.Render(
 | 
						|
		MultilineQuestionTemplate,
 | 
						|
		MultilineTemplateData{
 | 
						|
			Multiline: *i,
 | 
						|
			Config:    config,
 | 
						|
		},
 | 
						|
	)
 | 
						|
	if err != nil {
 | 
						|
		return "", err
 | 
						|
	}
 | 
						|
 | 
						|
	// start reading runes from the standard in
 | 
						|
	rr := i.NewRuneReader()
 | 
						|
	_ = rr.SetTermMode()
 | 
						|
	defer func() {
 | 
						|
		_ = rr.RestoreTermMode()
 | 
						|
	}()
 | 
						|
 | 
						|
	cursor := i.NewCursor()
 | 
						|
 | 
						|
	multiline := make([]string, 0)
 | 
						|
 | 
						|
	emptyOnce := false
 | 
						|
	// get the next line
 | 
						|
	for {
 | 
						|
		var line []rune
 | 
						|
		line, err = rr.ReadLine(0)
 | 
						|
		if err != nil {
 | 
						|
			return string(line), err
 | 
						|
		}
 | 
						|
 | 
						|
		if string(line) == "" {
 | 
						|
			if emptyOnce {
 | 
						|
				numLines := len(multiline) + 2
 | 
						|
				cursor.PreviousLine(numLines)
 | 
						|
				for j := 0; j < numLines; j++ {
 | 
						|
					terminal.EraseLine(i.Stdio().Out, terminal.ERASE_LINE_ALL)
 | 
						|
					cursor.NextLine(1)
 | 
						|
				}
 | 
						|
				cursor.PreviousLine(numLines)
 | 
						|
				break
 | 
						|
			}
 | 
						|
			emptyOnce = true
 | 
						|
		} else {
 | 
						|
			emptyOnce = false
 | 
						|
		}
 | 
						|
		multiline = append(multiline, string(line))
 | 
						|
	}
 | 
						|
 | 
						|
	val := strings.Join(multiline, "\n")
 | 
						|
	val = strings.TrimSpace(val)
 | 
						|
 | 
						|
	// if the line is empty
 | 
						|
	if len(val) == 0 {
 | 
						|
		// use the default value
 | 
						|
		return i.Default, err
 | 
						|
	}
 | 
						|
 | 
						|
	i.AppendRenderedText(val)
 | 
						|
	return val, err
 | 
						|
}
 | 
						|
 | 
						|
func (i *Multiline) Cleanup(config *PromptConfig, val interface{}) error {
 | 
						|
	return i.Render(
 | 
						|
		MultilineQuestionTemplate,
 | 
						|
		MultilineTemplateData{
 | 
						|
			Multiline:  *i,
 | 
						|
			Answer:     val.(string),
 | 
						|
			ShowAnswer: true,
 | 
						|
			Config:     config,
 | 
						|
		},
 | 
						|
	)
 | 
						|
}
 |