You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
2.0 KiB
103 lines
2.0 KiB
#!/bin/bash |
|
|
|
# tmux requires unrecognized OSC sequences to be wrapped with DCS tmux; |
|
# <sequence> ST, and for all ESCs in <sequence> to be replaced with ESC ESC. It |
|
# only accepts ESC backslash for ST. |
|
function print_osc() { |
|
if [[ $TERM == screen* ]] ; then |
|
printf "\033Ptmux;\033\033]" |
|
else |
|
printf "\033]" |
|
fi |
|
} |
|
|
|
# More of the tmux workaround described above. |
|
function print_st() { |
|
if [[ $TERM == screen* ]] ; then |
|
printf "\a\033\\" |
|
else |
|
printf "\a" |
|
fi |
|
} |
|
|
|
# print_image filename inline base64contents |
|
# filename: Filename to convey to client |
|
# inline: 0 or 1 |
|
# base64contents: Base64-encoded contents |
|
function print_image() { |
|
print_osc |
|
printf '1337;File=' |
|
if [[ -n "$1" ]]; then |
|
printf 'name='`echo -n "$1" | base64`";" |
|
fi |
|
if $(base64 --version 2>&1 | grep GNU > /dev/null) |
|
then |
|
BASE64ARG=-d |
|
else |
|
BASE64ARG=-D |
|
fi |
|
echo -n "$3" | base64 $BASE64ARG | wc -c | awk '{printf "size=%d",$1}' |
|
printf ";inline=$2" |
|
printf ";width=50" |
|
printf ":" |
|
echo -n "$3" |
|
print_st |
|
printf '\n' |
|
} |
|
|
|
function error() { |
|
echo "ERROR: $*" 1>&2 |
|
} |
|
|
|
function show_help() { |
|
echo "Usage: imgcat filename ..." 1>& 2 |
|
echo " or: cat filename | imgcat" 1>& 2 |
|
} |
|
|
|
## Main |
|
|
|
if [ -t 0 ]; then |
|
has_stdin=f |
|
else |
|
has_stdin=t |
|
fi |
|
|
|
# Show help if no arguments and no stdin. |
|
if [ $has_stdin = f -a $# -eq 0 ]; then |
|
show_help |
|
exit |
|
fi |
|
|
|
# Look for command line flags. |
|
while [ $# -gt 0 ]; do |
|
case "$1" in |
|
-h|--h|--help) |
|
show_help |
|
exit |
|
;; |
|
-*) |
|
error "Unknown option flag: $1" |
|
show_help |
|
exit 1 |
|
;; |
|
*) |
|
if [ -r "$1" ] ; then |
|
print_image "$1" 1 "$(base64 < "$1")" |
|
else |
|
error "imgcat: $1: No such file or directory" |
|
exit 2 |
|
fi |
|
;; |
|
esac |
|
shift |
|
done |
|
|
|
# Read and print stdin |
|
if [ $has_stdin = t ]; then |
|
print_image "" 1 "$(cat | base64)" |
|
fi |
|
|
|
echo |
|
echo |
|
|
|
exit 0
|
|
|