#!/usr/bin/env bash VERSION=1.3 # Get bash script directory's parent INSTALLDIR="$(dirname $( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd ))" # Directory for installed media files SYSTEMSHARE="$INSTALLDIR/share/ponysay" HOMESHARE="${HOME}/.local/share/ponysay" # Subscripts listcmd="$INSTALLDIR/lib/ponysay/list.pl" linklistcmd="$INSTALLDIR/lib/ponysay/linklist.pl" truncatercmd="$INSTALLDIR/lib/ponysay/truncater" qlistcmd="$INSTALLDIR/lib/ponysay/pq4ps-list" quotecmd="$INSTALLDIR/lib/ponysay/pq4ps" pony="*" # Selected pony wrap="" # Message wrap column ponies=() # Selected ponies scrw=`(stty size <&2 || echo 0 0) | cut -d ' ' -f 2` # Screen width scrh=`(stty size <&2 || echo 0 0) | cut -d ' ' -f 1` # Screen height # KMS ponies extension kmscmd="" [[ "$TERM" = "linux" ]] && kmscmd=$(for c in $(echo $PATH":" | sed -e 's/:/\/ponysay2kmsponysay /g'); do if [[ -f $c ]]; then echo $c; break; fi done) [[ ! "$kmscmd" = "" ]] && TERM="-linux-" # Directories for installed ponies files if [ "$TERM" = "linux" ]; then SYSTEMPONIES="$SYSTEMSHARE/ttyponies" HOMEPONIES="$HOMESHARE/ttyponies" else SYSTEMPONIES="$SYSTEMSHARE/ponies" HOMEPONIES="$HOMESHARE/ponies" fi # Cowsay script if [[ ${0} == *ponythink ]]; then if [[ "$PONYSAY_COWTHINK" = "" ]]; then cmd=cowthink customcmd=0 else cmd="$PONYSAY_COWTHINK" customcmd=1 fi else if [[ "$PONYSAY_COWSAY" = "" ]]; then cmd=cowsay customcmd=0 else cmd="$PONYSAY_COWSAY" customcmd=1 fi fi # Ponysay version print function version() { echo "ponysay v$VERSION" } # Pony list function list() { if [[ -d $SYSTEMPONIES ]]; then echo -e "\\e[01mponyfiles located in $SYSTEMPONIES:\\e[21m" perl $listcmd $scrw $(ls --color=no $SYSTEMPONIES | sed -e 's/\.pony$//' | sort) | $qlistcmd fi if [[ -d $HOMEPONIES ]]; then echo -e "\\e[01mponyfiles located in $HOMEPONIES:\\e[21m" perl $listcmd $scrw $(ls --color=no $HOMEPONIES | sed -e 's/\.pony$//' | sort) | $qlistcmd fi if [[ ! -d $SYSTEMPONIES ]] && [[ ! -d $HOMEPONIES ]]; then echo >&2 "All the ponies are missing! Call the Princess!" fi } # Pony list function with symlink map, for one directory _linklist() { echo -e "\\e[01mponyfiles located in $1:\\e[21m" files=$(ls --color=no $1 | sed -e 's/\.pony$//' | sort) args="" for file in $files; do target=$(readlink $1"/"$file".pony") if [[ $target = "" ]]; then target=$file else target=$(echo $target | sed -e 's/^\.\///g' -e 's/\.pony$//g') fi args=$(echo $args $file $target) done perl $listcmd $scrw $(perl $linklistcmd $(echo $args) | sed -e 's/ /_/g') | sed -e 's/_/ /g' | $qlistcmd } # Pony list function with symlink map, for both directories linklist() { _linklist $SYSTEMPONIES if [[ -d $HOMEPONIES ]]; then _linklist $HOMEPONIES fi } # Pony quotes ponyquotes() { [[ "$TERM" = "-linux-" ]] && TERM="linux" "$0" ${wrap:+-W$wrap} $("$quotecmd" "$*") } # Usage help print function usage() { version cat < "/tmp/ponythink" perl '/tmp/ponythink' "$@" rm '/tmp/ponythink' else perl <(cat <(echo -e $pcmd) $ccmd) "$@" fi } else function cowcmd { $cmd "$@" } fi # KMS ponies support if [[ "$kmscmd" = "" ]]; then function runcmd { cowcmd -f "$pony" "$@" } else function runcmd { cowcmd -f <($kmscmd "$pony") "$@" } fi # Print the pony and the message if [ "$TERM" = "linux" ] || [ "$PONYSAY_TRUNCATE_HEIGHT" = 'yes' ] || [ "$PONYSAY_TRUNCATE_HEIGHT" = 'y' ] || [ "$PONYSAY_TRUNCATE_HEIGHT" = '1' ]; then if [ "$PONYSAY_BOTTOM" = 'yes' ] || [ "$PONYSAY_BOTTOM" = 'y' ] || [ "$PONYSAY_BOTTOM" = '1' ]; then runcmd "${wrap:+-W$wrap}" | wtrunc | htrunctail else runcmd "${wrap:+-W$wrap}" | wtrunc | htrunchead fi else runcmd "${wrap:+-W$wrap}" | wtrunc fi } # If no stdin and no arguments then print usage and exit if [[ -t 0 && $# == 0 ]]; then usage exit fi # Parse options while getopts "f:W:Llhvq" OPT; do case ${OPT} in v) version; exit ;; h) usage; exit ;; f) ponies+=( $OPTARG ) ;; l) list; exit ;; L) linklist; exit ;; W) wrap="$OPTARG" ;; q) ponyquotes; exit ;; \?) usage >&2; exit 1 ;; esac done shift $((OPTIND - 1)) # Check for cowsay hash $cmd &>/dev/null; if [ $? -ne 0 ]; then cat >&2 <&2 "All the ponies are missing! Call the Princess!" exit 1 fi # Choose a random pony pony="${ponies[$RANDOM%${#ponies[@]}]}" fi # Print pony with message if [[ -n "$*" ]]; then # Handle a message given via arguments say <<<"$*" else # Handle a message given in stdin say fi