// Package terminal renders captions using terminal control sequences. package terminal import ( "fmt" "io" "tea.chunkbyte.com/kato/captioneer/src/captions" ) type Sink struct { writer io.Writer previewVisible bool } func New(writer io.Writer) *Sink { return &Sink{writer: writer} } func (s *Sink) Publish(event captions.Event) error { switch event.Kind { case captions.Provisional: _, err := fmt.Fprintf(s.writer, "\r\033[2K… %s", event.Text) if err == nil { s.previewVisible = true } return err case captions.Final: if err := s.clearPreview(); err != nil { return err } _, err := fmt.Fprintf(s.writer, "[%.2fs-%.2fs] %s\n", event.StartedAt.Seconds(), event.EndedAt.Seconds(), event.Text) return err case captions.Hide: return s.clearPreview() default: return fmt.Errorf("unsupported caption event kind %d", event.Kind) } } func (s *Sink) Close() error { return s.clearPreview() } func (s *Sink) clearPreview() error { if !s.previewVisible { return nil } _, err := fmt.Fprint(s.writer, "\r\033[2K") if err == nil { s.previewVisible = false } return err }