mirror of https://github.com/tLDP/LDP
148 lines
4.3 KiB
Bash
148 lines
4.3 KiB
Bash
#!/bin/bash
|
|
# Draw-box.sh: Drawing a box using ASCII characters.
|
|
|
|
# Script by Stefano Palmeri, with minor editing by document author.
|
|
# Minor edits suggested by Jim Angstadt.
|
|
# Used in the ABS Guide with permission.
|
|
|
|
|
|
######################################################################
|
|
### draw_box function doc ###
|
|
|
|
# The "draw_box" function lets the user
|
|
#+ draw a box in a terminal.
|
|
#
|
|
# Usage: draw_box ROW COLUMN HEIGHT WIDTH [COLOR]
|
|
# ROW and COLUMN represent the position
|
|
#+ of the upper left angle of the box you're going to draw.
|
|
# ROW and COLUMN must be greater than 0
|
|
#+ and less than current terminal dimension.
|
|
# HEIGHT is the number of rows of the box, and must be > 0.
|
|
# HEIGHT + ROW must be <= than current terminal height.
|
|
# WIDTH is the number of columns of the box and must be > 0.
|
|
# WIDTH + COLUMN must be <= than current terminal width.
|
|
#
|
|
# E.g.: If your terminal dimension is 20x80,
|
|
# draw_box 2 3 10 45 is good
|
|
# draw_box 2 3 19 45 has bad HEIGHT value (19+2 > 20)
|
|
# draw_box 2 3 18 78 has bad WIDTH value (78+3 > 80)
|
|
#
|
|
# COLOR is the color of the box frame.
|
|
# This is the 5th argument and is optional.
|
|
# 0=black 1=red 2=green 3=tan 4=blue 5=purple 6=cyan 7=white.
|
|
# If you pass the function bad arguments,
|
|
#+ it will just exit with code 65,
|
|
#+ and no messages will be printed on stderr.
|
|
#
|
|
# Clear the terminal before you start to draw a box.
|
|
# The clear command is not contained within the function.
|
|
# This allows the user to draw multiple boxes, even overlapping ones.
|
|
|
|
### end of draw_box function doc ###
|
|
######################################################################
|
|
|
|
draw_box(){
|
|
|
|
#=============#
|
|
HORZ="-"
|
|
VERT="|"
|
|
CORNER_CHAR="+"
|
|
|
|
MINARGS=4
|
|
E_BADARGS=65
|
|
#=============#
|
|
|
|
|
|
if [ $# -lt "$MINARGS" ]; then # If args are less than 4, exit.
|
|
exit $E_BADARGS
|
|
fi
|
|
|
|
# Looking for non digit chars in arguments.
|
|
# Probably it could be done better (exercise for the reader?).
|
|
if echo $@ | tr -d [:blank:] | tr -d [:digit:] | grep . &> /dev/null; then
|
|
exit $E_BADARGS
|
|
fi
|
|
|
|
BOX_HEIGHT=`expr $3 - 1` # -1 correction needed because angle char "+"
|
|
BOX_WIDTH=`expr $4 - 1` #+ is a part of both box height and width.
|
|
T_ROWS=`tput lines` # Define current terminal dimension
|
|
T_COLS=`tput cols` #+ in rows and columns.
|
|
|
|
if [ $1 -lt 1 ] || [ $1 -gt $T_ROWS ]; then # Start checking if arguments
|
|
exit $E_BADARGS #+ are correct.
|
|
fi
|
|
if [ $2 -lt 1 ] || [ $2 -gt $T_COLS ]; then
|
|
exit $E_BADARGS
|
|
fi
|
|
if [ `expr $1 + $BOX_HEIGHT + 1` -gt $T_ROWS ]; then
|
|
exit $E_BADARGS
|
|
fi
|
|
if [ `expr $2 + $BOX_WIDTH + 1` -gt $T_COLS ]; then
|
|
exit $E_BADARGS
|
|
fi
|
|
if [ $3 -lt 1 ] || [ $4 -lt 1 ]; then
|
|
exit $E_BADARGS
|
|
fi # End checking arguments.
|
|
|
|
plot_char(){ # Function within a function.
|
|
echo -e "\E[${1};${2}H"$3
|
|
}
|
|
|
|
echo -ne "\E[3${5}m" # Set box frame color, if defined.
|
|
|
|
# start drawing the box
|
|
|
|
count=1 # Draw vertical lines using
|
|
for (( r=$1; count<=$BOX_HEIGHT; r++)); do #+ plot_char function.
|
|
plot_char $r $2 $VERT
|
|
let count=count+1
|
|
done
|
|
|
|
count=1
|
|
c=`expr $2 + $BOX_WIDTH`
|
|
for (( r=$1; count<=$BOX_HEIGHT; r++)); do
|
|
plot_char $r $c $VERT
|
|
let count=count+1
|
|
done
|
|
|
|
count=1 # Draw horizontal lines using
|
|
for (( c=$2; count<=$BOX_WIDTH; c++)); do #+ plot_char function.
|
|
plot_char $1 $c $HORZ
|
|
let count=count+1
|
|
done
|
|
|
|
count=1
|
|
r=`expr $1 + $BOX_HEIGHT`
|
|
for (( c=$2; count<=$BOX_WIDTH; c++)); do
|
|
plot_char $r $c $HORZ
|
|
let count=count+1
|
|
done
|
|
|
|
plot_char $1 $2 $CORNER_CHAR # Draw box angles.
|
|
plot_char $1 `expr $2 + $BOX_WIDTH` $CORNER_CHAR
|
|
plot_char `expr $1 + $BOX_HEIGHT` $2 $CORNER_CHAR
|
|
plot_char `expr $1 + $BOX_HEIGHT` `expr $2 + $BOX_WIDTH` $CORNER_CHAR
|
|
|
|
echo -ne "\E[0m" # Restore old colors.
|
|
|
|
P_ROWS=`expr $T_ROWS - 1` # Put the prompt at bottom of the terminal.
|
|
|
|
echo -e "\E[${P_ROWS};1H"
|
|
}
|
|
|
|
|
|
# Now, let's try drawing a box.
|
|
clear # Clear the terminal.
|
|
R=2 # Row
|
|
C=3 # Column
|
|
H=10 # Height
|
|
W=45 # Width
|
|
col=1 # Color (red)
|
|
draw_box $R $C $H $W $col # Draw the box.
|
|
|
|
exit 0
|
|
|
|
# Exercise:
|
|
# --------
|
|
# Add the option of printing text within the drawn box.
|