58 lines
1.5 KiB
Go
58 lines
1.5 KiB
Go
package application
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/mmmy/snapgo/internal/infrastructure/clipboard"
|
|
)
|
|
|
|
// OCRRecognizer describes a provider capable of extracting text from a PNG
|
|
// screenshot.
|
|
type OCRRecognizer interface {
|
|
RecognizeText(ctx context.Context, pngBytes []byte) (string, error)
|
|
}
|
|
|
|
// CaptureOCRService wires screenshot bytes -> OCR provider -> clipboard. It
|
|
// leaves progress reporting to the caller so native and web overlays can share
|
|
// the same status HUD.
|
|
type CaptureOCRService struct {
|
|
Recognizer OCRRecognizer
|
|
Clipboard clipboard.Writer
|
|
}
|
|
|
|
// Recognize asks the configured OCR provider to extract text from the PNG.
|
|
func (s *CaptureOCRService) Recognize(ctx context.Context, pngBytes []byte) (string, error) {
|
|
if s.Recognizer == nil {
|
|
return "", fmt.Errorf("ocr is not configured")
|
|
}
|
|
if len(pngBytes) == 0 {
|
|
return "", fmt.Errorf("empty screenshot")
|
|
}
|
|
text, err := s.Recognizer.RecognizeText(ctx, pngBytes)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
text = strings.TrimSpace(text)
|
|
if text == "" {
|
|
return "", fmt.Errorf("ocr result is empty")
|
|
}
|
|
return text, nil
|
|
}
|
|
|
|
// CopyText writes the extracted text to the clipboard.
|
|
func (s *CaptureOCRService) CopyText(_ context.Context, text string) error {
|
|
text = strings.TrimSpace(text)
|
|
if text == "" {
|
|
return fmt.Errorf("empty ocr text")
|
|
}
|
|
if s.Clipboard == nil {
|
|
return fmt.Errorf("clipboard is not configured")
|
|
}
|
|
if err := s.Clipboard.WriteText(text); err != nil {
|
|
return fmt.Errorf("clipboard write failed: %w", err)
|
|
}
|
|
return nil
|
|
}
|