#!/usr/bin/env bash
# Function to escape JSON special characters
escape_json() {
local input="$1"
# Escape backslash, quotes, newlines, tabs, etc.
echo "$input" | sed 's/\\/\\\\/g; s/"/\\"/g; s/ /\\t/g' | tr '\n' '\\' | sed 's/\\$/\\n/g'
}
# Function to collect multiple inputs
collect_inputs() {
local inputs=()
local counter=1
echo "Enter your inputs (press CTRL+D or type 'END' to finish):"
echo "---"
while true; do
echo -n "Input $counter: "
read -r input
# Check if user wants to terminate
if [[ $? -ne 0 ]] || [[ "$input" == "END" ]]; then
break
fi
# Add input to array
inputs+=("$input")
((counter++))
done
# Generate JSON
echo
echo "JSON Output:"
echo "{"
echo ' "timestamp": "'$(date -Iseconds)'",'
echo ' "total_inputs": '${#inputs[@]}','
echo ' "inputs": ['
for i in "${!inputs[@]}"; do
local escaped=$(escape_json "${inputs[$i]}")
if [[ $i -eq $((${#inputs[@]} - 1)) ]]; then
echo " {\"id\": $((i+1)), \"value\": \"$escaped\"}"
else
echo " {\"id\": $((i+1)), \"value\": \"$escaped\"},"
fi
done
echo " ]"
echo "}"
}
# Function for single input with parameters
single_input() {
if [[ $# -eq 0 ]]; then
echo -n "Enter your input: "
read -r input
else
input="$*"
fi
local escaped=$(escape_json "$input")
echo "{"
echo ' "timestamp": "'$(date -Iseconds)'",'
echo ' "input": "'$escaped'",'
echo ' "length": '${#input}
echo "}"
}
# Help function
show_help() {
echo "Usage: $0 [OPTIONS] [TEXT]"
echo
echo "Converts user input to JSON format"
echo
echo "OPTIONS:"
echo " -m, --multiple Multiple input mode"
echo " -s, --single Single input mode (default)"
echo " -h, --help Show this help"
echo
echo "EXAMPLES:"
echo " $0 # Interactive single input"
echo " $0 \"Hello world\" # Single input from parameter"
echo " $0 -m # Interactive multiple inputs"
echo " echo \"test\" | $0 # Input from pipe"
}
# Parameter handling
case "$1" in
-h|--help)
show_help
exit 0
;;
-m|--multiple)
collect_inputs
;;
-s|--single)
shift
single_input "$@"
;;
*)
# If there's no keyboard input and no parameters, read from pipe
if [[ -t 0 ]] && [[ $# -eq 0 ]]; then
single_input
elif [[ ! -t 0 ]]; then
# Read from pipe
input=$(cat)
escaped=$(escape_json "$input")
echo "{"
echo ' "timestamp": "'$(date -Iseconds)'",'
echo ' "source": "pipe",'
echo ' "input": "'$escaped'",'
echo ' "length": '${#input}
echo "}"
else
single_input "$@"
fi
;;
esac