ponysay/ponysay.sh

295 lines
6.8 KiB
Bash
Raw Normal View History

2012-07-21 15:43:21 +02:00
#!/usr/bin/env bash
2012-02-26 19:52:17 +01:00
2012-08-18 01:56:08 +02:00
VERSION=1.4.1
2012-02-26 18:28:03 +01:00
2012-07-24 16:34:44 +02:00
2012-08-01 03:33:30 +02:00
# 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"
quotecmd="$INSTALLDIR/lib/ponysay/pq4ps"
2012-08-18 04:21:49 +02:00
qlistcmd="$INSTALLDIR/lib/ponysay/pq4ps-list.pl"
2012-08-01 03:33:30 +02:00
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
2012-07-21 18:16:18 +02:00
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-"
2012-07-21 18:16:18 +02:00
2012-08-01 03:33:30 +02:00
# Directories for installed ponies files
2012-05-07 16:07:39 +02:00
if [ "$TERM" = "linux" ]; then
2012-08-01 03:33:30 +02:00
SYSTEMPONIES="$SYSTEMSHARE/ttyponies"
HOMEPONIES="$HOMESHARE/ttyponies"
2012-07-24 16:34:44 +02:00
else
2012-08-01 03:33:30 +02:00
SYSTEMPONIES="$SYSTEMSHARE/ponies"
HOMEPONIES="$HOMESHARE/ponies"
2012-05-07 16:07:39 +02:00
fi
2012-08-01 03:33:30 +02:00
# Cowsay script
if [ ${0} == *ponythink ]; then
if [ "$PONYSAY_COWTHINK" = "" ]; then
2012-08-01 03:33:30 +02:00
cmd=cowthink
customcmd=0
else
cmd="$PONYSAY_COWTHINK"
customcmd=1
fi
else
if [ "$PONYSAY_COWSAY" = "" ]; then
2012-08-01 03:33:30 +02:00
cmd=cowsay
customcmd=0
else
cmd="$PONYSAY_COWSAY"
customcmd=1
fi
fi
2012-02-26 16:47:05 +01:00
2012-08-01 03:33:30 +02:00
# Ponysay version print function
2012-02-26 20:01:22 +01:00
version() {
2012-08-01 03:33:30 +02:00
echo "ponysay v$VERSION"
2012-02-26 20:01:22 +01:00
}
2012-08-18 04:21:49 +02:00
# Marks ponies in lists that have quotes
qoutelist() {
bash -c "$("$qlistcmd" $("$quotecmd" --list))"
}
2012-08-01 03:33:30 +02:00
# Pony list function
2012-04-05 17:17:13 +02:00
list() {
if [ -d $SYSTEMPONIES ]; then
2012-08-01 03:33:30 +02:00
echo -e "\\e[01mponyfiles located in $SYSTEMPONIES:\\e[21m"
2012-08-18 04:21:49 +02:00
perl $listcmd $scrw $(ls --color=no $SYSTEMPONIES | sed -e 's/\.pony$//' | sort) | qoutelist
2012-08-01 03:33:30 +02:00
fi
if [ -d $HOMEPONIES ]; then
echo -e "\\e[01mponyfiles located in $HOMEPONIES:\\e[21m"
2012-08-18 04:21:49 +02:00
perl $listcmd $scrw $(ls --color=no $HOMEPONIES | sed -e 's/\.pony$//' | sort) | qoutelist
2012-08-01 03:33:30 +02:00
fi
if [ ! -d $SYSTEMPONIES ] && [ ! -d $HOMEPONIES ]; then
2012-08-01 03:33:30 +02:00
echo >&2 "All the ponies are missing! Call the Princess!"
fi
}
2012-08-01 03:33:30 +02:00
# 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
2012-08-18 04:21:49 +02:00
target="$(readlink $1"/"$file".pony")"
2012-08-18 04:21:49 +02:00
if [ "$target" = "" ]; then
target=$file
else
target=$(echo $target | sed -e 's/^\.\///g' -e 's/\.pony$//g')
fi
args=$(echo $args $file $target)
done
2012-08-18 04:21:49 +02:00
perl $listcmd $scrw $(perl $linklistcmd $(echo $args) | sed -e 's/ /_/g') | sed -e 's/_/ /g' | qoutelist
}
2012-08-01 03:33:30 +02:00
# Pony list function with symlink map, for both directories
linklist() {
_linklist $SYSTEMPONIES
if [ -d $HOMEPONIES ]; then
_linklist $HOMEPONIES
fi
2012-04-05 17:17:13 +02:00
}
2012-08-01 03:33:30 +02:00
# Pony quotes
ponyquotes() {
[ "$TERM" = "-linux-" ] && TERM="linux"
2012-08-18 01:56:08 +02:00
"$0" ${wrap:+-W$wrap} $("$quotecmd" $@)
2012-08-01 03:33:30 +02:00
}
# Usage help print function
2012-02-26 20:01:22 +01:00
usage() {
version
cat <<EOF
2012-03-12 02:34:00 +01:00
Usage:
${0##*/} [options] [message]
If [message] is not provided, reads the message from STDIN.
2012-03-12 02:34:00 +01:00
Options:
-v Show version and exit.
-h Show this help and exit.
-l List pony files.
-L List pony files with synonyms inside brackets.
-q Use the pony quote feature.
-f[name] Select a pony (either a file name or a pony name.)
-W[column] The screen column where the message should be wrapped.
2012-07-13 02:18:53 +02:00
See man ponysay(6) for more information.
2012-03-12 02:34:00 +01:00
EOF
2012-02-26 20:01:22 +01:00
}
2012-02-26 16:47:05 +01:00
2012-08-01 03:33:30 +02:00
# Function for printing the ponies and the message
say() {
# Ponies use UTF-8 drawing characters. Prevent a Perl warning.
export PERL_UNICODE=S
2012-08-01 03:33:30 +02:00
# Clear screen in TTY
2012-08-18 01:56:08 +02:00
( [ "$TERM" = "linux" ] || [ "$TERM" = "-linux-" ] ) && echo -ne '\e[H\e[2J'
2012-08-01 03:33:30 +02:00
# Set PONYSAY_SHELL_LINES to default if not specified
[ "$PONYSAY_SHELL_LINES" = "" ] && PONYSAY_SHELL_LINES=2
2012-08-01 03:33:30 +02:00
# Width trunction
function wtrunc {
if [ "$PONYSAY_FULL_WIDTH" = 'yes' ] || [ "$PONYSAY_FULL_WIDTH" = 'y' ] || [ "$PONYSAY_FULL_WIDTH" = '1' ]; then
cat
else
2012-08-18 01:56:08 +02:00
if [ -f $truncatercmd ]; then
2012-08-01 03:33:30 +02:00
$truncatercmd $scrw
else
cat
fi
fi
}
2012-08-01 03:33:30 +02:00
# Height trunction, show top
function htrunchead {
2012-08-01 03:33:30 +02:00
head --lines=$(( $scrh - $PONYSAY_SHELL_LINES ))
}
2012-08-01 03:33:30 +02:00
# Height trunction, show bottom
function htrunctail {
2012-08-01 03:33:30 +02:00
tail --lines=$(( $scrh - $PONYSAY_SHELL_LINES ))
}
2012-08-01 03:33:30 +02:00
# Simplification of customisation of cowsay
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 > "/tmp/ponythink"
perl '/tmp/ponythink' "$@"
rm '/tmp/ponythink'
else
perl <(cat <(echo -e $pcmd) $ccmd) "$@"
fi
}
else
function cowcmd {
$cmd "$@"
}
fi
2012-08-01 03:33:30 +02:00
# KMS ponies support
if [ "$kmscmd" = "" ]; then
2012-07-21 18:16:18 +02:00
function runcmd {
cowcmd -f "$pony" "$@"
}
else
function runcmd {
cowcmd -f <($kmscmd "$pony") "$@"
}
fi
2012-08-01 03:33:30 +02:00
# 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
2012-07-21 18:16:18 +02:00
runcmd "${wrap:+-W$wrap}" | wtrunc | htrunctail
else
2012-07-21 18:16:18 +02:00
runcmd "${wrap:+-W$wrap}" | wtrunc | htrunchead
fi
else
2012-07-21 18:16:18 +02:00
runcmd "${wrap:+-W$wrap}" | wtrunc
fi
}
2012-07-18 16:47:57 +02:00
2012-08-01 03:33:30 +02:00
# If no stdin and no arguments then print usage and exit
2012-08-18 01:56:08 +02:00
if [ -t 0 ] && [ $# == 0 ]; then
2012-08-01 03:33:30 +02:00
usage
exit
fi
2012-08-01 03:33:30 +02:00
# 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" ;;
2012-08-18 01:56:08 +02:00
q) shift $((OPTIND - 1)); ponyquotes "$*"; exit ;;
\?) usage >&2; exit 1 ;;
esac
2012-02-26 16:47:05 +01:00
done
shift $((OPTIND - 1))
2012-02-26 19:52:17 +01:00
2012-08-01 03:33:30 +02:00
# Check for cowsay
hash $cmd &>/dev/null; if [ $? -ne 0 ]; then
cat >&2 <<EOF
2012-03-12 02:34:00 +01:00
You don't seem to have the $cmd program.
Please install it in order to use this wrapper.
Alternatively, symlink it to '$cmd' in anywhere in \$PATH
if it actually exists under a different filename.
EOF
exit 1
2012-03-12 02:34:00 +01:00
fi
2012-08-01 03:33:30 +02:00
# Select random pony for the set of -f arguments
if [ ! ${#ponies[@]} == 0 ]; then
pony="${ponies[$RANDOM%${#ponies[@]}]}"
2012-07-18 16:47:57 +02:00
fi
2012-08-01 03:33:30 +02:00
# Pony not a file? Search for it
if [ ! -f $pony ]; then
ponies=()
[ -d $SYSTEMPONIES ] && ponies+=( "$SYSTEMPONIES"/$pony.pony )
[ -d $HOMEPONIES ] && ponies+=( "$HOMEPONIES"/$pony.pony )
if (( ${#ponies} < 1 )); then
echo >&2 "All the ponies are missing! Call the Princess!"
exit 1
fi
# Choose a random pony
pony="${ponies[$RANDOM%${#ponies[@]}]}"
2012-02-26 19:52:17 +01:00
fi
2012-08-01 03:33:30 +02:00
# Print pony with message
if [ -n "$*" ]; then
# Handle a message given via arguments
say <<<"$*"
else
2012-08-01 03:33:30 +02:00
# Handle a message given in stdin
say
fi