|
#!/usr/bin/env bash |
|
|
|
# @author : Anthony Bourdain |
|
# @credit : https://stackoverflow.com/a/55073732/2940319 |
|
# @usage : |
|
# - `rgbtohex 17 0 26` ==> 1001A |
|
# - `rgbtohex -h 17 0 26` ==> #1001A |
|
function rgbtohex () { |
|
addleadingzero () { awk '{if(length($0)<2){printf "0";} print $0;}';} |
|
if [[ ${1} == "-h" ]]; then |
|
r=${2}; g=${3}; b=${4};h='#'; |
|
else |
|
r=${1}; g=${2}; b=${3};h=''; |
|
fi |
|
r=$(echo "obase=16; ${r}" | bc | addleadingzero) |
|
g=$(echo "obase=16; ${g}" | bc | addleadingzero) |
|
b=$(echo "obase=16; ${b}" | bc | addleadingzero) |
|
echo "${h}${r}${g}${b}" |
|
} |
|
|
|
# @author : Anthony Bourdain |
|
# @credit : https://stackoverflow.com/a/55073732/2940319 |
|
# @usage : |
|
# - `rgbto256 0 95, 135` ==> 22 |
|
function rgbto256 () { |
|
echo "define trunc(x){auto os;os=scale;scale=0;x/=1;scale=os;return x;};" \ |
|
"16 + 36 * trunc(${1}/51) + 6 * trunc(${2}/51) +" \ |
|
" trunc(${3}/51)" | bc |
|
# XTerm Color Number = 16 + 36 * R + 6 * G + B | 0 <= R,G,B <= 5 |
|
} |
|
|
|
# @author : Anthony Bourdain |
|
# @credit : https://stackoverflow.com/a/55073732/2940319 |
|
# @usage : |
|
# - `hexttorgb "11001A" ==> 17 0 26 |
|
# - `hexttorgb "#11001A" ==> 17 0 26 |
|
function hextorgb () { |
|
hexinput=$(echo "${1}" | tr '[:lower:]' '[:upper:]') # uppercase-ing |
|
hexinput=$(echo "${hexinput}" | tr -d '#') # remove Hash if needed |
|
a=$(echo "${hexinput}" | cut -c-2) |
|
b=$(echo "${hexinput}" | cut -c3-4) |
|
c=$(echo "${hexinput}" | cut -c5-6) |
|
r=$(echo "ibase=16; ${a}" | bc) |
|
g=$(echo "ibase=16; ${b}" | bc) |
|
b=$(echo "ibase=16; ${c}" | bc) |
|
echo "${r} ${g} ${b}" |
|
} |
|
|
|
# Generates Truecolor Escape Sequences from Hex Strings. (remove '\\' to use) |
|
# @author : Anthony Bourdain |
|
# @credit : https://stackoverflow.com/a/55073732/2940319 |
|
# @params : |
|
# -fg Prints as a foreground color. (default) |
|
# -bg Prints as a background color. |
|
# @usage : |
|
# - `trueHexPrint -fg "11001A" ==> '\e[38;2;17;0;26m' |
|
# - `trueHexPrint -bg "11001A" ==> '\e[48;2;17;0;26m' |
|
function trueHexPrint () { |
|
if [[ ${1} =~ "-fg" || ${1} =~ "-f" ]]; then |
|
fgbg=38; hexinput=${2}; |
|
elif [[ ${1} =~ "-bg" || ${1} =~ "-b" ]]; then |
|
fgbg=48; hexinput=${2}; |
|
else |
|
fgbg=38; hexinput=${1} |
|
fi |
|
hexinput=$(echo "${hexinput}" | tr '[:lower:]' '[:upper:]') # uppercase-ing |
|
hexinput=$(echo "${hexinput}" | tr -d '#') # remove Hash if needed |
|
a=$(echo "${hexinput}" | cut -c-2) |
|
b=$(echo "${hexinput}" | cut -c3-4) |
|
c=$(echo "${hexinput}" | cut -c5-6) |
|
|
|
r=$(echo "ibase=16; ${a}" | bc) |
|
g=$(echo "ibase=16; ${b}" | bc) |
|
b=$(echo "ibase=16; ${c}" | bc) |
|
|
|
printf "\\\\e[%s;2;%s;%s;%sm" "${fgbg}" "${r}" "${g}" "${b}" # Remove one set of '\\' to utilize |
|
} |
|
|
|
# @author : Anthony Bourdain |
|
# @credit : https://stackoverflow.com/a/55073732/2940319 |
|
function XColorTable () { |
|
i=16 |
|
for ((r = 0; r <= 255; r+=40)); do # do tricolor |
|
for ((g = 0; g <= 255; g+=40)); do |
|
for ((b = 0; b <= 255; b+=40)); do |
|
hex=$(rgbtohex ${r} ${g} ${b}) |
|
printf "%-3s = %-18s => %b\n" "$((i++))" "rgb(${r}, ${g}, ${b})" "$(trueHexPrint "${hex}")#${hex}\e[0m" |
|
if ((b == 0)); then b=55; fi |
|
done |
|
if ((g == 0)); then g=55; fi |
|
done |
|
if ((r == 0)); then r=55; fi |
|
done |
|
for ((m = 8; m <= 238; m+=10)); do # do monochrome |
|
hex=$(rgbtohex ${m} ${m} ${m}) |
|
printf "%-3s = %-18s => %b\n" "$((i++))" "rgb(${m}, ${m}, ${m})" "$(trueHexPrint "${hex}")#${hex}\x1b[0m" |
|
done |
|
} |
|
|
|
# Generates 256 Color code table with RGB and Hex values |
|
# @author : marslo |
|
# @usage : |
|
# - to show specific color(s) with parameter(s) : |
|
# `xCodeTable 30 40 50` ==> '30 = rgb(0, 135, 135) => #008787\n...\n...' |
|
# - to show all 256 colors code table without parameter : |
|
# `xCodeTable` |
|
function xColorTable() { |
|
declare -A COLORS |
|
declare -i i=16 |
|
|
|
function _prettyPrint() { |
|
local _r _g _b colorCode hexCode |
|
colorCode="$1" |
|
IFS=' ' read -r _r _g _b <<< "$2"; unset IFS; |
|
hexCode=$(rgbtohex "${_r}" "${_g}" "${_b}") |
|
printf "%-3s = %-18s => %b\n" "${colorCode}" "rgb(${_r}, ${_g}, ${_b})" "$(trueHexPrint "${hexCode}")#${hexCode}\x1b[0m" |
|
} |
|
|
|
for ((r = 0; r <= 255; r+=40)); do # do tricolor |
|
for ((g = 0; g <= 255; g+=40)); do |
|
for ((b = 0; b <= 255; b+=40)); do |
|
COLORS[$i]+="$r $g $b" |
|
(( i++ )) |
|
if ((b == 0)); then b=55; fi |
|
done |
|
if ((g == 0)); then g=55; fi |
|
done |
|
if ((r == 0)); then r=55; fi |
|
done |
|
for ((m = 8; m <= 238; m+=10)); do # do monochrome |
|
COLORS[$i]+="$m $m $m" |
|
(( i++ )) |
|
done |
|
|
|
[[ 0 -ne "$#" ]] && output=$( echo "$@" | fmt -1) || output=$(printf "%s\n" "${!COLORS[@]}" | sort -n) |
|
while read -r _c; do |
|
_prettyPrint "${_c}" "${COLORS[${_c}]}" |
|
done <<< "${output}" |
|
} |
|
|
|
# vim:tabstop=2:softtabstop=2:shiftwidth=2:expandtab:filetype=sh |