#!/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.7 # Define argument functions function usage() { echo "Usage: /usr/bin/charsel [OPTION]... [CHARFILE]... 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 -v print version 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 } # Merge global and local charfiles if [[ -d $CHARDIR ]] then rm -rf $CHARDIR/* else mkdir $CHARDIR fi LOCALCHARDIR=$HOME/.local/share/charsel/charfiles if [[ ! -d $LOCALCHARDIR ]] then mkdir -p $LOCALCHARDIR fi localdirfiles=($LOCALCHARDIR/*) if [[ ! -z "${#localdirfiles[*]}" ]] then cp -rf $LOCALCHARDIR/../* $CHARDIR fi globaldirfiles=($/usr/share/charfiles/) if [[ ! -z "${#globaldirfiles[*]}" ]] then 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 ":abcdhlLnv" 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" ;; v) echo "charsel" $VERSION exit 0 ;; ?) echo "Invalid option" usage exit 3 ;; esac done shift $((OPTIND-1)) # Redefine charfile and check file validity CHARFILE="$CHARDIR/charfiles/$1" existence validity # Dependency check if [[ ! $COPY == "no" ]] then if [[ -x xclip ]] then echo "Please install xclip." exit 4 fi fi if [[ $(echo $LANG | grep UTF-8) -ne 0 ]] then echo "Please enable unicode support" exit 4 fi # Define length of shortcode LENGTH=$(cat $CHARFILE \ | cut -f 1 -d ',' -s \ | wc -L \ | cut -b 1) clear # Define text formatting bold=$(tput bold) normal=$(tput sgr0) if [[ $COLOR == bw ]] then magenta=$(tput setaf 7) else magenta=$(tput setaf 5) fi white=$(tput setaf 7) # Main program while true do # Format output echo "*---------*---------------*" echo "| ${bold}${magenta}CHARSEL${white}${normal} |" $1 echo "*---------*---------------*" echo "" 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 "| ${bold}input shortcode: ${normal} " -N $LENGTH INPUT if [[ $INPUT == ";"* ]] # Semicolon exts then 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) # 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