Added file input ability

pull/2/head
Aaron Johnon 1 year ago
parent 8c5a41bbd1
commit d5ddbf521c

@ -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))

Loading…
Cancel
Save