Changeset - 42a53c04297e
[Not reviewed]
0 0 1
Branko Majic (branko) - 1 month ago 2025-03-06 12:59:52
branko@majic.rs
[cheatsheet_viewer.sh] Initial script implementation with a basic/dummy list command.
1 file changed with 242 insertions and 0 deletions:
0 comments (0 inline, 0 general) First comment
utils/cheatsheet_viewer.sh
Show inline comments
 
new file 100755
 
#!/bin/bash
 
#
 
# cheatsheet_viewer.sh
 
#
 
# Copyright (C) 2025, Branko Majic <branko@majic.rs>
 
#
 
# 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 <http://www.gnu.org/licenses/>.
 
#
 

	
 
# Treat unset variables as errors.
 
set -u
 

	
 
PROGRAM="cheatsheet_viewer.sh"
 
VERSION="0.0.1"
 

	
 
function usage() {
 
    cat <<EOF
 
$PROGRAM $VERSION, simple utility for viewing image cheatsheets
 

	
 
Usage:
 
  $PROGRAM [OPTIONS] list
 
EOF
 
}
 

	
 
function short_help() {
 
    cat <<EOF
 
$(usage)
 

	
 
For more details see $PROGRAM -h.
 
EOF
 
}
 

	
 
function long_help() {
 
    cat <<EOF
 
$(usage)
 

	
 
$PROGRAM is a simple utility for viewing image cheatsheets with
 
support for multiple profiles.
 

	
 
All configuration is stored under user's own home directory at:
 

	
 
  - ~/.config/cheatsheet_viewer/
 

	
 
Individual profiles are stored as sub-directories, with each
 
sub-directory representing an individual profile that can be
 
activated. Base directory for profiles is:
 

	
 
  - ~/.config/cheatsheet_viewer/profiles/
 

	
 
Multiple commands are provided for working with the profiles and
 
displaying the cheatsheets.
 

	
 
list
 

	
 
  Lists the available profiles.
 

	
 
$PROGRAM accepts the following options:
 

	
 
    -q
 
        Quiet mode.
 
    -d
 
        Enable debug mode.
 
    -v
 
        Show script version and licensing information.
 
    -h
 
        Show full help.
 

	
 
Please report bugs and send feature requests to <branko@majic.rs>.
 
EOF
 
}
 

	
 
function version() {
 
    cat <<EOF
 
$PROGRAM, version $VERSION
 

	
 
+-----------------------------------------------------------------------+
 
| Copyright (C) 2025, Branko Majic <branko@majic.rs>                    |
 
|                                                                       |
 
| 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 <http://www.gnu.org/licenses/>. |
 
+-----------------------------------------------------------------------+
 

	
 
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
0 comments (0 inline, 0 general) First comment
You need to be logged in to comment. Login now