X-Git-Url: https://git.armaanb.net/?p=charsel.git;a=blobdiff_plain;f=charsel;h=d9dcb0f9b2a298c6e123f13bce0d8eba530c4c88;hp=17b3266bc8d3961f810ec8d95490a881bde1e2f2;hb=HEAD;hpb=cd756876f0f5cb07e3d11a379833b2e59e449802 diff --git a/charsel b/charsel index 17b3266..d9dcb0f 100755 --- a/charsel +++ b/charsel @@ -1,56 +1,203 @@ #!/usr/bin/env bash +# Charsel - terminal character selector +# Copyright Armaan Bhojwani 2020, MIT License -# Merge both global and local charfiles -CHARDIR=~/.cache/charsel +# Define argument functions +function usage() { + echo "Usage: /usr/bin/charsel [OPTION]... [CHARFILE]... -if [[ ! -d $CHARDIR ]] -then - mkdir $CHARDIR/ -elif [[! "$(ls -A $CHARDIR)"]] -then - cp -rf /usr/share/charsel/* $CHARDIR/ - cp -rf ~/.local/share/charsel/* $CHARDIR/ -fi +A simple terminal character selector + -a include hidden shortcodes + -b disable color support + -c check charfile validity + -d show readme + -h show this message + -L show installed charfiles without the message + -l show installed charfiles + -n dont copy character to clipboard, avoids Xclip dependency + +Exit status: + 0 okay, + 1 charfile does not exist, + 2 charfile syntax error, + 3 usage error/invalid option, + 4 other error" +} -# Check for user inputs -if [ $1 = "list" ] -then - echo "The following charfiles are installed" - ls $CHARDIR/charfiles - exit -elif [[ $1 = "help" || $1 = "-h" || $1 = "--help" || $# -ne 1 ]] -then +CHARDIR=$HOME/.cache/charsel +function list() { + ls "$CHARDIR"/charfiles +} + +function readme() { cat /usr/share/doc/charsel/README.md - exit +} + +function missing_charfile() { + echo "The selected charfile is missing or invalid" + list + exit 1 +} + +# Merge global and local charfiles +if [[ -d $CHARDIR ]]; then + rm -rf "${CHARDIR:?}"/* else + mkdir "$CHARDIR" +fi + +LOCALCHARDIR=$HOME/.local/share/charsel/charfiles +[[ -d $LOCALCHARDIR ]] || mkdir -p "$LOCALCHARDIR" + +localdirfiles="$LOCALCHARDIR"/* +[[ -n "${#localdirfiles[*]}" ]] && cp -rf "$LOCALCHARDIR"/../* "$CHARDIR" + +globaldirfiles=($/usr/share/charfiles/) +[[ -n "${#globaldirfiles[*]}" ]] && cp -rf /usr/share/charsel/* "$CHARDIR" + +# Check if charfile exists +CHARFILE="$CHARDIR/charfiles/$2" +function existence() { + if [[ ! -f $CHARFILE ]]; then + missing_charfile + fi +} + +# VERY basic syntax check +function validity() { + if [[ $(grep , "$CHARFILE" && grep - "$CHARFILE") ]]; then + echo "valid charfile" + else + existence + echo "invalid charfile" + exit 2 + fi +} + +# Look for arguments +while getopts ":abcdhlLnvV" arg +do + case ${arg} in + a) + SHOWALL="true" + ;; + b) + COLOR="bw" + ;; + c) + validity + exit 0 + ;; + d) + readme + exit 0 + ;; + h) + usage + exit 0 + ;; + l) + echo "The following charfiles are installed:" + list + exit 0 + ;; + L) + list + exit 0 + ;; + n) + COPY="no" + ;; + ?) + echo "Invalid option" + usage + exit 3 + ;; + esac +done +shift $((OPTIND-1)) + +if [ $# -eq 0 ]; then + echo "Please enter a valid charfile, or use charsel -h for help." + charsel -l + exit 3 +fi + +# Redefine charfile and check file validity +CHARFILE="$CHARDIR/charfiles/$1" +existence +validity + +# Dependency check +if [[ $COPY == "no" ]]; then + if [[ ! -x /usr/bin/xclip ]]; then + echo "Please install xclip." + exit 4 + fi +fi + +# Define length of shortcode +LENGTH=$(cut "$CHARFILE" -f 1 -d ',' -s \ + | wc -L \ + | cut -b 1) -# Clear screen clear -# Define charfile path -CHARFILE=$CHARDIR/charfiles/$1 +# Define text formatting +bold=$(tput bold) +normal=$(tput sgr0) + +highlight=$(tput setaf 5) +[[ $COLOR == bw ]] && highlight=$(tput setaf 7) -# Define length of shortcut -LENGTH=$(cat $CHARFILE | cut -f 1 -d ',' -s | wc -L | cut -b 1) +white=$(tput setaf 7) # Main program -while : +while true do - # Put charfile into table, showing only the shortcuts below the divider in the charfile - cat $CHARFILE | grep -A 100 - | tail -n +2 | column -t --output-separator ' | ' --separator ',' + # Format output + echo "*---------*---------------*" + echo "| ${bold}${highlight}CHARSEL${white}${normal} |" "$1" + echo "*---------*---------------*" + echo "" - # Automatically enter input - read -N $LENGTH INPUT - - # This can definately be simplifed, but it works fine - LINENUMBER=$(cut -f 1 -d ',' -s $CHARFILE | grep -n $INPUT | cut -d : -f 1) - OUTPUT=$(cut -f 2 -d ',' -s $CHARFILE | head -$LINENUMBER | tail +$LINENUMBER) + if [[ $SHOWALL == true ]]; then + sed "$CHARFILE" -e '/^[ \t]*#/d' | tail -n +2 \ + | column -t -N "input","output" --output-separator ' | ' --separator ',' + else + sed "$CHARFILE" -e '/^[ \t]*#/d' | grep -A 100 - | tail -n +2 \ + | column -t -N "input","output" --output-separator ' | ' --separator ',' + fi - # Clear screen - clear + echo "" + echo "*-------------------------*" + echo "| previous shorcode:" "$(echo $INPUT)" + echo "| previous output: " "$OUTPUT" + echo "*-------------------------*" - # Copy output to clipboard - echo $OUTPUT | xclip -selection clipboard -done + # User input + read -r -p "| ${bold}input shortcode: ${normal} " -N "$LENGTH" INPUT -fi + if [[ $INPUT == ";"* ]]; then # Semicolon exts + clear + exit 0 + else + # Finds line number of shortcode + LINENUMBER=$(cut -f 1 -d ',' -s "$CHARFILE" | grep -wn "$INPUT" | cut -d : -f 1) + + # Outputs character selected above + OUTPUT=$(cut -f 2 -d ',' -s "$CHARFILE" | head -"$LINENUMBER" | tail +"$LINENUMBER") + + # Check to see if the shortcode actually exists + if [[ $(cut -f 1 -d ',' -s "$CHARFILE" | grep -wnc "$INPUT") == "0" ]]; then + OUTPUT="" + fi + + # Copy output to clipboard + if [[ ! $COPY == "no" ]]; then + echo -n "$OUTPUT" | xclip -selection clipboard + fi + + clear + fi +done