| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- #!/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. We use TERM instead of TMUX because TERM
- # gets passed through ssh.
- 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
- }
- function load_version() {
- if [ -z ${IMGCAT_BASE64_VERSION+x} ]; then
- export IMGCAT_BASE64_VERSION=$(base64 --version 2>&1)
- fi
- }
- function b64_encode() {
- load_version
- if [[ "$IMGCAT_BASE64_VERSION" =~ GNU ]]; then
- # Disable line wrap
- base64 -w0
- else
- base64
- fi
- }
- function b64_decode() {
- load_version
- if [[ "$IMGCAT_BASE64_VERSION" =~ fourmilab ]]; then
- BASE64ARG=-d
- elif [[ "$IMGCAT_BASE64_VERSION" =~ GNU ]]; then
- BASE64ARG=-di
- else
- BASE64ARG=-D
- fi
- base64 $BASE64ARG
- }
- # print_image filename inline base64contents print_filename
- # filename: Filename to convey to client
- # inline: 0 or 1
- # base64contents: Base64-encoded contents
- # print_filename: If non-empty, print the filename
- # before outputting the image
- function print_image() {
- print_osc
- printf '1337;File='
- if [[ -n "$1" ]]; then
- printf 'name='`printf "%s" "$1" | b64_encode`";"
- fi
- printf "%s" "$3" | b64_decode | wc -c | awk '{printf "size=%d",$1}'
- printf ";inline=$2"
- printf ":"
- printf "%s" "$3"
- print_st
- printf '\n'
- if [[ -n "$4" ]]; then
- echo $1
- fi
- }
- function error() {
- echo "ERROR: $*" 1>&2
- }
- function show_help() {
- echo "Usage: imgcat [-p] filename ..." 1>& 2
- echo " or: cat filename | imgcat" 1>& 2
- }
- function check_dependency() {
- if ! (builtin command -V "$1" > /dev/null 2>& 1); then
- echo "imgcat: missing dependency: can't find $1" 1>& 2
- exit 1
- fi
- }
- ## 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
- check_dependency awk
- check_dependency base64
- check_dependency wc
- # Look for command line flags.
- while [ $# -gt 0 ]; do
- case "$1" in
- -h|--h|--help)
- show_help
- exit
- ;;
- -p|--p|--print)
- print_filename=1
- ;;
- -u|--u|--url)
- check_dependency curl
- encoded_image=$(curl -s "$2" | b64_encode) || (error "No such file or url $2"; exit 2)
- has_stdin=f
- print_image "$2" 1 "$encoded_image" "$print_filename"
- set -- ${@:1:1} "-u" ${@:3}
- if [ "$#" -eq 2 ]; then
- exit
- fi
- ;;
- -*)
- error "Unknown option flag: $1"
- show_help
- exit 1
- ;;
- *)
- if [ -r "$1" ] ; then
- has_stdin=f
- print_image "$1" 1 "$(b64_encode < "$1")" "$print_filename"
- 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 | b64_encode)" ""
- fi
- exit 0
|