213 lines
5.9 KiB
Bash
Executable File
213 lines
5.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
FORE=$1
|
|
BACK=$2
|
|
FILL=$3
|
|
|
|
if [ "$FORE" = "" ]; then
|
|
FORE=DefaultFore
|
|
fi
|
|
if [ "$BACK" = "" ]; then
|
|
BACK=DefaultBack
|
|
fi
|
|
|
|
# To detect color changes, we want a character that fills the whole cell
|
|
# if possible. U+2588 is perfect, except that it becomes invisible in the
|
|
# original xterm, when bolded. For that terminal, use something else, like
|
|
# "#" or "@".
|
|
if [ "$FILL" = "" ]; then
|
|
FILL="█"
|
|
fi
|
|
|
|
# SGR (Select Graphic Rendition)
|
|
s() {
|
|
printf '\033[0m'
|
|
while [ "$1" != "" ]; do
|
|
printf '\033['"$1"'m'
|
|
shift
|
|
done
|
|
}
|
|
|
|
# Print
|
|
p() {
|
|
echo -n "$@"
|
|
}
|
|
|
|
# Print with newline
|
|
pn() {
|
|
echo "$@"
|
|
}
|
|
|
|
# For practical reasons, sandwich black and white in-between the other colors.
|
|
FORE_COLORS="31 30 37 32 33 34 35 36"
|
|
BACK_COLORS="41 40 47 42 43 44 45 46"
|
|
|
|
|
|
|
|
### Test order of Invert(7) -- it does not matter what order it appears in.
|
|
|
|
# The Red color setting here (31) is shadowed by the green setting (32). The
|
|
# Reverse flag does not cause (32) to alter the background color immediately;
|
|
# instead, the Reverse flag is applied once to determine the final effective
|
|
# Fore/Back colors.
|
|
s 7 31 32; p " -- Should be: $BACK-on-green -- "; s; pn
|
|
s 31 7 32; p " -- Should be: $BACK-on-green -- "; s; pn
|
|
s 31 32 7; p " -- Should be: $BACK-on-green -- "; s; pn
|
|
|
|
# As above, but for the background color.
|
|
s 7 41 42; p " -- Should be: green-on-$FORE -- "; s; pn
|
|
s 41 7 42; p " -- Should be: green-on-$FORE -- "; s; pn
|
|
s 41 42 7; p " -- Should be: green-on-$FORE -- "; s; pn
|
|
|
|
# One last, related test
|
|
s 7; p "Invert text"; s 7 1; p " with some words bold"; s; pn;
|
|
s 0; p "Normal text"; s 0 1; p " with some words bold"; s; pn;
|
|
|
|
pn
|
|
|
|
|
|
|
|
### Test effect of Bold(1) on color, with and without Invert(7).
|
|
|
|
# The Bold flag does not affect the background color when Reverse is missing.
|
|
# There should always be 8 colored boxes.
|
|
p " "
|
|
for x in $BACK_COLORS; do
|
|
s $x; p "-"; s $x 1; p "-"
|
|
done
|
|
s; pn " Bold should not affect background"
|
|
|
|
# On some terminals, Bold affects color, and on some it doesn't. If there
|
|
# are only 8 colored boxes, then the next two tests will also show 8 colored
|
|
# boxes. If there are 16 boxes, then exactly one of the next two tests will
|
|
# also have 16 boxes.
|
|
p " "
|
|
for x in $FORE_COLORS; do
|
|
s $x; p "$FILL"; s $x 1; p "$FILL"
|
|
done
|
|
s; pn " Does bold affect foreground color?"
|
|
|
|
# On some terminals, Bold+Invert highlights the final Background color.
|
|
p " "
|
|
for x in $FORE_COLORS; do
|
|
s $x 7; p "-"; s $x 7 1; p "-"
|
|
done
|
|
s; pn " Test if Bold+Invert affects background color"
|
|
|
|
# On some terminals, Bold+Invert highlights the final Foreground color.
|
|
p " "
|
|
for x in $BACK_COLORS; do
|
|
s $x 7; p "$FILL"; s $x 7 1; p "$FILL"
|
|
done
|
|
s; pn " Test if Bold+Invert affects foreground color"
|
|
|
|
pn
|
|
|
|
|
|
|
|
### Test for support of ForeHi and BackHi properties.
|
|
|
|
# ForeHi
|
|
p " "
|
|
for x in $FORE_COLORS; do
|
|
hi=$(( $x + 60 ))
|
|
s $x; p "$FILL"; s $hi; p "$FILL"
|
|
done
|
|
s; pn " Test for support of ForeHi colors"
|
|
p " "
|
|
for x in $FORE_COLORS; do
|
|
hi=$(( $x + 60 ))
|
|
s $x; p "$FILL"; s $x $hi; p "$FILL"
|
|
done
|
|
s; pn " Test for support of ForeHi colors (w/compat)"
|
|
|
|
# BackHi
|
|
p " "
|
|
for x in $BACK_COLORS; do
|
|
hi=$(( $x + 60 ))
|
|
s $x; p "-"; s $hi; p "-"
|
|
done
|
|
s; pn " Test for support of BackHi colors"
|
|
p " "
|
|
for x in $BACK_COLORS; do
|
|
hi=$(( $x + 60 ))
|
|
s $x; p "-"; s $x $hi; p "-"
|
|
done
|
|
s; pn " Test for support of BackHi colors (w/compat)"
|
|
|
|
pn
|
|
|
|
|
|
|
|
### Identify the default fore and back colors.
|
|
|
|
pn "Match default fore and back colors against 16-color palette"
|
|
pn " ==fore== ==back=="
|
|
for fore in $FORE_COLORS; do
|
|
forehi=$(( $fore + 60 ))
|
|
back=$(( $fore + 10 ))
|
|
backhi=$(( $back + 60 ))
|
|
p " "
|
|
s $fore; p "$FILL"; s; p "$FILL"; s $fore; p "$FILL"; s; p " "
|
|
s $forehi; p "$FILL"; s; p "$FILL"; s $forehi; p "$FILL"; s; p " "
|
|
s $back; p "-"; s; p "-"; s $back; p "-"; s; p " "
|
|
s $backhi; p "-"; s; p "-"; s $backhi; p "-"; s; p " "
|
|
pn " $fore $forehi $back $backhi"
|
|
done
|
|
|
|
pn
|
|
|
|
|
|
|
|
### Test coloring of rest-of-line.
|
|
|
|
#
|
|
# When a new line is scrolled in, every cell in the line receives the
|
|
# current background color, which can be the default/transparent color.
|
|
#
|
|
|
|
p "Newline with red background: usually no red -->"; s 41; pn
|
|
s; pn "This text is plain, but rest is red if scrolled -->"
|
|
s; p " "; s 41; printf '\033[1K'; s; printf '\033[1C'; pn "<-- red Erase-in-Line to beginning"
|
|
s; p "red Erase-in-Line to end -->"; s 41; printf '\033[0K'; s; pn
|
|
pn
|
|
|
|
|
|
|
|
### Moving the cursor around does not change colors of anything.
|
|
|
|
pn "Test modifying uncolored lines with a colored SGR:"
|
|
pn "aaaa"
|
|
pn
|
|
pn "____e"
|
|
s 31 42; printf '\033[4C\033[3A'; pn "bb"
|
|
pn "cccc"
|
|
pn "dddd"
|
|
s; pn
|
|
|
|
pn "Test modifying colored+inverted+bold line with plain text:"
|
|
s 42 31 7 1; printf 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r';
|
|
s; pn "This text is plain and followed by green-on-red -->"
|
|
pn
|
|
|
|
|
|
|
|
### Full-width character overwriting
|
|
|
|
pn 'Overwrite part of a full-width char with a half-width char'
|
|
p 'initial U+4000 ideographs -->'; s 31 42; p '䀀䀀'; s; pn
|
|
p 'write X to index #1 -->'; s 31 42; p '䀀䀀'; s 35 44; printf '\033[24G'; p X; s; pn
|
|
p 'write X to index #2 -->'; s 31 42; p '䀀䀀'; s 35 44; printf '\033[25G'; p X; s; pn
|
|
p 'write X to index #3 -->'; s 31 42; p '䀀䀀'; s 35 44; printf '\033[26G'; p X; s; pn
|
|
p 'write X to index #4 -->'; s 31 42; p '䀀䀀'; s 35 44; printf '\033[27G'; p X; s; pn
|
|
pn
|
|
|
|
pn 'Verify that Erase-in-Line can "fix" last char in line'
|
|
p 'original -->'; s 31 42; p '䀀䀀'; s; pn
|
|
p 'overwrite -->'; s 31 42; p '䀀䀀'; s 35 44; printf '\033[30G'; p 'XXX'; s; pn
|
|
p 'overwrite + Erase-in-Line -->'; s 31 42; p '䀀䀀'; s 35 44; printf '\033[30G'; p 'XXX'; s; printf '\033[0K'; pn
|
|
p 'original -->'; s 31 42; p 'X䀀䀀'; s; pn
|
|
p 'overwrite -->'; s 31 42; p 'X䀀䀀'; s 35 44; printf '\033[30G'; p 'ーー'; s; pn
|
|
p 'overwrite + Erase-in-Line -->'; s 31 42; p 'X䀀䀀'; s 35 44; printf '\033[30G'; p 'ーー'; s; printf '\033[0K'; pn
|
|
pn
|