# HG changeset patch # User Steve Losh # Date 1455972128 0 # Node ID ab72ef75498b6ba123693202b0b7e3e1e43ca02c # Parent 2f4e50ec8f4db876badbe58446df4dff1e10035f Add imgcat diff -r 2f4e50ec8f4d -r ab72ef75498b bin/imgcat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bin/imgcat Sat Feb 20 12:42:08 2016 +0000 @@ -0,0 +1,103 @@ +#!/bin/bash + +# tmux requires unrecognized OSC sequences to be wrapped with DCS tmux; +# ST, and for all ESCs in 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