Files
neofetch-themes/small/bmofetch/bmosay.sh
T
2024-07-31 16:33:27 +02:00

183 lines
6.4 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# This script replaces the text in the ASCII file and the configuration file,
# to make BMO say the specified string. https://github.com/Chick2D/neofetch-themes/blob/main/small/bmofetch/
# Made by https://github.com/donatienLeray
# Global variable for flags
VERBOSE=false
QUIET=false
RANDOM_MODE=false
# Function to replace a specific line of a file wih a new string
replace_string_in_file() {
local file_path="$1"
local line_number="$2"
local new_string="$3"
# Check if the file exists
if [ ! -f "$file_path" ]; then
if [[ "$QUIET" = false ]]; then
echo -e "\033[31mError: File '$file_path' not found.\033[39m" >&2
fi
exit 1
fi
# Check if the line number is valid
total_lines=$(wc -l < "$file_path")
if [ "$line_number" -gt "$total_lines" ] || [ "$line_number" -lt 1 ]; then
if [[ "$QUIET" = false ]]; then
echo -e "\033[31mError: Line number $line_number is out of range.\033[39m" >&2
fi
exit 1
fi
# Replace the specified line with the new string
if ! sed -i "${line_number}s/.*/${new_string}/" "$file_path"; then
if [[ "$QUIET" = false ]]; then
echo -e "\033[31mError: Failed to replace line $line_number in file '$file_path'\033[39m\n with: $new_string" >&2
fi
exit 1
fi
# Debug message for verbose flag
if [[ "$VERBOSE" = true ]]; then
echo "replaced line $line_number in $file_path with '$new_string'"
fi
}
# Function to print the help message
print_help() {
echo
echo -e "\u001b[1mSYNOPSIS:"
echo -e " sh $0 [options] <argument>\u001b[0m"
echo
echo -e "\u001b[1mDESCRIPTION:\u001b[0m"
echo " This script enables you to change the text BMO says when using neofetch with the bmofetch.conf file."
echo " You can specify a new string for BMO to say, or get a random line from a file."
echo " you can find the complete neofetch-themes repository at https://github.com/donatienLeray"
echo
echo -e "\u001b[1mOPTIONS:\u001b[0m"
echo " -v, --verbose Enable verbose mode.(prints debug messages)"
echo " -q, --quiet Suppress output."
echo " -r, --random Specify a file to get a random line from."
echo " -h, --help Display this help message and exit."
echo " -vq, -qv Enable both verbose and quiet mode.(only prints debug messages)"
echo " -**,-*** Any combination of r, v, q can be used instead of the above"
echo
echo -e "\u001b[1mEXAMPLES:\u001b[0m"
echo -e " sh $0 \"Hello, world!\""
echo " sh $0 -vq --random file.txt"
echo " sh $0 -qr file.txt"
echo " sh $0 --help"
echo
exit 0
}
# Check if the correct number of arguments is provided
if [[ "$#" -lt 1 ]] || [[ "$#" -gt 4 ]]; then
printf "Usage: sh %s [-v|--verbose] [-q|--quiet] [-r|--random <file>] <new_string> [-h| --help] \n" "$0" >&2
exit 0
fi
# Parse arguments
# getops couldn't be used here bc. it doesn't support long options
while [[ "$#" -gt 0 ]]; do
case "$1" in
-v|--verbose) VERBOSE=true ;;
-q|--quiet) QUIET=true ;;
-r|--random) RANDOM_MODE=true;;
-h|--help) print_help ;;
-vq|-qv) VERBOSE=true; QUIET=true ;;
-rv|-vr) RANDOM_MODE=true; VERBOSE=true ;;
-rq|-qr) RANDOM_MODE=true; QUIET=true ;;
-rvq|-rqv|-vqr|-vrq|-qrv|-qvr) RANDOM_MODE=true; VERBOSE=true; QUIET=true ;;
*) break ;;
esac
shift
done
# If the random_mode flag is set
if [[ "$RANDOM_MODE" = true ]]; then
# Check if the file exists
if [ ! -f "$1" ]; then
if [[ "$QUIET" = false ]]; then
echo -e "\033[31mError: File '$1' not found.\033[39m" >&2
fi
exit 1
fi
# Get a random line from the file as the input
input=$(shuf -n 1 $1)
else
# Get the input string
input=$(echo "$1")
fi
# Clean up multiple and leading or trailing spaces
input=$(echo "$input" | tr -s ' '| sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
# Get the inner size of the speach bubble
bub_len=$((${#input}+2))
# Make the top line "ˏ______ˎ"
top_line=$(printf '_%.0s' $(seq 1 $bub_len))ˎ"
# Make center text "| text |"
center_text="\| $input \|"
# Make the bottom line "`ˉˉˉˉˉˉ´"
bottom_line="\`$(printf 'ˉ%.0s' $(seq 1 $bub_len))\´"
# The Speach bubble has to be cut in two parts:
# The first part will be in the ASCII file and the second part will be in the config file
# Default case for start part of the speach bubble
start_top_line="$top_line"
start_center_text="$center_text"
start_bottom_line="$bottom_line"
# Deafault case for end part of the speach bubble
end_top_line=""
end_center_line=""
end_bottom_line=""
# If input string was not empty
if [ "$bub_len" -gt 2 ]; then
# Get the 4 first chars of the lines
start_top_line=${top_line:0:4}
start_center_text=${center_text:0:5}
start_bottom_line=${bottom_line:0:4}
# Get rest chars of the lines
end_top_line=${top_line: 4}
end_center_line=${center_text: 5}
end_bottom_line=${bottom_line: 4}
fi
# If the text part that gets rendered though the neofetch conf (using prin)
# has a leading space, let it get rendered as ascii instead (prin does not render leading spaces)
if [[ $end_center_line =~ ^[[:space:]].* ]]; then
start_center_text="$center_text"
end_center_line="" #This will print a single whitespace overlapping the ascii
fi
# Get the path of the script
SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
# Path to the ASCII file and the configuration file
ascii_file="$SCRIPTPATH/bmo.txt"
conf_file="$SCRIPTPATH/bmofetch.conf"
# Make the first part of the speak bubble in the ascii file (2 chars of the text)
replace_string_in_file "$ascii_file" "1" "\\\u001b[1m $start_top_line"
replace_string_in_file "$ascii_file" "2" "\\\033[36m ˏ________ˎ \\\033[39m$start_center_text"
replace_string_in_file "$ascii_file" "3" "\\\033[36m \\/|\\\033[39m ______\\\033[36m | \\\033[39m \\/$start_bottom_line"
# Make the end part of the speak bubble in the conf file (form the third text char to the end)
replace_string_in_file "$conf_file" "5" " prin \"$end_top_line\""
replace_string_in_file "$conf_file" "6" " prin \"$end_center_line\""
replace_string_in_file "$conf_file" "7" " prin \"$end_bottom_line\""
# Success message (if not quiet)
if [[ "$QUIET" = false ]]; then
echo -e "\033[32mSuccess: BMO now says \"$input\"\033[39m"
fi
exit 0