X-Git-Url: https://git.armaanb.net/?p=charsel.git;a=blobdiff_plain;f=charsel;h=d9dcb0f9b2a298c6e123f13bce0d8eba530c4c88;hp=6c6fc915e6cdd58f0853be5b141aa00ad9a282dd;hb=HEAD;hpb=8144e0931937918fff0f19a432741d849342ebf2 diff --git a/charsel b/charsel index 6c6fc91..d9dcb0f 100755 --- a/charsel +++ b/charsel @@ -1,197 +1,203 @@ #!/usr/bin/env bash - -####################################################################### - -# (C) Copyright Armaan Bhojwani, 2020 - -# 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 . - -######################################################################## - -VERSION=2.0.0 +# Charsel - terminal character selector +# Copyright Armaan Bhojwani 2020, MIT License # Define argument functions function usage() { echo "Usage: /usr/bin/charsel [OPTION]... [CHARFILE]... + A simple terminal character selector - -h show this message - -l show installed charfiles - -d show readme - -v print version - --all include hidden shortcodes + -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" + 0 okay, + 1 charfile does not exist, + 2 charfile syntax error, + 3 usage error/invalid option, + 4 other error" } CHARDIR=$HOME/.cache/charsel function list() { - echo "The following charfiles are installed:" - ls $CHARDIR/charfiles + ls "$CHARDIR"/charfiles } function readme() { cat /usr/share/doc/charsel/README.md } -function invalid_charfile() { +function missing_charfile() { echo "The selected charfile is missing or invalid" list exit 1 } -# Check if Xclip is installed -if [[ -x xclip ]] -then - echo "Please install xclip." - exit 4 -fi - # Merge global and local charfiles -if [[ -d $CHARDIR ]] -then - rm -rf $CHARDIR/* +if [[ -d $CHARDIR ]]; then + rm -rf "${CHARDIR:?}"/* else - mkdir $CHARDIR + mkdir "$CHARDIR" fi LOCALCHARDIR=$HOME/.local/share/charsel/charfiles -if [[ ! -d $LOCALCHARDIR ]] -then - mkdir -p $LOCALCHARDIR -fi +[[ -d $LOCALCHARDIR ]] || mkdir -p "$LOCALCHARDIR" -localdirfiles=($LOCALCHARDIR/*) -if [[ ! -z "${#localdirfiles[*]}" ]] -then - cp -rf $LOCALCHARDIR/../* $CHARDIR -fi +localdirfiles="$LOCALCHARDIR"/* +[[ -n "${#localdirfiles[*]}" ]] && cp -rf "$LOCALCHARDIR"/../* "$CHARDIR" globaldirfiles=($/usr/share/charfiles/) -if [[ ! -z "${#globaldirfiles[*]}" ]] -then - cp -rf /usr/share/charsel/* $CHARDIR -fi +[[ -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 ":lhdv" arg +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 ;; - d) - readme + L) + list exit 0 ;; - v) - echo "charsel" $VERSION - exit 0 + n) + COPY="no" ;; ?) echo "Invalid option" usage exit 3 ;; - :) - break - ;; esac done shift $((OPTIND-1)) -# Check if charfile exists -CHARFILE="$CHARDIR/charfiles/$1" -if [[ ! -f $CHARFILE ]] -then - invalid_charfile +if [ $# -eq 0 ]; then + echo "Please enter a valid charfile, or use charsel -h for help." + charsel -l + exit 3 fi -# VERY basic syntax validation -if [[ $(grep , $CHARFILE && grep - $CHARFILE) ]] -then - echo "valid charfile" -else - echo "invalid charfile" - exit 2 +# 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=$(cat $CHARFILE \ - | cut -f 1 -d ',' -s \ +LENGTH=$(cut "$CHARFILE" -f 1 -d ',' -s \ | wc -L \ | cut -b 1) clear +# Define text formatting +bold=$(tput bold) +normal=$(tput sgr0) + +highlight=$(tput setaf 5) +[[ $COLOR == bw ]] && highlight=$(tput setaf 7) + +white=$(tput setaf 7) + # Main program while true do # Format output echo "*---------*---------------*" - echo "| CHARSEL |" $1 + echo "| ${bold}${highlight}CHARSEL${white}${normal} |" "$1" echo "*---------*---------------*" echo "" - if [[ $2 == "--all" ]] - then - cat $CHARFILE | sed -e '/^[ \t]*#/d' | tail -n +2 \ - | column -t -N input,output --output-separator ' | ' --separator ',' + if [[ $SHOWALL == true ]]; then + sed "$CHARFILE" -e '/^[ \t]*#/d' | tail -n +2 \ + | column -t -N "input","output" --output-separator ' | ' --separator ',' else - cat $CHARFILE | sed -e '/^[ \t]*#/d' | grep -A 100 - | tail -n +2 \ - | column -t -N input,output --output-separator ' | ' --separator ',' + sed "$CHARFILE" -e '/^[ \t]*#/d' | grep -A 100 - | tail -n +2 \ + | column -t -N "input","output" --output-separator ' | ' --separator ',' fi echo "" echo "*-------------------------*" - echo "| previous shorcode:" $INPUT - echo "| previous output: " $OUTPUT + echo "| previous shorcode:" "$(echo $INPUT)" + echo "| previous output: " "$OUTPUT" echo "*-------------------------*" # User input - read -p "| input shortcode: " -N $LENGTH INPUT + read -r -p "| ${bold}input shortcode: ${normal} " -N "$LENGTH" INPUT + + 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) - # This can definately be simplifed, but it works fine - # 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") - # 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 - # 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 - if [[ $INPUT == ";"* ]] - then clear - exit 0 fi - - # Copy output to clipboard - echo $OUTPUT | xclip -selection clipboard - - clear done