package pager import ( "fmt" "regexp" "github.com/charmbracelet/bubbles/help" "github.com/charmbracelet/bubbles/viewport" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/gum/internal/stdin" "github.com/charmbracelet/gum/internal/timeout" ) // Run provides a shell script interface for the viewport bubble. // https://github.com/charmbracelet/bubbles/viewport func (o Options) Run() error { vp := viewport.New(o.Style.Width, o.Style.Height) vp.Style = o.Style.ToLipgloss() if o.Content == "" { stdin, err := stdin.Read() if err != nil { return fmt.Errorf("unable to read stdin") } if stdin != "" { // Sanitize the input from stdin by removing backspace sequences. backspace := regexp.MustCompile(".\x08") o.Content = backspace.ReplaceAllString(stdin, "") } else { return fmt.Errorf("provide some content to display") } } m := model{ viewport: vp, help: help.New(), content: o.Content, origContent: o.Content, showLineNumbers: o.ShowLineNumbers, lineNumberStyle: o.LineNumberStyle.ToLipgloss(), softWrap: o.SoftWrap, matchStyle: o.MatchStyle.ToLipgloss(), matchHighlightStyle: o.MatchHighlightStyle.ToLipgloss(), keymap: defaultKeymap(), } ctx, cancel := timeout.Context(o.Timeout) defer cancel() _, err := tea.NewProgram( m, tea.WithAltScreen(), tea.WithReportFocus(), tea.WithContext(ctx), ).Run() if err != nil { return fmt.Errorf("unable to start program: %w", err) } return nil }