| package write |
| |
| import ( |
| "errors" |
| "fmt" |
| "os" |
| "strings" |
| |
| "github.com/charmbracelet/bubbles/help" |
| "github.com/charmbracelet/bubbles/textarea" |
| tea "github.com/charmbracelet/bubbletea" |
| "github.com/charmbracelet/gum/cursor" |
| "github.com/charmbracelet/gum/internal/stdin" |
| "github.com/charmbracelet/gum/internal/timeout" |
| ) |
| |
| // Run provides a shell script interface for the text area bubble. |
| // https://github.com/charmbracelet/bubbles/textarea |
| func (o Options) Run() error { |
| in, _ := stdin.Read(stdin.StripANSI(o.StripANSI)) |
| if in != "" && o.Value == "" { |
| o.Value = strings.ReplaceAll(in, "\r", "") |
| } |
| |
| a := textarea.New() |
| a.Focus() |
| |
| a.Prompt = o.Prompt |
| a.Placeholder = o.Placeholder |
| a.ShowLineNumbers = o.ShowLineNumbers |
| a.CharLimit = o.CharLimit |
| a.MaxHeight = o.MaxLines |
| |
| style := textarea.Style{ |
| Base: o.BaseStyle.ToLipgloss(), |
| Placeholder: o.PlaceholderStyle.ToLipgloss(), |
| CursorLine: o.CursorLineStyle.ToLipgloss(), |
| CursorLineNumber: o.CursorLineNumberStyle.ToLipgloss(), |
| EndOfBuffer: o.EndOfBufferStyle.ToLipgloss(), |
| LineNumber: o.LineNumberStyle.ToLipgloss(), |
| Prompt: o.PromptStyle.ToLipgloss(), |
| } |
| |
| a.BlurredStyle = style |
| a.FocusedStyle = style |
| a.Cursor.Style = o.CursorStyle.ToLipgloss() |
| a.Cursor.SetMode(cursor.Modes[o.CursorMode]) |
| |
| a.SetWidth(o.Width) |
| a.SetHeight(o.Height) |
| a.SetValue(o.Value) |
| |
| m := model{ |
| textarea: a, |
| header: o.Header, |
| headerStyle: o.HeaderStyle.ToLipgloss(), |
| autoWidth: o.Width < 1, |
| help: help.New(), |
| showHelp: o.ShowHelp, |
| keymap: defaultKeymap(), |
| } |
| |
| m.textarea.KeyMap.InsertNewline = m.keymap.InsertNewline |
| |
| ctx, cancel := timeout.Context(o.Timeout) |
| defer cancel() |
| |
| p := tea.NewProgram( |
| m, |
| tea.WithOutput(os.Stderr), |
| tea.WithReportFocus(), |
| tea.WithContext(ctx), |
| ) |
| tm, err := p.Run() |
| if err != nil { |
| return fmt.Errorf("failed to run write: %w", err) |
| } |
| m = tm.(model) |
| if !m.submitted { |
| return errors.New("not submitted") |
| } |
| fmt.Println(m.textarea.Value()) |
| return nil |
| } |