#!/usr/bin/env bash # @description Installs glow (a markdown renderer) from GitHub releases installGlow() { # TODO: Add support for other architecture types if [ -d '/Applications' ] && [ -d '/Library' ] && [ -d '/Users' ]; then GLOW_DOWNLOAD_URL="https://github.com/charmbracelet/glow/releases/download/v1.4.1/glow_1.4.1_Darwin_x86_64.tar.gz" elif [ -f '/etc/ubuntu-release' ] || [ -f '/etc/debian_version' ] || [ -f '/etc/redhat-release' ] || [ -f '/etc/SuSE-release' ] || [ -f '/etc/arch-release' ] || [ -f '/etc/alpine-release' ]; then GLOW_DOWNLOAD_URL="https://github.com/charmbracelet/glow/releases/download/v1.4.1/glow_1.4.1_linux_x86_64.tar.gz" fi if type curl &> /dev/null; then if { [ -d '/Applications' ] && [ -d '/Library' ] && [ -d '/Users' ]; } || [ -f '/etc/ubuntu-release' ] || [ -f '/etc/debian_version' ] || [ -f '/etc/redhat-release' ] || [ -f '/etc/SuSE-release' ] || [ -f '/etc/arch-release' ] || [ -f '/etc/alpine-release' ]; then TMP="$(mktemp)" TMP_DIR="$(dirname "$TMP")" curl -sSL "$GLOW_DOWNLOAD_URL" > "$TMP" tar -xzf "$TMP" -C "$TMP_DIR" if [ -n "$HOME" ]; then if mkdir -p "$HOME/.local/bin" && mv "$TMP_DIR/glow" "$HOME/.local/bin/glow"; then GLOW_PATH="$HOME/.local/bin/glow" else GLOW_PATH="$(dirname "${BASH_SOURCE[0]}")/glow" mv "$TMP_DIR/gum" "$GLOW_PATH" fi chmod +x "$GLOW_PATH" else echo "WARNING: The HOME environment variable is not set! (Glow)" fi else echo "WARNING: Unable to detect system type. (Glow)" fi fi } # @description Installs gum (a logging CLI) from GitHub releases installGum() { # TODO: Add support for other architecture types if [ -d '/Applications' ] && [ -d '/Library' ] && [ -d '/Users' ]; then GUM_DOWNLOAD_URL="https://github.com/charmbracelet/gum/releases/download/v0.4.0/gum_0.4.0_Darwin_x86_64.tar.gz" elif [ -f '/etc/ubuntu-release' ] || [ -f '/etc/debian_version' ] || [ -f '/etc/redhat-release' ] || [ -f '/etc/SuSE-release' ] || [ -f '/etc/arch-release' ] || [ -f '/etc/alpine-release' ]; then GUM_DOWNLOAD_URL="https://github.com/charmbracelet/gum/releases/download/v0.4.0/gum_0.4.0_linux_x86_64.tar.gz" fi if type curl &> /dev/null; then if { [ -d '/Applications' ] && [ -d '/Library' ] && [ -d '/Users' ]; } || [ -f '/etc/ubuntu-release' ] || [ -f '/etc/debian_version' ] || [ -f '/etc/redhat-release' ] || [ -f '/etc/SuSE-release' ] || [ -f '/etc/arch-release' ] || [ -f '/etc/alpine-release' ]; then TMP="$(mktemp)" TMP_DIR="$(dirname "$TMP")" curl -sSL "$GUM_DOWNLOAD_URL" > "$TMP" tar -xzf "$TMP" -C "$TMP_DIR" if [ -n "$HOME" ]; then if mkdir -p "$HOME/.local/bin" && mv "$TMP_DIR/gum" "$HOME/.local/bin/gum"; then GUM_PATH="$HOME/.local/bin/gum" else GUM_PATH="$(dirname "${BASH_SOURCE[0]}")/gum" mv "$TMP_DIR/gum" "$GLOW_PATH" fi chmod +x "$GUM_PATH" else echo "WARNING: The HOME environment variable is not set! (Gum)" fi else echo "WARNING: Unable to detect system type. (Gum)" fi fi } # @description Configure the logger to use echo or gum if [ "${container:=}" != 'docker' ]; then # Acquire gum's path or attempt to install it if type gum &> /dev/null; then GUM_PATH="$(which gum)" elif [ -f "$HOME/.local/bin/gum" ]; then GUM_PATH="$HOME/.local/bin/gum" elif [ -f "$(dirname "${BASH_SOURCE[0]}")/gum" ]; then GUM_PATH="$(dirname "${BASH_SOURCE[0]}")/gum" elif type brew &> /dev/null; then brew install --quiet gum GUM_PATH="$(which gum)" else if ! command -v qubesctl > /dev/null; then # Qubes dom0 installGum fi fi # If gum's path was set, then turn on enhanced logging if [ -n "$GUM_PATH" ]; then chmod +x "$GUM_PATH" fi fi format() { # shellcheck disable=SC2001,SC2016 ANSI_STR_FORMATTED="$(echo "$1" | sed 's/^\([^`]*\)`\([^`]*\)`.*/\1\\u001b[47;30m \2 \\e[49;m/')" # shellcheck disable=SC2001,SC2016 ANSI_STR="$(echo "$1" | sed 's/^\([^`]*\)`\([^`]*\)`\(.*\)$/\3/')" if [ "$ANSI_STR_FORMATTED" != "$ANSI_STR" ]; then if [[ $ANSI_STR == *'`'*'`'* ]]; then ANSI_STR_FORMATTED="$ANSI_STR_FORMATTED$(format "$("$GUM_PATH" style --bold "$ANSI_STR")")" else ANSI_STR_FORMATTED="$ANSI_STR_FORMATTED$("$GUM_PATH" style --bold "$ANSI_STR")" fi fi echo -e "$ANSI_STR_FORMATTED" } formatFaint() { # shellcheck disable=SC2001,SC2016 ANSI_STR_FORMATTED="$(echo "$1" | sed 's/^\([^`]*\)`\([^`]*\)`.*/\1\\u001b[47;30m \2 \\e[49;m/')" # shellcheck disable=SC2001,SC2016 ANSI_STR="$(echo "$1" | sed 's/^\([^`]*\)`\([^`]*\)`\(.*\)$/\3/')" if [ "$ANSI_STR_FORMATTED" != "$ANSI_STR" ]; then if [[ $ANSI_STR == *'`'*'`'* ]]; then ANSI_STR_FORMATTED="$ANSI_STR_FORMATTED$(formatFaint "$("$GUM_PATH" style --faint --foreground="#ffffff" "$ANSI_STR")")" else ANSI_STR_FORMATTED="$ANSI_STR_FORMATTED$("$GUM_PATH" style --faint --foreground="#ffffff" "$ANSI_STR")" fi fi echo -e "$ANSI_STR_FORMATTED" } # @description Logs using Gum logg() { TYPE="$1" MSG="$2" if [ "$TYPE" == 'error' ]; then "$GUM_PATH" style --border="thick" "$("$GUM_PATH" style --foreground="#ff0000" "✖") $("$GUM_PATH" style --bold --background="#ff0000" --foreground="#ffffff" " ERROR ") $("$GUM_PATH" style --bold "$(format "$MSG")")" elif [ "$TYPE" == 'info' ]; then "$GUM_PATH" style " $("$GUM_PATH" style --foreground="#00ffff" "○") $("$GUM_PATH" style --faint --foreground="#ffffff" "$(formatFaint "$MSG")")" elif [ "$TYPE" == 'md' ]; then # @description Ensure glow is installed if [ "${container:=}" != 'docker' ]; then if type glow &> /dev/null; then GLOW_PATH="$(which glow)" elif [ -f "$HOME/.local/bin/glow" ]; then GLOW_PATH="$HOME/.local/bin/glow" elif [ -f "$(dirname "${BASH_SOURCE[0]}")/glow" ]; then GLOW_PATH="$(dirname "${BASH_SOURCE[0]}")/glow" elif type brew &> /dev/null; then brew install --quiet glow GLOW_PATH="$(which glow)" else if ! command -v qubesctl > /dev/null; then # Qubes dom0 installGlow fi fi if [ -n "$GLOW_PATH" ]; then chmod +x "$GLOW_PATH" fi fi "$GLOW_PATH" "$MSG" elif [ "$TYPE" == 'prompt' ]; then "$GUM_PATH" style " $("$GUM_PATH" style --foreground="#00008b" "▶") $("$GUM_PATH" style --bold "$(format "$MSG")")" elif [ "$TYPE" == 'star' ]; then "$GUM_PATH" style " $("$GUM_PATH" style --foreground="#d1d100" "◆") $("$GUM_PATH" style --bold "$(format "$MSG")")" elif [ "$TYPE" == 'start' ]; then "$GUM_PATH" style " $("$GUM_PATH" style --foreground="#00ff00" "▶") $("$GUM_PATH" style --bold "$(format "$MSG")")" elif [ "$TYPE" == 'success' ]; then "$GUM_PATH" style " $("$GUM_PATH" style --foreground="#00ff00" "✔") $("$GUM_PATH" style --bold "$(format "$MSG")")" elif [ "$TYPE" == 'warn' ]; then "$GUM_PATH" style " $("$GUM_PATH" style --foreground="#d1d100" "◆") $("$GUM_PATH" style --bold --background="#ffff00" --foreground="#000000" " WARNING ") $("$GUM_PATH" style --bold "$(format "$MSG")")" else "$GUM_PATH" style " $("$GUM_PATH" style --foreground="#00ff00" "▶") $("$GUM_PATH" style --bold "$(format "$TYPE")")" fi }