#!/usr/bin/env bash version=1.0 SYSTEMPONIES="/usr/share/ponysay/ponies" HOMEPONIES="${HOME}/.local/share/ponysay/ponies" SCRIPTDIR="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # Get bash script directory pony="*" wrap="" if [ "$TERM" = "linux" ]; then SYSTEMPONIES="/usr/share/ponysay/ttyponies" HOMEPONIES="${HOME}/.local/share/ponysay/ttyponies" fi if [[ "$PONYSAY_COWSAY" = "" ]]; then cmd=cowsay customcmd=0 else cmd="$PONYSAY_COWSAY" customcmd=1 fi [[ ${0} == *ponythink ]] && if [[ "$PONYSAY_COWTHINK" = "" ]]; then cmd=cowthink customcmd=0 else cmd="$PONYSAY_COWTHINK" customcmd=1 fi version() { echo "ponysay v$version" } scrw=`(stty size <&2 || echo 0 0) | cut -d ' ' -f 2` listcmd="${SCRIPTDIR}/../lib/ponysay/list.pl" truncatercmd="${SCRIPTDIR}/../lib/ponysay/truncater" haspq=1 if [[ -f './pq4ps-list' ]]; then function qlist { ./pq4ps-list } elif [[ -f '/usr/bin/pq4ps-list' ]]; then function qlist { /usr/bin/pq4ps-list } else haspq=0 function qlist { cat } fi list() { echo -e "\\e[01mponyfiles located in $SYSTEMPONIES:\\e[21m" perl $listcmd $scrw $(ls --color=no $SYSTEMPONIES | sed -e 's/\.pony$//' | sort) | qlist 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) | qlist fi } _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 scrw=`(stty size <&2 || echo 0 0) | cut -d ' ' -f 2` perl '/dev/stdin' $(echo $args) < '/dev/shm/.ponysay~' #!/usr/bin/perl #Author: Mattias Andrée (maandree@kth.se) %hash = (); \$argc = @ARGV; \$i = 0; while (\$i < \$argc) { \$source = \$ARGV[\$i]; \$i += 1; \$target = \$ARGV[\$i]; \$i += 1; if (\$source eq \$target) { \$hash{\$source} = [ () ]; } } \$i = 0; while (\$i < \$argc) { \$source = \$ARGV[\$i]; \$i += 1; \$target = \$ARGV[\$i]; \$i += 1; unless (\$source eq \$target) { push @{ \$hash{\$target} }, \$source; } } \$i = 0; while (\$i < \$argc) { \$source = \$ARGV[\$i]; \$i += 1; \$target = \$ARGV[\$i]; \$i += 1; if (\$source eq \$target) { @list = @{ \$hash{\$source} }; \$first = 1; print \$source; foreach \$link (@list) { if (\$first eq 1) { print " (".\$link; \$first = 0; } else { print " ".\$link; } } if (\$first eq 0) { print ")"; } print "\n"; } } EOF perl $listcmd $scrw $(cat "/dev/shm/.ponysay~") | sed -e 's/_/ /g' | qlist rm '/dev/shm/.ponysay~' } linklist() { _linklist $SYSTEMPONIES if [[ -d $HOMEPONIES ]]; then _linklist $HOMEPONIES fi } usage() { version cat </dev/null || cat fi } if [ "$PONYSAY_SHELL_LINES" = "" ]; then PONYSAY_SHELL_LINES=2 fi function htrunchead { head --lines=$(( `stty size <&2 | cut -d ' ' -f 1` - $PONYSAY_SHELL_LINES )) } function htrunctail { tail --lines=$(( `stty size <&2 | cut -d ' ' -f 1` - $PONYSAY_SHELL_LINES )) } if [[ $customcmd = 0 ]]; then function cowcmd { pcmd='#!/usr/bin/perl\nuse utf8;' ccmd=$(for c in $(echo $PATH":" | sed -e 's/:/\/'"$cmd"' /g'); do if [[ -f $c ]]; then echo $c; break; fi done) if [[ ${0} == *ponythink ]]; then cat <(echo -e $pcmd) $ccmd > "/dev/shm/.ponythink" perl '/dev/shm/.ponythink' "$@" rm '/dev/shm/.ponythink' else perl <(cat <(echo -e $pcmd) $ccmd) "$@" fi } else function cowcmd { echo "custom $cmd" $cmd "$@" } fi 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 cowcmd -f "$pony" "${wrap:+-W$wrap}" | wtrunc | htrunctail else cowcmd -f "$pony" "${wrap:+-W$wrap}" | wtrunc | htrunchead fi else cowcmd -f "$pony" "${wrap:+-W$wrap}" | wtrunc fi } ponies=() opts="f:W:Llhv" if [[ $haspq ]]; then opts=$opts"q" fi usepq=0 while getopts $opts OPT; do case ${OPT} in v) version; exit ;; h) usage; exit ;; f) ponies+=( "$OPTARG" ) ;; l) list; exit ;; L) linklist; exit ;; W) wrap="$OPTARG" ;; q) usepq=1 ;; \?) usage >&2; exit 1 ;; esac done shift $((OPTIND - 1)) if [[ $usepq = 1 ]]; then if [[ -f './pq4ps' ]]; then function q { ./pq4ps $@ } elif [[ -f '/usr/bin/pq4ps' ]]; then function q { /usr/bin/pq4ps $@ } fi $0 ${wrap:+-W$wrap} $(q "$*") exit fi 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 if [[ -n "$*" ]]; then # Handle a message given via arguments say <<<"$*" else say fi