ao-mud is a spellbook of well-commented atomic bash scripts that each do one thing. we are building semantic building blocks for an autonomously-evolving digital spellcasting language.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
2.0 KiB

#!/bin/sh
# This script displays a menu to install recommended free software.
. colors
# Catch Ctrl-C and exit
handle_ctrl_c() {
trap 'echo exiting; exit' INT
}
handle_ctrl_c
# Calculate the length of a string
strlen() {
echo -n "$1" | wc -c
}
# Calculate maximum of two numbers
max() {
[ "$1" -gt "$2" ] && echo "$1" || echo "$2"
}
script_dir="$(dirname "$0")"
while true; do
max_name_length=0
max_status_length=0
formatted_items=""
# First pass: calculate maximum lengths
for d in $(find "$script_dir" -maxdepth 1 -mindepth 1 -type d); do
name=$(basename "$d")
status=$(command -v "${name}-status" >/dev/null 2>&1 && eval "${name}-status" || echo "coming soon")
# Update maximum lengths
max_name_length=$(max "$max_name_length" "$(strlen "$name")")
max_status_length=$(max "$max_status_length" "$(strlen "$status")")
done
# Second pass: create menu items using the maximum lengths
for d in $(find "$script_dir" -maxdepth 1 -mindepth 1 -type d); do
name=$(basename "$d")
status=$(command -v "${name}-status" >/dev/null 2>&1 && eval "${name}-status" || echo "coming soon")
menu_command="${name}-menu"
# Calculate padding for the name and status
name_padding=$(( max_name_length - $(strlen "$name") ))
status_length=$(strlen "$status")
total_padding=$(( max_status_length - status_length ))
left_padding=$(( total_padding / 2 ))
right_padding=$(( total_padding - left_padding ))
# Build the formatted item string piece by piece
formatted_item="${name}$(printf "%${name_padding}s")"
formatted_item="${formatted_item}$(printf "%${left_padding}s")"
formatted_item="${formatted_item}${status}"
formatted_item="${formatted_item}$(printf "%${right_padding}s")"
# Add formatted item to the list of menu items
formatted_items="${formatted_items} \"${formatted_item}%${menu_command}\""
done
# Add Exit command
formatted_items="${formatted_items} \"Exit%kill -2 $$\""
# Display the menu
eval "menu \"Install Menu:\" $formatted_items"
done