55 lines
1.1 KiB
Go
55 lines
1.1 KiB
Go
// 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
|
||
|
|
}
|