11#! /bin/bash
22
3+ TOP_MARGIN=6
34BLUE=' \033[36m'
45NC=' \033[0m'
56
@@ -34,37 +35,105 @@ ERRORS=(
3435 " stack_overflow"
3536)
3637
38+ visible_len () {
39+ local line=" $1 "
40+
41+ line=$( echo -e " $line " | sed -E ' s/\x1B\[[0-9;]*[mK]//g' )
42+
43+ printf " %s" " $line " | wc -m
44+ }
45+
46+ get_max_width () {
47+ local text=" $1 "
48+ local max=0
49+
50+ while IFS= read -r line; do
51+ local len
52+ len=$( visible_len " $line " )
53+
54+ if (( len > max )) ; then
55+ max=$len
56+ fi
57+ done <<< " $text"
58+
59+ echo " $max "
60+ }
61+
62+ get_left_padding () {
63+ local text=" $1 "
64+ local terminal_width
65+ local text_width
66+ local padding
67+
68+ terminal_width=$( tput cols)
69+ text_width=$( get_max_width " $text " )
70+
71+ padding=$(( (terminal_width - text_width) / 2 ))
72+
73+ if (( padding < 0 )) ; then
74+ padding=0
75+ fi
76+
77+ echo " $padding "
78+ }
79+
80+ print_with_padding () {
81+ local text=" $1 "
82+ local padding=" $2 "
83+
84+ while IFS= read -r line; do
85+ printf " %*s%b\n" " $padding " " " " $line "
86+ done <<< " $text"
87+ }
88+
3789while true ; do
38- clear
39- echo -e " ${BLUE}${asciiart}${NC} "
90+ clear
91+
92+ for (( i = 0 ; i < TOP_MARGIN; i++ )) ; do
93+ echo
94+ done
95+
96+ PADDING=$( get_left_padding " $asciiart " )
97+
98+ print_with_padding " ${BLUE}${asciiart}${NC} " " $PADDING "
4099 echo
100+
41101 for i in " ${! ERRORS[@]} " ; do
42- printf " % 2d) %s\n" " $(( i+ 1 )) " " ${ERRORS[$i]} "
102+ printf " %*s% 2d) %s\n" " $PADDING " " " " $(( i+ 1 )) " " ${ERRORS[$i]} "
43103 done
44- echo " q) Sair "
45- read -p " Sua escolha: " ESCOLHA
104+
105+ printf " %*s q) Sair\n " " $PADDING " " "
46106 echo
47-
107+
108+ printf " %*sSua escolha: " " $PADDING " " "
109+ read -r ESCOLHA
110+ echo
111+
48112 case " $ESCOLHA " in
49113 q|Q)
50114 break
51115 ;;
52116 * )
53117 if [[ " $ESCOLHA " =~ ^[0-9]+$ ]]; then
54118 INDEX=$(( ESCOLHA- 1 ))
119+
55120 if [ -n " ${ERRORS[$INDEX]} " ]; then
56121 EXECUTAVEL=" ${ERRORS[$INDEX]} "
57- echo " === Executando '$EXECUTAVEL ' ==="
122+
123+ printf " %*s=== Executando '%s' ===\n" " $PADDING " " " " $EXECUTAVEL "
58124 echo
59125 ./" $EXECUTAVEL "
60126 else
61- echo " Opção inválida."
127+ printf " %*sOpção inválida.\n " " $PADDING " " "
62128 fi
63129 else
64- echo " Opção inválida."
130+ printf " %*sOpção inválida.\n " " $PADDING " " "
65131 echo
66132 fi
67- read -p " Pressione Enter para continuar..."
133+
134+ echo
135+ printf " %*sPressione Enter para continuar..." " $PADDING " " "
136+ read -r
68137 ;;
69138 esac
70139done
0 commit comments