X-Git-Url: https://git.armaanb.net/?a=blobdiff_plain;f=charsel;h=132fb7f26f19c8d8dc8afaaddf9b5c9d416f1861;hb=55679d54448ed92b94f2db454b07d5ff839ba6b5;hp=adffd273bd12d2b3f3afc32e4b41dae8d36e2a01;hpb=17f712c5288936886131e5d9c11e962c745fe7df;p=charsel.git diff --git a/charsel b/charsel index adffd27..132fb7f 100755 --- a/charsel +++ b/charsel @@ -1,95 +1,228 @@ #!/usr/bin/env bash -# Merge both global and local charfiles -CHARDIR=~/.cache/charsel +####################################################################### + +# (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.5 + +# 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 + -L show installed charfiles without the message + -d show readme + -v print version + -c check charfile validity + -a include hidden shortcodes + +Exit status: + 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() { + ls $CHARDIR/charfiles +} + +function readme() { + cat /usr/share/doc/charsel/README.md +} + +function missing_charfile() { + echo "The selected charfile is missing or invalid" + list + exit 1 +} -if [[ ! -d $CHARDIR ]] +# Merge global and local charfiles +if [[ -d $CHARDIR ]] then - mkdir $CHARDIR/ -elif [[ ! "$(ls -A $CHARDIR)" ]] + rm -rf $CHARDIR/* +else + mkdir $CHARDIR +fi + +LOCALCHARDIR=$HOME/.local/share/charsel/charfiles +if [[ ! -d $LOCALCHARDIR ]] then - cp -rf /usr/share/charsel/- $CHARDIR/ - cp -rf $HOME/.local/share/charsel/- $CHARDIR/ + mkdir -p $LOCALCHARDIR fi -# Check for user inputs -if [[ $1 == "list" \ - || $1 == "-l" \ - || $1 == "--list" ]] +localdirfiles=($LOCALCHARDIR/*) +if [[ ! -z "${#localdirfiles[*]}" ]] then - echo "The following charfiles are installed" - ls $CHARDIR/charfiles - exit 0 -elif [[ $1 == "help" \ - || $1 == "-h" \ - || $1 == "--help" \ - || $# -ne 1 ]] + cp -rf $LOCALCHARDIR/../* $CHARDIR +fi + +globaldirfiles=($/usr/share/charfiles/) +if [[ ! -z "${#globaldirfiles[*]}" ]] then - cat /usr/share/doc/charsel/README.md - exit 0 + cp -rf /usr/share/charsel/* $CHARDIR +fi + +# 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 +if [ $# -eq 0 ]; then + usage + exit 3 fi +while getopts ":aLlchdv" arg +do + case ${arg} in + h) + usage + exit 0 + ;; + l) + echo "The following charfiles are installed:" + list + exit 0 + ;; + L) + list + exit 0 + ;; + d) + readme + exit 0 + ;; + v) + echo "charsel" $VERSION + exit 0 + ;; + c) + validity + exit 0 + ;; + a) + SHOWALL="true" + ;; + ?) + echo "Invalid option" + usage + exit 3 + ;; + esac +done +shift $((OPTIND-1)) -# Define charfile path -CHARFILE=$CHARDIR/charfiles/$1 +# Redefine charfile and check file validity +CHARFILE="$CHARDIR/charfiles/$1" +existence +validity -if [[ ! -f $CHARFILE ]] +# Dependency check +if [[ -x xclip ]] then - echo "Please enter a valid charfile. You can list installed charfiles with \`charsel list\`" - exit 1 + echo "Please install xclip." + exit 4 fi -# Define length of shortcut +# Define length of shortcode LENGTH=$(cat $CHARFILE \ | cut -f 1 -d ',' -s \ | wc -L \ | cut -b 1) -# Clear screen clear +# Define text formatting +bold=$(tput bold) +normal=$(tput sgr0) + # Main program -while : +while true do # Format output echo "*---------*---------------*" - echo "| CHARSEL | " $1 + echo "| ${bold}CHARSEL${normal} |" $1 echo "*---------*---------------*" echo "" - cat $CHARFILE \ - | sed -e '/^[ \t]*#/d' \ - | grep -A 100 - \ - | tail -n +2 \ - | column -t -N input,output --output-separator ' | ' --separator ',' + if [[ $SHOWALL == true ]] + then + cat $CHARFILE | sed -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 ',' + fi echo "" echo "*-------------------------*" echo "| previous shorcode:" $INPUT echo "| previous output: " $OUTPUT echo "*-------------------------*" - - # User input - read -p "| input shortcode: " -N $LENGTH INPUT - # This can definately be simplifed, but it works fine - LINENUMBER=$(cut -f 1 -d ',' -s $CHARFILE \ - | grep -wn $INPUT \ - | cut -d : -f 1) - - OUTPUT=$(cut -f 2 -d ',' -s $CHARFILE \ - | head -$LINENUMBER \ - | tail +$LINENUMBER) + # User input + read -p "| ${bold}input shortcode: ${normal} " -N $LENGTH INPUT - if [[ $(cut -f 1 -d ',' -s $CHARFILE \ - | grep -wnc $INPUT) == "0" ]] + if [[ $INPUT == ";"* ]] # Semicolon exts then - OUTPUT="" - fi + clear + exit 0 + elif [[ $INPUT == " "* ]] # Spaces dont count + then + OUTPUT="" + clear + else + # Finds line number of shortcode + LINENUMBER=$(cut -f 1 -d ',' -s $CHARFILE | grep -wn $INPUT | cut -d : -f 1) - # Copy output to clipboard - echo $OUTPUT | xclip -selection clipboard + # Outputs character selected above + OUTPUT=$(cut -f 2 -d ',' -s $CHARFILE | head -$LINENUMBER | tail +$LINENUMBER) - # Clear screen - clear + # 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 + echo $OUTPUT | xclip -selection clipboard + + clear + fi done