less/lessopen.sh

189 lines
5.9 KiB
Bash

#!/bin/bash
#
# Copyright (c) 2001 SUSE GmbH, Nuernberg, Germany
# Copyright (c) 2002 SUSE Linux AG, Nuernberg, Germany
#
# Author: Vladimir Linek <vinil@suse.cz>
# Support for directory listing by Dimitar Pashov <d.pashov@gmail.com>
#
# Preprocessor for 'less'.
# Use with environment variable: LESSOPEN="lessopen.sh %s"
# the following hack does not break anything but helps to view file whose name
# begins with a "-" or "+" with names
if echo "$1" | grep -q ^/; then
# absolute path
SRC="$1"
else
# relative path
SRC="./$1"
fi
NAME="${SRC##*/}"
[ ! -r "$SRC" ] && exit 1
cleaner() {
test "$TMPF_pre" = "$SRC" -o "$TMPF_pre" = "$TMPF" && return
rm -f "$TMPF_pre"
}
trap 'cleaner' EXIT SIGHUP
TMPF=$(mktemp /tmp/less.XXXXXXXXX) || exit 1
TMPF_pre=$(mktemp /tmp/less.XXXXXXXXX) || exit 1
lang=$LANG
test -n "$LC_CTYPE" && lang="$LC_CTYPE"
case "$lang" in
*.UTF-8|*.UTF8)
GROFF_DEVICE=utf8
;;
ja*)
GROFF_DEVICE=nippon
;;
*)
GROFF_DEVICE=latin1
;;
esac
CMD=
type=`/usr/bin/file -L "$SRC"`
case ${type#"$SRC": } in
*"gzip compressed data"*|\
*"compress'd data"*|\
*"packed data"*)
CMD="gzip -dc" ;;
*"Zip archive data"*)
CMD="unzip -v" ;;
*"bzip"*" compressed data"*)
CMD="bzip2 -dc" ;;
*"xz compressed data"*|\
*"XZ compressed data"*)
CMD="xz -dc" ;;
*)
rm -f "$TMPF_pre"
TMPF_pre="$SRC" ;;
esac
test -n "$CMD" && $CMD "$SRC" >"$TMPF_pre" 2>/dev/null
type=`/usr/bin/file -L "$TMPF_pre"`
case ${type#"$TMPF_pre": } in
*tar\ archive*)
if [ -x "`/usr/bin/which tar 2>/dev/null`" ]; then
tar tvvf "$TMPF_pre" >"$TMPF" 2>/dev/null
else echo "tar is not available for preprocessing" 1>&2; rm -f "$TMPF"; TMPF="$TMPF_pre"; fi
;;
*Microsoft\ Cabinet\ *\ data*)
if [ -x "`/usr/bin/which cabextract 2>/dev/null`" ]; then
cabextract -l "$TMPF_pre" >"$TMPF" 2>/dev/null
else echo "cabextract is not available for preprocessing" 1>&2; rm -f "$TMPF"; TMPF="$TMPF_pre"; fi
;;
*RPM*)
if [ -x "`/usr/bin/which rpm 2>/dev/null`" ]; then
(echo -e "=============================== Information ====================================\n";
rpm -qip "\"$TMPF_pre\"";
echo -e "\n\n================================= Changelog (head) =============================\n";
rpm -qp --changelog "\"$TMPF_pre\"" | head -n 16
echo -e "\n\n================================= Content ======================================\n";
rpm -qlp "\"$TMPF_pre\""
) >"$TMPF" 2>/dev/null
else echo "rpm is not available for preprocessing" 1>&2; rm -f "$TMPF"; TMPF="$TMPF_pre"; fi
;;
*DVI*)
if [ -x "`/usr/bin/which dvi2tty 2>/dev/null`" ]; then
if [ "${TMPF_pre%.dvi}" != "$TMPF_pre" ] ; then
dvi2tty -q "$TMPF_pre" >"$TMPF" 2>/dev/null
else echo "dvi2tty requires an input file name with the suffix .dvi" 1>&2; rm -f "$TMPF"; TMPF="$TMPF_pre" ; fi
else echo "dvi2tty is not available for preprocessing" 1>&2; rm -f "$TMPF"; TMPF="$TMPF_pre"; fi
;;
*PDF*)
if [ -x "`/usr/bin/which pdftotext 2>/dev/null`" ]; then
pdftotext "$TMPF_pre" "$TMPF" 2>/dev/null
else echo "pdftotext is not available for preprocessing" 1>&2; rm -f "$TMPF"; TMPF="$TMPF_pre"; fi
;;
*Debian\ binary\ package*)
if [ -x "`/usr/bin/which dpkg-deb 2>/dev/null`" ]; then
dpkg-deb -c "$TMPF_pre" >"$TMPF" 2>/dev/null
else echo "dpkg-deb is not available for preprocessing" 1>&2; rm -f "$TMPF"; TMPF="$TMPF_pre"; fi
;;
*\ ar\ archive*)
if [ -x "`/usr/bin/which nm 2>/dev/null`" ]; then
nm "$TMPF_pre" >"$TMPF" 2>/dev/null
else echo "nm is not available for preprocessing" 1>&2; rm -f "$TMPF"; TMPF="$TMPF_pre"; fi
;;
*directory*)
# assuming ls is always available
ls -lh "$TMPF_pre" >"$TMPF" 2>/dev/null
;;
*diff\ output*)
# I haven't found way, to set less -R from this script
# so check, if '-R' or '--RAW-CONTROL-CHARS' is set in environment
R_NOT_SET=true
for i in $LESS; do
if [ "${i:0:1}" = "-" ]; then
if [ "${i:1:1}" = "-" ]; then
if [ "$i" = --RAW-CONTROL-CHARS ]; then
R_NOT_SET=false
break
else
continue
fi
else
for j in `seq 1 $((${#i} - 1 ))`; do
if [ "${i:j:1}" = R ]; then
R_NOT_SET=false
break
fi
done
fi
fi
done
# if we have -R and colordiff, we can continue
if [ $R_NOT_SET = false ] && \
[ -x "`/usr/bin/which colordiff 2>/dev/null`" ]; then
colordiff < "$TMPF_pre" | cat > "$TMPF" 2>/dev/null
else rm -f "$TMPF"; TMPF="$TMPF_pre"; fi
;;
*)
if [ "$LESS_ADVANCED_PREPROCESSOR" = "yes" ]; then
case ${type#"$TMPF_pre": } in
*troff*)
if [ -x "`/usr/bin/which groff 2>/dev/null`" ]; then
case "$NAME" in
*.[1-9nxp]*|*.man|*.[1-9nxp]*.*|*.man.*)
groff -s -p -t -e -T$GROFF_DEVICE -mandoc "$TMPF_pre" >"$TMPF" 2>/dev/null ;;
*.ms|*.ms.*)
groff -T$GROFF_DEVICE -ms "$TMPF_pre" >"$TMPF" 2>/dev/null ;;
*.me|*.me.*)
groff -T$GROFF_DEVICE -me "$TMPF_pre" >"$TMPF" 2>/dev/null ;;
*)
groff -T$GROFF_DEVICE "$TMPF_pre" >"$TMPF" 2>/dev/null ;;
esac
else echo "groff is not available for preprocessing" 1>&2; rm -f "$TMPF"; TMPF="$TMPF_pre"; fi
;;
*PostScript*)
if [ -x "`/usr/bin/which ps2ascii 2>/dev/null`" ]; then
ps2ascii "$TMPF_pre" >"$TMPF" 2>/dev/null
else echo "ps2ascii is not available for preprocessing" 1>&2; rm -f "$TMPF"; TMPF="$TMPF_pre"; fi
;;
*HTML*)
if [ -x "`/usr/bin/which w3m 2>/dev/null`" ]; then
w3m -dump -T text/html "$TMPF_pre" >"$TMPF" 2>/dev/null
elif [ -x "`/usr/bin/which lynx 2>/dev/null`" ]; then
lynx -dump -force_html "$TMPF_pre" >"$TMPF" 2>/dev/null
else echo "lynx/w3m not available for preprocessing" 1>&2; rm -f "$TMPF"; TMPF="$TMPF_pre"; fi
;;
*)
rm -f "$TMPF"
TMPF="$TMPF_pre"
;;
esac
else
rm -f "$TMPF"
TMPF="$TMPF_pre"
fi
;;
esac
test "$TMPF" = "$SRC" || echo "$TMPF"