2022-05-14 03:16:03 +08:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
|
|
|
# Tester for various SGR attributes.
|
|
|
|
# Copyright (C) 2017 Egmont Koblinger
|
|
|
|
#
|
2024-04-24 17:50:07 +08:00
|
|
|
# This program is free software: you can redistribute it and/or modify
|
2022-05-14 03:16:03 +08:00
|
|
|
# it under the terms of the GNU General Public License as published by
|
2024-04-24 17:50:07 +08:00
|
|
|
# the Free Software Foundation, either version 3 of the License, or
|
2022-05-14 03:16:03 +08:00
|
|
|
# (at your option) any later version.
|
|
|
|
#
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
#
|
2024-04-24 17:50:07 +08:00
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
2022-05-14 03:16:03 +08:00
|
|
|
|
|
|
|
words=( Efg Ijk Pqr Xyz)
|
|
|
|
words_comment=(normal "green text" "magenta background" "bright red underline")
|
|
|
|
words_start=( "" 32 45 58:5:9)
|
|
|
|
words_end=( "" 39 49 59)
|
|
|
|
|
2024-04-24 17:50:07 +08:00
|
|
|
attr_name=(bold dim italic underline underline "double underline" "double underline" "curly underline" "dotted underline" "dashed underline" blink reverse hidden strikethrough overline)
|
|
|
|
attr_start=( 1 2 3 4 4:1 21 4:2 4:3 4:4 4:5 5 7 8 9 53)
|
|
|
|
attr_end=( 22 22 23 24 4:0 24 4:0 4:0 4:0 4:0 25 27 28 29 55)
|
2022-05-14 03:16:03 +08:00
|
|
|
|
|
|
|
col_name=("normal")
|
|
|
|
col_start=("")
|
|
|
|
col_end=("")
|
|
|
|
|
|
|
|
row_name=("normal")
|
|
|
|
row_start=("")
|
|
|
|
row_end=("")
|
|
|
|
|
|
|
|
# Construct the cell's contents
|
|
|
|
cell=""
|
|
|
|
cell_width=0
|
|
|
|
for (( i = 0; i < ${#words[@]}; i++ )); do
|
|
|
|
if [ $i != 0 ]; then
|
|
|
|
cell="$cell "
|
|
|
|
cell_width=$((cell_width+1))
|
|
|
|
fi
|
|
|
|
if [ -n "${words_start[i]}" ]; then
|
|
|
|
cell="$cell"$'\e['"${words_start[i]}m"
|
|
|
|
fi
|
|
|
|
cell="$cell${words[i]}"
|
|
|
|
cell_width=$((cell_width+${#words[i]}))
|
|
|
|
if [ -n "${words_end[i]}" ]; then
|
|
|
|
cell="$cell"$'\e['"${words_end[i]}m"
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
# Fill up the row_* arrays based on attr_*.
|
|
|
|
col1_width=6
|
|
|
|
for (( i = 0; i < ${#attr_name[@]}; i++ )); do
|
|
|
|
rn="${attr_name[i]} (${attr_start[i]}/${attr_end[i]})"
|
|
|
|
if [ ${#rn} -gt $col1_width ]; then
|
|
|
|
col1_width=${#rn}
|
|
|
|
fi
|
|
|
|
row_name+=("$rn")
|
|
|
|
row_start+=($'\e['"${attr_start[i]}m")
|
|
|
|
row_end+=($'\e['"${attr_end[i]}m")
|
|
|
|
done
|
|
|
|
|
|
|
|
# Fill up the col_* arrays based on the cmdline parameters
|
|
|
|
for arg; do
|
|
|
|
name=""
|
|
|
|
start=""
|
|
|
|
end=""
|
|
|
|
IFS="+" read -r -a codes <<< "$arg"
|
|
|
|
for code in "${codes[@]}"; do
|
|
|
|
for (( i = 0; i < ${#attr_name[@]}; i++ )); do
|
|
|
|
if [ "$code" = "${attr_name[i]}" -o "$code" = "${attr_start[i]}" ]; then
|
|
|
|
if [ -n "$name" ]; then
|
|
|
|
name="$name + "
|
|
|
|
fi
|
|
|
|
name="$name${attr_name[i]} (${attr_start[i]}/${attr_end[i]})"
|
|
|
|
start="$start"$'\e['"${attr_start[i]}m"
|
|
|
|
end=$'\e['"${attr_end[i]}m$end"
|
|
|
|
break
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
done
|
|
|
|
if [ -n "$name" ]; then
|
|
|
|
col_name+=("$name")
|
|
|
|
col_start+=("$start")
|
|
|
|
col_end+=("$end")
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
|
|
echo "Hint:"
|
|
|
|
echo " Specify command line arguments (attribute names or starting numbers)"
|
|
|
|
echo " to create columns for them. Use the + sign to enable more attributes at once."
|
|
|
|
echo " E.g.: ${0##*/} 1 7+8, or ${0##*/} bold reverse+hidden."
|
|
|
|
echo
|
|
|
|
|
|
|
|
echo "Sample text is:"
|
|
|
|
for (( i = 0; i < ${#words[@]}; i++ )); do
|
|
|
|
echo -n " ${words[i]}: ${words_comment[i]}"
|
|
|
|
if [ -n "${words_start[i]}" -o -n "${words_end[i]}" ]; then
|
|
|
|
echo -n " (${words_start[i]}/${words_end[i]})"
|
|
|
|
fi
|
|
|
|
echo
|
|
|
|
done
|
|
|
|
echo
|
|
|
|
|
|
|
|
# Print the top header, using multiple lines if necessary
|
|
|
|
again=1
|
|
|
|
while [ $again = 1 ]; do
|
|
|
|
again=0
|
|
|
|
printf "%${col1_width}s"
|
|
|
|
for (( col = 0; col < ${#col_end[@]}; col++ )); do
|
|
|
|
echo -n " "
|
|
|
|
printf "%-${cell_width}.${cell_width}s" "${col_name[col]}"
|
|
|
|
col_name[col]="${col_name[col]:cell_width}"
|
|
|
|
if [ -n "${col_name[col]}" ]; then
|
|
|
|
again=1
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
echo
|
|
|
|
done
|
|
|
|
|
|
|
|
# Print the body of the table
|
|
|
|
for (( row = 0; row < ${#row_end[@]}; row++ )); do
|
|
|
|
printf "%-${col1_width}.${col1_width}s" "${row_name[row]}"
|
|
|
|
for (( col = 0; col < ${#col_end[@]}; col++ )); do
|
|
|
|
echo -n " "
|
|
|
|
echo -n "${row_start[row]}"
|
|
|
|
echo -n "${col_start[col]}"
|
|
|
|
echo -n "$cell"
|
|
|
|
echo -n "${col_end[col]}"
|
|
|
|
echo -n "${row_end[row]}"
|
|
|
|
done
|
|
|
|
echo
|
|
|
|
done
|