X-Git-Url: https://git.armaanb.net/?a=blobdiff_plain;f=charsel;h=7938a1c251847e106e55ddad6a63fb33b6b75242;hb=d0ed470926adc3f7c4d94e3c91a353317654010a;hp=b3dc78623b172d3f0aa75f1132c255167b97afce;hpb=02249eac92b1de13a5d6b0231aad68c51ad56b18;p=charsel.git diff --git a/charsel b/charsel index b3dc786..7938a1c 100755 --- a/charsel +++ b/charsel @@ -1,47 +1,275 @@ -#!/usr/bin/env sh -# Merge both global and local charfiles -CHARDIR=/tmp/charsel -cp -R /usr/share/charsel/* $CHARDIR/ -cp -R ~/.local/share/* $CHARDIR/ +#!/usr/bin/env bash -# Clear screen -clear +####################################################################### + +# (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 . + +######################################################################## -# Check if user provided an input -[ -z "$1" ] && echo "No argument supplied" && exit +VERSION=2.0.8 -if [ $1 = "list" ]; then - echo "The following charfiles are installed" +# 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 check for updates + -v print current version + +Exit status: + 0 okay, + 1 charfile does not exist, + 2 charfile syntax error, + 3 usage error/invalid option, + 4 other error" +} + +function version_check(){ + NEW_VERSION=$(curl -s https://codeberg.org/armaan/charsel/raw/branch/master/charsel \ + | grep VERSION= | tail -c +9) + if [[ $VERSION != $NEW_VERSION ]] + then + echo "an update is available" + else + echo "you are up to date" + fi + +} + +CHARDIR=$HOME/.cache/charsel +function list() { ls $CHARDIR/charfiles - exit +} + +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 -# Define charfile -CHARFILE=$CHARDIR/charfiles/$1 +LOCALCHARDIR=$HOME/.local/share/charsel/charfiles +if [[ ! -d $LOCALCHARDIR ]] +then + mkdir -p $LOCALCHARDIR +fi -# Define length of shortcut -LENGTH=$(cat $CHARFILE | cut -f 1 -d ',' -s | wc -L | cut -b 1) +localdirfiles=($LOCALCHARDIR/*) +if [[ ! -z "${#localdirfiles[*]}" ]] +then + cp -rf $LOCALCHARDIR/../* $CHARDIR +fi -# MOTD -cat /tmp/charsel/motd +globaldirfiles=($/usr/share/charfiles/) +if [[ ! -z "${#globaldirfiles[*]}" ]] +then + cp -rf /usr/share/charsel/* $CHARDIR +fi -# Main program -while : +# 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 - # 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 ',' + 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 + ;; + V) + version_check + exit 0 + ;; + ?) + echo "Invalid option" + usage + exit 3 + ;; + esac +done +shift $((OPTIND-1)) - # Automatically enter input - read -N $LENGTH INPUT - - # Navigate to the right characther - OUTPUT=$(grep $INPUT $CHARFILE | cut -f 2 -d ',' -s) +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 - # Clear screen - clear +# Dependency check +if [[ ! $COPY == "no" ]] +then + if [[ -x xclip ]] + then + echo "Please install xclip." + exit 4 + fi +fi - # Copy output to clipboard - echo $OUTPUT | xclip -selection clipboard -done +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