#!/bin/bash set -C -f -u IFS="$(printf '%b_' '\n')" IFS="${IFS%_}" # ANSI color codes are supported. # STDIN is disabled, so interactive scripts won't work properly # This script is considered a configuration file and must be updated manually. # Meanings of exit codes: # code | meaning | action of ranger # -----+------------+------------------------------------------- # 0 | success | Display stdout as preview # 1 | no preview | Display no preview at all # 2 | plain text | Display the plain content of the file # Script arguments FILE_PATH="${1}" # Full path of the highlighted file FILE_EXTENSION="${FILE_PATH##*.}" FILE_EXTENSION_LOWER=$(echo "${FILE_EXTENSION}" | tr '[:upper:]' '[:lower:]') handle_extension() { case "${FILE_EXTENSION_LOWER}" in # Archive a | ace | alz | arc | arj | bz | bz2 | cab | cpio | deb | gz | jar | lha | lz | lzh | lzma | lzo | \ rpm | rz | t7z | tar | tbz | tbz2 | tgz | tlz | txz | tZ | tzo | war | xpi | xz | Z | zip) unzip -l -- "${FILE_PATH}" tar --list --file "${FILE_PATH}" exit 1 ;; rar) # Avoid password prompt by providing empty password unrar lt -p- -- "${FILE_PATH}" exit 1 ;; 7z) # Avoid password prompt by providing empty password 7z l -p -- "${FILE_PATH}" exit 1 ;; # PDF pdf) # Preview as text conversion pdftotext -l 10 -nopgbrk -q -- "${FILE_PATH}" - exiftool "${FILE_PATH}" exit 1 ;; # BitTorrent torrent) transmission-show -- "${FILE_PATH}" exit 1 ;; # HTML htm | html | xhtml) # Preview as text conversion lynx -dump -nonumbers -nolist -- "${FILE_PATH}" elinks -dump 1 -no-references -no-numbering <"${FILE_PATH}" ;; # Continue with next handler on failure # JSON json) jq --color-output . "${FILE_PATH}" && exit 5 python -m json.tool -- "${FILE_PATH}" && exit 5 ;; esac } handle_mime() { local mimetype="${1}" case "${mimetype}" in text/html) lynx -dump "${FILE_PATH}" ;; text/troff) man ./ "${FILE_PATH}" | col -b ;; text/* | */xml) bat --color always --style plain --paging never -- "${FILE_PATH}" exit 2 ;; application/zip) unzip -l -- "${FILE_PATH}" ;; image/*) exiftool "${FILE_PATH}" || exit 1 ;; video/* | audio/* | application/octet-stream) mediainfo "${FILE_PATH}" || exit 1 ;; */pdf) pdftotext -l 10 -nopgbrk -q -- "${FILE_PATH}" - ;; esac } handle_fallback() { echo '----- File Type Classification -----' && file --dereference --brief -- "${FILE_PATH}" exit 1 } MIMETYPE="$(file --dereference --brief --mime-type -- "${FILE_PATH}")" handle_extension handle_mime "${MIMETYPE}" handle_fallback exit 1