- #! /bin/bash
- # (c) 2011 ssvda
- BASHCOLOR_ESCAPE="\033["
- BASHCOLOR_ESCAPE_COLOR="m"
- BASHCOLOR_ESCAPE_CS=";"
- BASHCOLOR_PURE_BLACK=0
- BASHCOLOR_PURE_RED=1
- BASHCOLOR_PURE_GREEN=2
- BASHCOLOR_PURE_YELLOW=3
- BASHCOLOR_PURE_BLUE=4
- BASHCOLOR_PURE_MAGENTA=5
- BASHCOLOR_PURE_CYAN=6
- BASHCOLOR_PURE_WHITE=7
- BASHCOLOR_STYLE_NORMAL=0
- BASHCOLOR_STYLE_BOLD=1
- BASHCOLOR_STYLE_UNDERLINE=4
- BASHCOLOR_STYLE_BLINKED=5
- BASHCOLOR_STYLE_INVERTED=7
- BASHCOLOR_STYLE_CONCEALED=8
- BASHCOLOR_STYLE=0
- BASHCOLOR_FOREGROUND=3
- BASHCOLOR_BACKGROUND=4
- BASHCOLOR_BRIGHT_FOREGROUND=9
- BASHCOLOR_BRIGHT_BACKGROUND=10
- BASHCOLOR_CURSOR_PUSH=s
- BASHCOLOR_CURSOR_POP=u
- BASHCOLOR_CURSOR_SET=f
- function color()
- {
- # Save argument.
- local ARG=$1
- # Testing for special arguments.
- case "$ARG" in
- -f|--f|--fl|--flu|--flus|--flush)
- ARG=f;
- ;;
- -t|--t|--ta|--tab|--tabl|--table)
- # TODO
- ;;
- -?|-h|--h|--he|--hel|--help)
- cat <<EOF
- Take arguments describing color and style and sets it.
- It's argument coud be in form (all fields are optional):
- (special)(style)(colors)(cursor)
- (colors) are
- (foreground color)
- (foreground color)(backgroung color)
- Colors are:
- d for black or D for brighten black (dark gray)
- r for red or R for brighten red
- g for green or G for brighten green
- b for blue or B for brighten blue
- y for yellow or Y for brighten yellow
- m for magenta or M for brighten magenta
- c for cyan or C for brighten cyan
- w for white (gray) or W for brighten white
- _ for previous value
- Or #RRGGBB code for 256-colors scheme (not implemented yet).
- (style) are:
- n for normal text (negativate all other styles)
- s for bold (strong) text
- u for underlined test.
- S for concealed text
- i for inversed text (foreground substitute background)
- t for blinkng (twinkling) text
- Styles could be combined linearity.
- (special) arguments are:
- f --- reset to default (before setting others options).
- e --- do not change something on terminal, just print escapes.
- -f or
- --flush --- reset to default and exit.
- -t or
- --table --- print a table of colors and other escapes and exit.
- -? or
- -h or
- --help --- print this message and exit.
- Cursor commands are:
- +x,y to set cursor in position
- +x,yS to set cursor in position and save it
- +S to save current cursor position
- +R to restore saved cursor position
- x and y coud be negative to address the opposite side of screen.
- EOF
- return
- ;;
- esac
- local FIELD=SPECIAL
- local C
- local SPECIAL
- local COLORS
- local STYLES
- local CURSOR
- local SBOLD=0
- local SCONC=0
- local SINVE=0
- local SBLNK=0
- local SUNDL=0
- local SUNTA=1
- local FGC
- local BGC
- local ESCAPE
- local ECHO=0
- # Should we reset?
- if [ ${#ARG} -gt 0 ] && [ "${ARG:0:1}" == "f" ]
- then
- ESCAPE="$ESCAPE$BASHCOLOR_ESCAPE$BASHCOLOR_STYLE_NORMAL$BASHCOLOR_ESCAPE_COLOR"
- ARG="${ARG/#f/}"
- fi
- while [ ${#ARG} -gt 0 ]
- do
- C="${ARG:0:1}"
- case $FIELD in
- SPECIAL)
- case "$C" in
- f) ESCAPE="$ESCAPE$BASHCOLOR_ESCAPE$BASHCOLOR_STYLE_NORMAL$BASHCOLOR_ESCAPE_COLOR";;
- e) ECHO=1;;
- *)
- FIELD=STYLES
- continue
- ;;
- esac
- ;;
- STYLES)
- case "$C" in
- n)
- SUNTA=0
- SBOLD=0
- SCONC=0
- SINVE=0
- SBLNK=0;;
- s)
- SUNTA=0
- SBOLD=1;;
- u)
- SUNTA=0
- SUNDL=1;;
- S)
- SUNTA=0
- SCONC=1;;
- i)
- SUNTA=0
- SINVE=1;;
- t)
- SUNTA=0
- SBLNK=1;;
- *)
- FIELD=FCOLOR
- continue # Do not update C
- ;;
- esac
- ;;
- FCOLOR)
- case "$C" in
- d) FGC="${BASHCOLOR_FOREGROUND}${BASHCOLOR_PURE_BLACK}";;
- D) FGC="${BASHCOLOR_BRIGHT_FOREGROUND}${BASHCOLOR_PURE_BLACK}";;
- r) FGC="${BASHCOLOR_FOREGROUND}${BASHCOLOR_PURE_RED}";;
- R) FGC="${BASHCOLOR_BRIGHT_FOREGROUND}${BASHCOLOR_PURE_RED}";;
- g) FGC="${BASHCOLOR_FOREGROUND}${BASHCOLOR_PURE_GREEN}";;
- G) FGC="${BASHCOLOR_BRIGHT_FOREGROUND}${BASHCOLOR_PURE_GREEN}";;
- b) FGC="${BASHCOLOR_FOREGROUND}${BASHCOLOR_PURE_BLUE}";;
- B) FGC="${BASHCOLOR_BRIGHT_FOREGROUND}${BASHCOLOR_PURE_BLUE}";;
- y) FGC="${BASHCOLOR_FOREGROUND}${BASHCOLOR_PURE_YELLOW}";;
- Y) FGC="${BASHCOLOR_BRIGHT_FOREGROUND}${BASHCOLOR_PURE_YELLOW}";;
- m) FGC="${BASHCOLOR_FOREGROUND}${BASHCOLOR_PURE_MAGENTA}";;
- M) FGC="${BASHCOLOR_BRIGHT_FOREGROUND}${BASHCOLOR_PURE_MAGENTA}";;
- c) FGC="${BASHCOLOR_FOREGROUND}${BASHCOLOR_PURE_CYAN}";;
- C) FGC="${BASHCOLOR_BRIGHT_FOREGROUND}${BASHCOLOR_PURE_CYAN}";;
- w) FGC="${BASHCOLOR_FOREGROUND}${BASHCOLOR_PURE_WHITE}";;
- W) FGC="${BASHCOLOR_BRIGHT_FOREGROUND}${BASHCOLOR_PURE_WHITE}";;
- 0) ;;
- *)
- FIELD=BCOLOR
- continue
- ;;
- esac
- FIELD=BCOLOR
- ;;
- BCOLOR)
- case "$C" in
- d) BGC="${BASHCOLOR_BACKGROUND}${BASHCOLOR_PURE_BLACK}";;
- D) BGC="${BASHCOLOR_BRIGHT_BACKGROUND}${BASHCOLOR_PURE_BLACK}";;
- r) BGC="${BASHCOLOR_BACKGROUND}${BASHCOLOR_PURE_RED}";;
- R) BGC="${BASHCOLOR_BRIGHT_BACKGROUND}${BASHCOLOR_PURE_RED}";;
- g) BGC="${BASHCOLOR_BACKGROUND}${BASHCOLOR_PURE_GREEN}";;
- G) BGC="${BASHCOLOR_BRIGHT_BACKGROUND}${BASHCOLOR_PURE_GREEN}";;
- b) BGC="${BASHCOLOR_BACKGROUND}${BASHCOLOR_PURE_BLUE}";;
- B) BGC="${BASHCOLOR_BRIGHT_BACKGROUND}${BASHCOLOR_PURE_BLUE}";;
- y) BGC="${BASHCOLOR_BACKGROUND}${BASHCOLOR_PURE_YELLOW}";;
- Y) BGC="${BASHCOLOR_BRIGHT_BACKGROUND}${BASHCOLOR_PURE_YELLOW}";;
- m) BGC="${BASHCOLOR_BACKGROUND}${BASHCOLOR_PURE_MAGENTA}";;
- M) BGC="${BASHCOLOR_BRIGHT_BACKGROUND}${BASHCOLOR_PURE_MAGENTA}";;
- c) BGC="${BASHCOLOR_BACKGROUND}${BASHCOLOR_PURE_CYAN}";;
- C) BGC="${BASHCOLOR_BRIGHT_BACKGROUND}${BASHCOLOR_PURE_CYAN}";;
- w) BGC="${BASHCOLOR_BACKGROUND}${BASHCOLOR_PURE_WHITE}";;
- W) BGC="${BASHCOLOR_BRIGHT_BACKGROUND}${BASHCOLOR_PURE_WHITE}";;
- 0) ;;
- *)
- FIELD=CURSOR
- continue
- ;;
- esac
- FIELD=CURSOR
- ;;
- CURSOR)
- [ "$C" != "+" ] && break
- echo "Not implemented"
- ;;
- esac
- ARG="${ARG/#$C/}"
- done
- # Form escape sequence
- if [ "$FGC" != "" ] || [ "$BGC" != "" ] || [ $SUNTA == 0 ]
- then
- ESCAPE="$ESCAPE$BASHCOLOR_ESCAPE"
- if [ $SUNTA == 0 ]
- then
- if [ $((SBOLD + SCONC + SINVE + SBLNK + SUNDL)) -eq 0 ]
- then
- ESCAPE="$ESCAPE$BASHCOLOR_STYLE$BASHCOLOR_STYLE_NORMAL"
- else
- local SEP=""
- while [ $((SBOLD + SCONC + SINVE + SBLNK + SUNDL)) -ne 0 ]
- do
- #ESCAPE="$SEP$ESCAPE$BASHCOLOR_ESCAPE$BASHCOLOR_STYLE"
- ESCAPE="$ESCAPE$SEP"
- SEP="$BASHCOLOR_ESCAPE_CS"
- [ $SBOLD -eq 1 ] && { ESCAPE="$ESCAPE$BASHCOLOR_STYLE_BOLD"; SBOLD=0; continue; }
- [ $SCONC -eq 1 ] && { ESCAPE="$ESCAPE$BASHCOLOR_STYLE_CONCEALED"; SCONC=0; continue; }
- [ $SINVE -eq 1 ] && { ESCAPE="$ESCAPE$BASHCOLOR_STYLE_INVERTED"; SINVE=0; continue; }
- [ $SBLNK -eq 1 ] && { ESCAPE="$ESCAPE$BASHCOLOR_STYLE_BLINKED"; SBLNK=0; continue; }
- [ $SUNDL -eq 1 ] && { ESCAPE="$ESCAPE$BASHCOLOR_STYLE_UNDERLINE"; SUNDL=0; continue; }
- done
- SEP=""
- fi
- fi
- if [ "$FGC" != "" ]
- then
- if [ $SUNTA == 0 ]
- then
- ESCAPE="$ESCAPE;"
- fi
- ESCAPE="$ESCAPE$FGC"
- fi
- if [ "$BGC" != "" ]
- then
- if [ $SUNTA == 0 ] || [ "$FGC" != "" ]
- then
- ESCAPE="$ESCAPE;"
- fi
- ESCAPE="$ESCAPE$BGC"
- fi
- ESCAPE="$ESCAPE$BASHCOLOR_ESCAPE_COLOR"
- fi
- if [ $ECHO == 1 ]
- then
- echo "$ESCAPE"
- else
- echo -ne "$ESCAPE"
- fi
- }