#!/bin/bash # lesspipe.sh, a preprocessor for less (version 1.83) #=============================================================================== ### THIS FILE IS GENERATED FROM lesspipe.sh.in, PLEASE GET THE ZIP FILE ### from https://github.com/wofr06/lesspipe.sh/archive/lesspipe.zip ### AND RUN configure TO GENERATE A lesspipe.sh THAT WORKS IN YOUR ENVIRONMENT #=============================================================================== # # Usage: lesspipe.sh is called when the environment variable LESSOPEN is set: # LESSOPEN="|lesspipe.sh %s"; export LESSOPEN (sh like shells) # setenv LESSOPEN "|lesspipe.sh %s" (csh, tcsh) # Use the fully qualified path if lesspipe.sh is not in the search path # View files in multifile archives: # less archive_file:contained_file # This can be used to extract ASCII files from a multifile archive: # less archive_file:contained_file>extracted_file # As less is not good for extracting raw data use instead: # lesspipe.sh archive_file:contained_file>extracted_file # Even a file in a multifile archive that itself is contained in yet # another archive can be viewed this way: # less super_archive:archive_file:contained_file # Display the last file in the file1:..:fileN chain in raw format: # Suppress input filtering: less file1:..:fileN: (append a colon) # Suppress decompression: less file1:..:fileN:: (append 2 colons) # # Required programs and supported formats: see the separate file README # License: GPL (see file LICENSE) # History: see the separate file ChangeLog # Author: Wolfgang Friebel, DESY (Wolfgang.Friebel AT desy.de) # #=============================================================================== ( [[ -n 1 && -n 2 ]] ) > /dev/null 2>&1 || exec zsh -y --ksh-arrays -- "$0" ${1+"$@"} #setopt KSH_ARRAYS SH_WORD_SPLIT 2>/dev/null set +o noclobber tarcmd='tar' dir=${LESSOPEN#\|} dir=${dir%%lesspipe.sh*\%s} dir=${dir%%/} PATH=$PATH:$dir cmd_exist () { command -v "$1" > /dev/null 2>&1 && return 0 || return 1 } filecmd() { file -L -s "$@" file -L -s -i "$@" 2> /dev/null | sed -n 's/.*charset=/;/p' | tr a-z A-Z } sep=: # file name separator altsep== # alternate separator character if [[ -e "$1" && "$1" = *$sep* || "$1" = *$altsep ]]; then sep=$altsep xxx="${1%=}" set "$xxx" fi if cmd_exist mktemp; then tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/lesspipe.XXXXXXXXXX") nexttmp () { # nexttmp -d returns a directory mktemp $1 "${tmpdir}/XXXXXXXX" } else tmpdir=${TMPDIR:-/tmp}/lesspipe.$RANDOM mkdir $tmpdir nexttmp () { new="$tmpdir/lesspipe.$RANDOM" [[ "$1" = -d ]] && mkdir $new echo $new } fi [[ -d "$tmpdir" ]] || exit 1 trap "rm -rf '$tmpdir'" 0 trap - PIPE unset iconv iconv() { if [[ -z "$iconv" ]]; then arg=$(printf "%s$(command iconv --help 2>/dev/null | \ sed -n 's/.*\(--.*-subst=\)\(FORMATSTRING\).*/\1\\033[7m?\\033[m/p' | \ tr \\n ' ')") if [[ -n "$arg" ]]; then iconv="command iconv -c $arg -t //TRANSLIT" else iconv="command iconv -c" fi fi if $iconv "$@" > /dev/null 2>&1; then msg "append $sep to filename to view the $2 encoded data" $iconv "$@" fi } msg () { if [[ -n "$LESSQUIET" ]]; then return fi echo "==> $@" } filetype () { # wrapper for 'file' command typeset name name="$1" if [[ "$1" = - ]]; then dd bs=40000 count=1 > "$tmpdir/file" 2>/dev/null set "$tmpdir/file" "$2" name="$filen" fi if [[ ("$name" = *.br || "$name" = *.bro || "$name" = *.tbr) ]]; then # In current format, brotli can only be detected by extension echo " brotli compressed data" return fi typeset type # type=" $(filecmd -b "$1")" # not supported by all versions of 'file' type=$(filecmd "$1" | cut -d : -f 2-) if [[ "$type" = " empty" ]]; then # exit if file returns "empty" (e.g., with "less archive:nonexisting_file") exit 1 elif [[ "$type" = *XML* && "$name" = *html ]]; then type=" HTML document text" elif [[ ("$type" = *HTML* || "$type" = *ASCII*) && "$name" = *xml ]]; then type=" XML document text" elif [[ "$type" != *lzip\ compressed* && ("$name" = *.lzma || "$name" = *.tlz) ]]; then type=" LZMA compressed data" elif [[ ("$type" = *Zip* || "$type" = *ZIP*) && ("$name" = *.jar || "$name" = *.xpi) ]]; then type=" Zip compressed Jar archive" elif [[ "$type" = *Microsoft\ Office\ Document* && ("$name" = *.ppt) ]]; then type=" PowerPoint document" elif [[ "$type" = *Microsoft\ Office\ Document* && ("$name" = *.xls) ]]; then type=" Excel document" elif [[ "$type" = *Hierarchical\ Data\ Format* && ("$name" = *.nc4) ]]; then type=" NetCDF Data Format data" elif [[ "$type" = *roff\ *,* && ("$name" = */[Mm]akefile || "$name" = */[Mm]akefile.* || "$name" = */BSDmakefile || "$name" = *.mk) ]]; then # Sometimes a BSD makefile is identified as "troff or # preprocessor input text" probably due to its ".if" style # directives. type=" BSD makefile script,${type#*,}}" fi echo "$type" } show () { file1="${1%%$sep*}" rest1="${1#$file1}" while [[ "$rest1" = ::* ]]; do if [[ "$rest1" = "::" ]]; then break else rest1="${rest1#$sep$sep}" file1="${rest1%%$sep*}" rest1="${rest1#$file1}" file1="${1%$rest1}" fi done if [[ ! -e $file1 && "$file1" != '-' ]]; then return fi rest11="${rest1#$sep}" file2="${rest11%%$sep*}" rest2="${rest11#$file2}" while [[ "$rest2" = ::* ]]; do if [[ "$rest2" = "::" ]]; then break else rest2="${rest2#$sep$sep}" file2="${rest2%%$sep*}" rest2="${rest2#$file2}" file2="${rest11%$rest2}" fi done if [[ "$file2" != "" ]]; then in_file="-i$file2" fi rest2="${rest11#$file2}" rest11="$rest1" if cmd_exist html2text || cmd_exist elinks || cmd_exist links || cmd_exist lynx || cmd_exist w3m; then PARSEHTML=yes else PARSEHTML=no fi if [[ "$cmd" = "" ]]; then type=$(filetype "$file1") || exit 1 if cmd_exist lsbom; then if [[ ! -f "$file1" ]]; then if [[ "$type" = *directory* ]]; then if [[ "$file1" = *.pkg ]]; then if [[ -f "$file1/Contents/Archive.bom" ]]; then type="bill of materials" file1="$file1/Contents/Archive.bom" msg "This is a Mac OS X archive directory, showing its contents (bom file)" fi fi fi fi fi get_cmd "$type" "$file1" "$rest1" if [[ "$cmd" != "" ]]; then show "-$rest1" else isfinal "$type" "$file1" "$rest11" fi elif [[ "$c1" = "" ]]; then c1=("${cmd[@]}") type=$("${c1[@]}" | filetype -) || exit 1 get_cmd "$type" "$file1" "$rest1" if [[ "$cmd" != "" ]]; then show "-$rest1" else "${c1[@]}" | isfinal "$type" - "$rest11" fi elif [[ "$c2" = "" ]]; then c2=("${cmd[@]}") type=$("${c1[@]}" | "${c2[@]}" | filetype -) || exit 1 get_cmd "$type" "$file1" "$rest1" if [[ "$cmd" != "" ]]; then show "-$rest1" else "${c1[@]}" | "${c2[@]}" | isfinal "$type" - "$rest11" fi elif [[ "$c3" = "" ]]; then c3=("${cmd[@]}") type=$("${c1[@]}" | "${c2[@]}" | "${c3[@]}" | filetype -) || exit 1 get_cmd "$type" "$file1" "$rest1" if [[ "$cmd" != "" ]]; then show "-$rest1" else "${c1[@]}" | "${c2[@]}" | "${c3[@]}" | isfinal "$type" - "$rest11" fi elif [[ "$c4" = "" ]]; then c4=("${cmd[@]}") type=$("${c1[@]}" | "${c2[@]}" | "${c3[@]}" | "${c4[@]}" | filetype -) || exit 1 get_cmd "$type" "$file1" "$rest1" if [[ "$cmd" != "" ]]; then show "-$rest1" else "${c1[@]}" | "${c2[@]}" | "${c3[@]}" | "${c4[@]}" | isfinal "$type" - "$rest11" fi elif [[ "$c5" = "" ]]; then c5=("${cmd[@]}") type=$("${c1[@]}" | "${c2[@]}" | "${c3[@]}" | "${c4[@]}" | "${c5[@]}" | filetype -) || exit 1 get_cmd "$type" "$file1" "$rest1" if [[ "$cmd" != "" ]]; then echo "$0: Too many levels of encapsulation" else "${c1[@]}" | "${c2[@]}" | "${c3[@]}" | "${c4[@]}" | "${c5[@]}" | isfinal "$type" - "$rest11" fi fi } get_cmd () { cmd= typeset t if [[ "$1" = *[bg]zip*compress* || "$1" = *compress\'d\ * || "$1" = *packed\ data* || "$1" = *LZMA\ compressed* || "$1" = *lzip\ compressed* || "$1" = *[Xx][Zz]\ compressed* || "$1" = *Zstandard\ compressed* || "$1" = *[Bb]rotli\ compressed* || "$1" = *LZ4\ compressed* ]]; then ## added '#..then' to fix vim's syntax parsing if [[ "$3" = $sep$sep ]]; then return elif [[ "$1" = *bzip*compress* ]] && cmd_exist bzip2; then cmd=(bzip2 -cd "$2") if [[ "$2" != - ]]; then filen="$2"; fi case "$filen" in *.bz2) filen="${filen%.bz2}";; *.tbz) filen="${filen%.tbz}.tar";; esac return elif [[ "$1" = *lzip\ compressed* ]] && cmd_exist lzip; then cmd=(lzip -cd "$2") if [[ "$2" != - ]]; then filen="$2"; fi case "$filen" in *.lz) filen="${filen%.lz}";; *.tlz) filen="${filen%.tlz}.tar";; esac elif [[ "$1" = *LZMA\ compressed* ]] && cmd_exist lzma; then cmd=(lzma -cd "$2") if [[ "$2" != - ]]; then filen="$2"; fi case "$filen" in *.lzma) filen="${filen%.lzma}";; *.tlz) filen="${filen%.tlz}.tar";; esac elif [[ "$1" = *gzip\ compress* || "$1" = *compress\'d\ * || "$1" = *packed\ data* ]]; then ## added '#..then' to fix vim's syntax parsing cmd=(gzip -cd "$2") if [[ "$2" != - ]]; then filen="$2"; fi case "$filen" in *.gz) filen="${filen%.gz}";; *.tgz) filen="${filen%.tgz}.tar";; esac elif [[ "$1" = *[Xx][Zz]\ compressed* ]] && cmd_exist xz; then cmd=(xz -cd "$2") if [[ "$2" != - ]]; then filen="$2"; fi case "$filen" in *.xz) filen="${filen%.xz}";; *.txz) filen="${filen%.txz}.tar";; esac elif [[ "$1" = *Zstandard\ compressed* ]] && cmd_exist zstd; then cmd=(zstd -cdq "$2") if [[ "$2" != - ]]; then filen="$2"; fi case "$filen" in *.zst) filen="${filen%.zst}";; *.tzst) filen="${filen%.tzst}.tar";; esac elif [[ "$1" = *[Bb]rotli\ compressed* ]] && cmd_exist brotli; then cmd=(brotli -cd -- "$2") if [[ "$2" != - ]]; then filen="$2"; fi case "$filen" in *.br|*.bro) filen="${filen%.*}";; *.tbr) filen="${filen%.*}.tar";; esac elif [[ "$1" = *LZ4\ compressed* ]] && cmd_exist lz4; then cmd=(lz4 -cdq "$2") if [[ "$2" != - ]]; then filen="$2"; fi case "$filen" in *.lz4) filen="${filen%.*}";; *.tl4|*.tz4|*.tlz4) filen="${filen%.*}.tar";; esac fi return fi rsave="$rest1" rest1="$rest2" if [[ "$file2" != "" ]]; then if [[ "$1" = *\ tar* || "$1" = *\ tar* ]]; then cmd=(istar "$2" "$file2") elif [[ "$1" = *Debian* ]]; then data=`ar t "$2"|grep data.tar` cmd2=("unpack_cmd" "$data") t=$(nexttmp) if [[ "$file2" = control/* ]]; then istemp "ar p" "$2" control.tar.gz | gzip -dc - > "$t" file2=".${file2:7}" else istemp "ar p" "$2" $data | $("${cmd2[@]}") > "$t" fi cmd=(istar "$t" "$file2") elif [[ "$1" = *RPM* ]] && cmd_exist cpio && ( cmd_exist rpm2cpio || cmd_exist rpmunpack ); then cmd=(isrpm "$2" "$file2") elif [[ "$1" = *Jar\ archive* ]] && cmd_exist fastjar; then cmd=(isjar "$2" "$file2") elif [[ "$1" = *Zip* || "$1" = *ZIP* ]] && cmd_exist unzip; then cmd=(istemp "unzip -avp" "$2" "$file2") elif [[ "$1" = *RAR\ archive* ]]; then if cmd_exist unrar; then cmd=(istemp "unrar p -inul" "$2" "$file2") elif cmd_exist rar; then cmd=(istemp "rar p -inul" "$2" "$file2") elif cmd_exist bsdtar; then cmd=(istemp "bsdtar Oxf" "$2" "$file2") fi elif [[ "$1" = *7-zip\ archive* || "$1" = *7z\ archive* ]] && cmd_exist 7za; then cmd=(istemp "7za e -so" "$2" "$file2") elif [[ "$1" = *7-zip\ archive* || "$1" = *7z\ archive* ]] && cmd_exist 7zr; then cmd=(istemp "7zr e -so" "$2" "$file2") elif [[ "$1" = *[Cc]abinet* ]] && cmd_exist cabextract; then cmd=(iscab "$2" "$file2") elif [[ "$1" = *\ ar\ archive* ]]; then cmd=(istemp "ar p" "$2" "$file2") elif [[ "$1" = *ISO\ 9660* ]] && cmd_exist isoinfo; then cmd=(isoinfo "-i$2" "-x$file2") fi if [[ "$cmd" != "" ]]; then filen="$file2" fi fi } iscab () { typeset t if [[ "$1" = - ]]; then t=$(nexttmp) cat > "$t" set "$t" "$2" fi cabextract -pF "$2" "$1" } istar () { $tarcmd Oxf "$1" "$2" 2>/dev/null } isdvi () { typeset t if [[ "$1" != *.dvi ]]; then t="$tmpdir/tmp.dvi" cat "$1" > "$t" set "$t" fi dvi2tty -q "$1" } istemp () { typeset prog typeset t prog="$1" t="$2" shift shift if [[ "$t" = - ]]; then t=$(nexttmp) cat > "$t" fi if [[ $# -gt 0 ]]; then $prog "$t" "$@" 2>/dev/null else $prog "$t" 2>/dev/null fi } nodash () { typeset prog prog="$1" shift if [[ "$1" = - ]]; then shift if [[ $# -gt 0 ]]; then $prog "$@" 2>/dev/null else $prog 2>/dev/null fi else $prog "$@" 2>/dev/null fi } isrpm () { if cmd_exist rpm2cpio && cmd_exist cpio; then typeset t if [[ "$1" = - ]]; then t=$(nexttmp) cat > "$t" set "$t" "$2" fi # setup $b as a batch file containing "$b.out" typeset b b=$(nexttmp) echo "$b.out" > "$b" # to support older versions of cpio the --to-stdout option is not used here rpm2cpio "$1" 2>/dev/null|cpio -i --quiet --rename-batch-file "$b" "$2" cat "$b.out" elif cmd_exist rpmunpack && cmd_exist cpio; then # rpmunpack will write to stdout if it gets file from stdin # extract file $2 from archive $1, assume that cpio is sufficiently new # (option --to-stdout existing) if rpmunpack is installed cat "$1" | rpmunpack | gzip -cd | cpio -i --quiet --to-stdout "$2" fi } isjar () { case "$2" in /*) echo "lesspipe can't unjar files with absolute paths" >&2 exit 1 ;; ../*) echo "lesspipe can't unjar files with ../ paths" >&2 exit 1 ;; esac typeset d d=$(nexttmp -d) [[ -d "$d" ]] || exit 1 cat "$1" | ( cd "$d" fastjar -x "$2" if [[ -f "$2" ]]; then cat "$2" fi ) } #parsexml () { nodash "elinks -dump -default-mime-type text/xml" "$1"; } parsehtml () { if [[ "$PARSEHTML" = no ]]; then msg "No suitable tool for HTML parsing found, install one of html2text, elinks, links, lynx or w3m" return elif cmd_exist html2text; then if [[ "$1" = - ]]; then html2text; else html2text "$1"; fi elif cmd_exist lynx; then if [[ "$1" = - ]]; then set - -stdin; fi lynx -dump -force_html "$1" && return elif cmd_exist w3m; then nodash "w3m -dump -T text/html" "$1" elif cmd_exist elinks; then nodash "elinks -dump -force-html" "$1" elif cmd_exist links; then if [[ "$1" = - ]]; then set - -stdin; fi links -dump -force_html "$1" fi } unpack_cmd() { cmd_string="cat" if [[ "$1" == *xz ]]; then cmd_string="xz -dc -" elif [[ "$1" == *gz ]]; then cmd_string="gzip -dc -" elif [[ "$1" == *bz2 ]]; then cmd_string="bzip2 -dc -" elif [[ "$1" == *lzma ]]; then cmd_string="lzma -dc -" elif [[ "$1" == *zst ]]; then cmd_string="zstd -dcq -" elif [[ ("$1" == *br || "$1" == *bro) ]]; then cmd_string="brotli -dc -" elif [[ "$1" == *lz4 ]]; then cmd_string="lz4 -dcq -" fi echo "$cmd_string" } isfinal() { typeset t if [[ "$3" = $sep$sep ]]; then cat "$2" return elif [[ "$3" = $sep* ]]; then if [[ "$3" = $sep ]]; then msg "append :. or : to activate syntax highlighting" else lang=${3#$sep} lang="-l ${lang#.}" lang=${lang%%-l } if cmd_exist code2color; then code2color $PPID ${in_file:+"$in_file"} $lang "$2" if [[ $? = 0 ]]; then return fi fi fi cat "$2" return fi # color requires -r or -R when calling less typeset COLOR if [[ $(tput colors) -ge 8 && ("$LESS" = *-*r* || "$LESS" = *-*R*) ]]; then COLOR="--color=always" fi if [[ "$1" = *No\ such* ]]; then exit 1 elif [[ "$1" = *directory* ]]; then cmd=(ls -lA $COLOR "$2") if ! ls $COLOR > /dev/null 2>&1; then cmd=(ls -lA -G "$2") if ! ls -lA -G > /dev/null 2>&1; then cmd=(ls -lA "$2") fi fi msg "This is a directory, showing the output of ${cmd[@]}" if [[ ${cmd[2]} = '-G' ]]; then CLICOLOR_FORCE=1 "${cmd[@]}" else "${cmd[@]}" fi elif [[ "$1" = *\ tar* || "$1" = *\ tar* ]]; then msg "use tar_file${sep}contained_file to view a file in the archive" if [[ -n $COLOR ]] && cmd_exist tarcolor; then $tarcmd tvf "$2" | tarcolor else $tarcmd tvf "$2" fi elif [[ "$1" = *RPM* ]]; then header="use RPM_file${sep}contained_file to view a file in the RPM" if cmd_exist rpm; then echo $header istemp "rpm -qivp" "$2" header=""; fi if cmd_exist cpio && cmd_exist rpm2cpio; then echo $header echo "================================= Content ======================================" istemp rpm2cpio "$2" 2>/dev/null|cpio -i -tv 2>/dev/null elif cmd_exist cpio && cmd_exist rpmunpack; then echo $header echo "================================= Content ======================================" cat "$2" | rpmunpack | gzip -cd | cpio -i -tv 2>/dev/null else msg "please install rpm2cpio or rpmunpack to see the contents of RPM files" fi elif [[ "$1" = *roff* ]] && cmd_exist groff; then DEV=utf8 if [[ $LANG != *UTF*8* && $LANG != *utf*8* ]]; then if [[ "$LANG" = ja* ]]; then DEV=nippon else DEV=latin1 fi fi MACRO=andoc if [[ "$2" = *.me ]]; then MACRO=e elif [[ "$2" = *.ms ]]; then MACRO=s fi msg "append $sep to filename to view the nroff source" groff -s -p -t -e -T$DEV -m$MACRO "$2" elif [[ "$1" = *Debian* ]]; then msg "use Deb_file${sep}contained_file to view a file in the Deb" if cmd_exist dpkg; then nodash "dpkg -I" "$2" else echo istemp "ar p" "$2" control.tar.gz | gzip -dc - | $tarcmd tvf - | sed -r 's/(.{48})\./\1control/' fi data=`ar t "$2"|grep data.tar` cmd2=("unpack_cmd" "$data") echo istemp "ar p" "$2" $data | $("${cmd2[@]}") | $tarcmd tvf - # do not display all perl text containing pod using perldoc #elif [[ "$1" = *Perl\ POD\ document\ text* || "$1" = *Perl5\ module\ source\ text* ]]; then elif [[ "$1" = *Perl\ POD\ document\ text* ]] && cmd_exist perldoc; then msg "append $sep to filename to view the perl source" istemp perldoc "$2" elif [[ "$1" = *\ script* ]]; then set "plain text" "$2" elif [[ "$1" = *text\ executable* ]]; then set "plain text" "$2" elif [[ "$1" = *PostScript* ]]; then if cmd_exist pstotext; then msg "append $sep to filename to view the postscript file" nodash pstotext "$2" elif cmd_exist ps2ascii; then msg "append $sep to filename to view the postscript file" istemp ps2ascii "$2" else msg "install pstotext or ps2ascii to view a textual representation of the file contents" fi elif [[ "$1" = *executable* ]]; then msg "append $sep to filename to view the raw file" nodash strings "$2" elif [[ "$1" = *\ ar\ archive* ]]; then msg "use library${sep}contained_file to view a file in the archive" istemp "ar vt" "$2" elif [[ "$1" = *shared* ]] && cmd_exist nm; then msg "This is a dynamic library, showing the output of nm" istemp nm "$2" elif [[ "$1" = *Jar\ archive* ]] && cmd_exist fastjar; then msg "use jar_file${sep}contained_file to view a file in the archive" nodash "fastjar -tf" "$2" elif [[ "$1" = *Zip* || "$1" = *ZIP* ]] && cmd_exist unzip; then msg "use zip_file${sep}contained_file to view a file in the archive" istemp "unzip -lv" "$2" elif [[ "$1" = *RAR\ archive* ]]; then if cmd_exist unrar; then msg "use rar_file${sep}contained_file to view a file in the archive" istemp "unrar v" "$2" elif cmd_exist rar; then msg "use rar_file${sep}contained_file to view a file in the archive" istemp "rar v" "$2" elif cmd_exist bsdtar; then msg "use rar_file${sep}contained_file to view a file in the archive" istemp "bsdtar tvf" "$2" fi elif [[ "$1" = *7-zip\ archive* || "$1" = *7z\ archive* ]] && cmd_exist 7za; then typeset res res=$(istemp "7za l" "$2") if [[ "$res" = *\ 1\ file* ]]; then msg "a 7za archive containing one file was silently unpacked" if [[ "$2" != - ]]; then 7za e -so "$2" 2>/dev/null else # extract name of temporary file containing the 7za archive t=${res#*Listing\ archive:\ } t2=" " t=${t%%$t2*} 7za e -so $t 2>/dev/null fi else msg "use 7za_file${sep}contained_file to view a file in the archive" echo "$res" fi elif [[ "$1" = *7-zip\ archive* || "$1" = *7z\ archive* ]] && cmd_exist 7zr; then typeset res res=$(istemp "7zr l" "$2") if [[ "$res" = *\ 1\ file* ]]; then msg "a 7za archive containing one file was silently unpacked" if [[ "$2" != - ]]; then 7zr e -so "$2" 2>/dev/null else # extract name of temporary file containing the 7za archive t=${res#*Listing\ archive:\ } t2=" " t=${t%%$t2*} 7zr e -so $t 2>/dev/null fi else msg "use 7za_file${sep}contained_file to view a file in the archive" echo "$res" fi elif [[ "$1" = *[Cc]abinet* ]] && cmd_exist cabextract; then msg "use cab_file${sep}contained_file to view a file in the cabinet" istemp "cabextract -l" "$2" elif [[ "$1" = *\ DVI* ]] && cmd_exist dvi2tty; then msg "append $sep to filename to view the raw DVI file" isdvi "$2" elif [[ "$PARSEHTML" = yes && "$1" = *HTML* ]]; then msg "append $sep to filename to view the HTML source" parsehtml "$2" elif [[ "$1" = *PDF* ]] && cmd_exist pdftotext; then msg "append $sep to filename to view the PDF source" istemp pdftotext "$2" - elif [[ "$PARSEHTML" = yes && "$1" = *PDF* ]] && cmd_exist pdftohtml; then msg "append $sep to filename to view the PDF source" t=$(nexttmp) cat "$2" > "$t"; pdftohtml -stdout "$t" | parsehtml - elif [[ "$1" = *Hierarchical\ Data\ Format* ]] && cmd_exist h5dump; then istemp h5dump "$2" elif [[ "$1" = *NetCDF* || "$1" = *Hierarchical\ Data\ Format* ]] && cmd_exist ncdump; then istemp ncdump "$2" elif [[ "$1" = *Matlab\ v[0-9.]*\ mat-file* ]] && cmd_exist matdump; then msg "append $sep to filename to view the raw data" matdump -d "$2" elif [[ "$1" = *DjVu* ]] && cmd_exist djvutxt; then msg "append $sep to filename to view the DjVu source" djvutxt "$2" elif [[ "$1" = *Microsoft\ Word* || "$1" = *Microsoft\ Office* ]]; then if cmd_exist antiword; then msg "append $sep to filename to view the raw word document" antiword "$2" elif cmd_exist catdoc; then msg "append $sep to filename to view the raw word document" catdoc "$2" else msg "install antiword or catdoc to view human readable text" cat "$2" fi elif [[ "$1" = *Rich\ Text\ Format* ]] && cmd_exist unrtf; then if [[ "$PARSEHTML" = yes ]]; then msg "append $sep to filename to view the RTF source" istemp "unrtf --html" "$2" | parsehtml - else msg "append $sep to filename to view the RTF source" istemp "unrtf --text" "$2" | sed -e "s/^### .*//" | fmt -s fi elif [[ "$PARSEHTML" = yes && "$1" = *Excel\ document* ]] && cmd_exist xlhtml; then msg "append $sep to filename to view the spreadsheet source" xlhtml -te "$2" | parsehtml - elif [[ "$PARSEHTML" = yes && "$1" = *PowerPoint\ document* ]] && cmd_exist ppthtml; then msg "append $sep to filename to view the PowerPoint source" ppthtml "$2" | parsehtml - elif [[ "$PARSEHTML" = yes && ("$1" = *OpenDocument\ [CHMPST]* || "$1" = *OpenOffice\.org\ 1\.x\ [CIWdgpst]*) ]] && cmd_exist unzip; then if cmd_exist o3tohtml; then msg "append $sep to filename to view the OpenOffice or OpenDocument source" istemp "unzip -avp" "$2" content.xml | o3tohtml | parsehtml - elif cmd_exist sxw2txt; then msg "append $sep to filename to view the OpenOffice or OpenDocument source" istemp sxw2txt "$2" else msg "install at least sxw2txt from the lesspipe package to see plain text in openoffice documents" fi elif [[ "$1" = *ISO\ 9660* ]] && cmd_exist isoinfo; then if [[ "$2" != - ]]; then msg "append $sep to filename to view the raw data" isoinfo -d -i "$2" joliet=`isoinfo -d -i "$2" | egrep '^Joliet'|cut -c1` echo "================================= Content ======================================" isoinfo -lR$joliet -i "$2" fi elif [[ "$1" = *image\ data* || "$1" = *JPEG\ file* || "$1" = *JPG\ file* ]] && cmd_exist identify; then msg "append $sep to filename to view the raw data" identify -verbose "$2" elif [[ "$1" = *MPEG\ *layer\ 3\ audio* || "$1" = *MPEG\ *layer\ III* || "$1" = *mp3\ file* || "$1" = *MP3* ]]; then if cmd_exist id3v2; then msg "append $sep to filename to view the raw data" istemp "id3v2 -l" "$2" elif cmd_exist mp3info2; then msg "append $sep to filename to view the raw data" mp3info2 "$2" elif cmd_exist mp3info; then msg "append $sep to filename to view the raw data" mp3info "$2" fi elif [[ "$1" = *bill\ of\ materials* ]] && cmd_exist lsbom; then msg "append $sep to filename to view the raw data" lsbom -p MUGsf "$2" elif [[ "$1" = *perl\ Storable* ]]; then msg "append $sep to filename to view the raw data" perl -MStorable=retrieve -MData::Dumper -e '$Data::Dumper::Indent=1;print Dumper retrieve shift' "$2" elif [[ "$1" = *UTF-8* && $LANG != *UTF-8 ]] && cmd_exist iconv -c; then iconv -c -f UTF-8 "$2" elif [[ "$1" = *ISO-8859* && $LANG != *ISO-8859-1 ]] && cmd_exist iconv -c; then iconv -c -f ISO-8859-1 "$2" elif [[ "$1" = *UTF-16* && $LANG != *UTF-16 ]] && cmd_exist iconv -c; then iconv -c -f UTF-16 "$2" elif [[ "$1" = *GPG\ encrypted\ data* || "$1" = *PGP\ *ncrypted* ]] && cmd_exist gpg; then msg "append $sep to filename to view the encrypted file" gpg -d "$2" elif [[ "$1" = *Apple\ binary\ property\ list* ]] && cmd_exist plutil; then msg "append $sep to filename to view the raw data" plutil -convert xml1 -o - "$2" elif [[ "$1" = *data* ]]; then msg "append $sep to filename to view the raw data" nodash strings "$2" elif [[ "$2" = *.crt || "$2" = *.pem ]] && cmd_exist openssl; then msg "append $sep to filename to view the raw data" openssl x509 -hash -text -noout -in "$2" elif [[ "$2" = *.csr ]] && cmd_exist openssl; then msg "append $sep to filename to view the raw data" openssl req -text -noout -in "$2" elif [[ "$2" = *.crl ]] && cmd_exist openssl; then msg "append $sep to filename to view the raw data" openssl crl -hash -text -noout -in "$2" else set "plain text" "$2" fi if [[ "$1" = *plain\ text* ]]; then if cmd_exist code2color; then code2color $PPID ${in_file:+"$in_file"} "$2" if [[ $? = 0 ]]; then return fi fi fi if [[ "$2" = - ]]; then cat fi } IFS=$sep a="$@" IFS=' ' if [[ "$a" = "" ]]; then if [[ "$0" != /* ]]; then pat=`pwd`/ fi if [[ "$SHELL" = *csh ]]; then echo "setenv LESSOPEN \"|$pat$0 %s\"" else echo "LESSOPEN=\"|$pat$0 %s\"" echo "export LESSOPEN" fi else # check for pipes so that "less -f ... <(cmd) ..." works properly [[ -p "$1" ]] && exit 1 show "$a" fi