diff --git a/utils/cheatsheet_viewer.sh b/utils/cheatsheet_viewer.sh new file mode 100755 index 0000000000000000000000000000000000000000..72bde8ad21a028761137c6ff9b68e1feba3fc0a2 --- /dev/null +++ b/utils/cheatsheet_viewer.sh @@ -0,0 +1,242 @@ +#!/bin/bash +# +# cheatsheet_viewer.sh +# +# Copyright (C) 2025, Branko Majic +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (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. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# Treat unset variables as errors. +set -u + +PROGRAM="cheatsheet_viewer.sh" +VERSION="0.0.1" + +function usage() { + cat <. +EOF +} + +function version() { + cat < | +| | +| This program is free software: you can redistribute it and/or modify | +| it under the terms of the GNU General Public License as published by | +| the Free Software Foundation, either version 3 of the License, or | +| (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. | +| | +| You should have received a copy of the GNU General Public License | +| along with this program. If not, see . | ++-----------------------------------------------------------------------+ + +EOF +} + + +# Commands +# ======== + +# +# Lists available profiles. +# +# Arguments: +# +# $1 (config_dir) +# Base directory under which all configuration files are stored. +# +# Returns: +# 0 on success, 1 otherwise. +# +function command_list() { + local config_dir="$1" + local profiles_dir="$config_dir/profiles" + + shopt -s nullglob + local profiles=("$profiles_dir"/*) + shopt -u nullglob + + if (( ${#profiles[@]} == 0 )); then + echo "No profiles defined under $profiles_dir" + return 0 + fi + + echo "Available profiles:" + echo + for profile in "${profiles[@]}"; do + echo " - $(basename "$profile")" + done +} + + +# Set-up colours for message printing if we're not piping and terminal is +# capable of outputting the colors. +_COLOR_TERMINAL=$(tput colors 2>&1) +if [[ -t 1 ]] && (( _COLOR_TERMINAL > 0 )); then + _TEXT_BOLD=$(tput bold) + _TEXT_WHITE=$(tput setaf 7) + _TEXT_BLUE=$(tput setaf 6) + _TEXT_GREEN=$(tput setaf 2) + _TEXT_YELLOW=$(tput setaf 3) + _TEXT_RED=$(tput setaf 1) + _TEXT_RESET=$(tput sgr0) +else + _TEXT_BOLD="" + _TEXT_WHITE="" + _TEXT_BLUE="" + _TEXT_GREEN="" + _TEXT_YELLOW="" + _TEXT_RED="" + _TEXT_RESET="" +fi + +# Set-up functions for printing coloured messages. +function debug() { + if [[ $DEBUG != 0 ]]; then + echo "${_TEXT_BOLD}${_TEXT_BLUE}[DEBUG]${_TEXT_RESET}" "$@" + fi +} + +function info() { + if [[ $QUIET == 0 ]]; then + echo "${_TEXT_BOLD}${_TEXT_WHITE}[INFO] ${_TEXT_RESET}" "$@" + fi +} + +function success() { + if [[ $QUIET == 0 ]]; then + echo "${_TEXT_BOLD}${_TEXT_GREEN}[OK] ${_TEXT_RESET}" "$@" + fi +} + +function warning() { + echo "${_TEXT_BOLD}${_TEXT_YELLOW}[WARN] ${_TEXT_RESET}" "$@" >&2 +} + +function error() { + echo "${_TEXT_BOLD}${_TEXT_RED}[ERROR]${_TEXT_RESET}" "$@" >&2 +} + +# Define error codes. +SUCCESS=0 +ERROR_ARGUMENTS=1 + +# Disable debug and quiet modes by default. +DEBUG=0 +QUIET=0 + +# Default paths, directories etc. +CONFIG_DIR="$HOME/.config/cheatsheet_viewer" + +# If no arguments were given, just show usage help. +if [[ -z ${1-} ]]; then + short_help + exit "$SUCCESS" +fi + +# Parse the arguments +while getopts "qdvh" opt; do + case "$opt" in + q) QUIET=1;; + d) DEBUG=1;; + v) version + exit "$SUCCESS";; + h) long_help + exit "$SUCCESS";; + *) short_help + exit "$ERROR_ARGUMENTS";; + esac +done +i=$OPTIND +shift $(( i-1 )) + +# Quiet and debug are mutually exclusive. +if [[ $QUIET != 0 && $DEBUG != 0 ]]; then + error "Quiet and debug options are mutually exclusive." + exit "$ERROR_ARGUMENTS" +fi + +COMMAND="${1-}" +shift + +if [[ $COMMAND == list ]]; then + + command_list "$CONFIG_DIR" + +else + + error "Unsupported command: $COMMAND" + exit "$ERROR_ARGUMENTS" + +fi