diff --git a/numberstation.go b/numberstation.go index 4111c44..ae0145f 100644 --- a/numberstation.go +++ b/numberstation.go @@ -7,6 +7,8 @@ import ( "strings" "time" "flag" + "bufio" + "os" "github.com/chzyer/readline" "github.com/gopxl/beep" @@ -39,55 +41,72 @@ func main() { } } - // Configure readline settings - rl, err := readline.NewEx(&readline.Config{ - Prompt: "> ", // Use a simple prompt for each line input - InterruptPrompt: "^C", - EOFPrompt: "exit", - FuncFilterInputRune: uppercaseFilter, // Filter to show uppercase - }) - if err != nil { - fmt.Printf("Error initializing readline: %s\n", err) - return - } - defer rl.Close() + var input string - // Inform the user about how to enter input - fmt.Println("Enter text to be read (A-Z and 0-9 only). Press Enter on a blank line to process:") - - var inputBuilder strings.Builder - for { - line, err := rl.Readline() - if err != nil { - if err.Error() == "EOF" { - fmt.Println("Exiting.") - return - } + // Check if input is being redirected from a file + if isInputFromPipe() { + // Read from stdin (file input) + scanner := bufio.NewScanner(os.Stdin) + var inputBuilder strings.Builder + for scanner.Scan() { + line := scanner.Text() + inputBuilder.WriteString(line + "\n") + } + if err := scanner.Err(); err != nil { fmt.Printf("Error reading input: %s\n", err) return } + input = inputBuilder.String() + } else { + // Use readline for interactive input + rl, err := readline.NewEx(&readline.Config{ + Prompt: "> ", // Use a simple prompt for each line input + InterruptPrompt: "^C", + EOFPrompt: "exit", + FuncFilterInputRune: uppercaseFilter, // Filter to show uppercase + }) + if err != nil { + fmt.Printf("Error initializing readline: %s\n", err) + return + } + defer rl.Close() - // Check if the user entered a blank line to finish input - if strings.TrimSpace(line) == "" { - break + // Inform the user about how to enter input + fmt.Println("Enter text to be read (A-Z and 0-9 only). Press Enter on a blank line to process:") + + var inputBuilder strings.Builder + for { + line, err := rl.Readline() + if err != nil { + if err.Error() == "EOF" { + fmt.Println("Exiting.") + return + } + fmt.Printf("Error reading input: %s\n", err) + return + } + + // Check if the user entered a blank line to finish input + if strings.TrimSpace(line) == "" { + break + } + + // Append the line to the input builder + inputBuilder.WriteString(line + "\n") } - // Append the line to the input builder - inputBuilder.WriteString(line + "\n") + input = inputBuilder.String() } - // Get the complete input as a string - input := inputBuilder.String() + // Process the input input = strings.ToLower(strings.TrimSpace(input)) - - // Split the input into sections and process each section sections := strings.FieldsFunc(input, func(r rune) bool { return r == ' ' || r == '-' || r == '_' }) - fmt.Println("Playback starting...") + fmt.Println("Beginning playback...") + for _, section := range sections { - // Determine the number of times to read each section numRepeats := 1 if *repeat { numRepeats = 2 @@ -115,6 +134,12 @@ func main() { fmt.Println("Playback finished. Exiting.") } +// Function to check if input is from a pipe or file +func isInputFromPipe() bool { + fileInfo, _ := os.Stdin.Stat() + return (fileInfo.Mode() & os.ModeCharDevice) == 0 +} + // Function to play sound func playSound(soundData []byte) { streamer, format, err := wav.Decode(bytes.NewReader(soundData))