summaryrefslogtreecommitdiff
path: root/home/config/ranger/scope.sh
diff options
context:
space:
mode:
Diffstat (limited to 'home/config/ranger/scope.sh')
-rwxr-xr-xhome/config/ranger/scope.sh154
1 files changed, 154 insertions, 0 deletions
diff --git a/home/config/ranger/scope.sh b/home/config/ranger/scope.sh
new file mode 100755
index 0000000..8843578
--- /dev/null
+++ b/home/config/ranger/scope.sh
@@ -0,0 +1,154 @@
+#!/usr/bin/env bash
+
+set -o noclobber -o noglob -o nounset -o pipefail
+IFS=$'\n'
+
+## If the option `use_preview_script` is set to `true`,
+## then this script will be called and its output will be displayed in ranger.
+## 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.
+## It will be left untouched if you upgrade ranger.
+
+## Because of some automated testing we do on the script #'s for comments need
+## to be doubled up. Code that is commented out, because it's an alternative for
+## example, gets only one #.
+
+## 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
+## 3 | fix width | Don't reload when width changes
+## 4 | fix height | Don't reload when height changes
+## 5 | fix both | Don't ever reload
+## 6 | image | Display the image `$IMAGE_CACHE_PATH` points to as an image preview
+## 7 | image | Display the file directly as an image
+
+## Script arguments
+FILE_PATH="${1}" # Full path of the highlighted file
+PV_WIDTH="${2}" # Width of the preview pane (number of fitting characters)
+## shellcheck disable=SC2034 # PV_HEIGHT is provided for convenience and unused
+PV_HEIGHT="${3}" # Height of the preview pane (number of fitting characters)
+IMAGE_CACHE_PATH="${4}" # Full path that should be used to cache image preview
+PV_IMAGE_ENABLED="${5}" # 'True' if image previews are enabled, 'False' otherwise.
+
+FILE_EXTENSION="${FILE_PATH##*.}"
+FILE_EXTENSION_LOWER="$(printf "%s" "${FILE_EXTENSION}" | tr '[:upper:]' '[:lower:]')"
+
+## Settings
+HIGHLIGHT_SIZE_MAX=262143 # 256KiB
+HIGHLIGHT_TABWIDTH=${HIGHLIGHT_TABWIDTH:-8}
+HIGHLIGHT_STYLE=${HIGHLIGHT_STYLE:-pablo}
+HIGHLIGHT_OPTIONS="--replace-tabs=${HIGHLIGHT_TABWIDTH} --style=${HIGHLIGHT_STYLE} ${HIGHLIGHT_OPTIONS:-}"
+PYGMENTIZE_STYLE=${PYGMENTIZE_STYLE:-autumn}
+OPENSCAD_IMGSIZE=${RNGR_OPENSCAD_IMGSIZE:-1000,1000}
+OPENSCAD_COLORSCHEME=${RNGR_OPENSCAD_COLORSCHEME:-Tomorrow Night}
+
+handle_extension() {
+ case "${FILE_EXTENSION_LOWER}" in
+
+ ## OpenDocument
+ odt|ods|odp|sxw)
+ ## Preview as markdown conversion
+ pandoc -s -t markdown -- "${FILE_PATH}" && exit 5
+ exit 1;;
+
+ ## HTML
+ htm|html|xhtml)
+ ## Preview as text conversion
+ lynx -dump -- "${FILE_PATH}" && exit 5
+ exit 1;;
+
+ ## JSON
+ json)
+ jq --color-output . "${FILE_PATH}" && exit 5
+ exit 1;;
+
+ esac
+}
+
+handle_image() {
+ local DEFAULT_SIZE="1920x1080"
+
+ local mimetype="${1}"
+ case "${mimetype}" in
+
+ ## Image
+ image/*)
+ local orientation
+ orientation="$( identify -format '%[EXIF:Orientation]\n' -- "${FILE_PATH}" )"
+ if [[ -n "$orientation" && "$orientation" != 1 ]]; then
+ convert -- "${FILE_PATH}" -auto-orient "${IMAGE_CACHE_PATH}" && exit 6
+ fi
+ exit 7;;
+
+ ## Video
+ video/*)
+ # Thumbnail
+ ffmpegthumbnailer -i "${FILE_PATH}" -o "${IMAGE_CACHE_PATH}" -s 0 && exit 6
+ exit 1;;
+
+ ## PDF
+ application/pdf)
+ pdftoppm -f 1 -l 1 \
+ -scale-to-x "${DEFAULT_SIZE%x*}" \
+ -scale-to-y -1 \
+ -singlefile \
+ -jpeg -tiffcompression jpeg \
+ -- "${FILE_PATH}" "${IMAGE_CACHE_PATH%.*}" \
+ && exit 6 || exit 1;;
+
+ esac
+}
+
+handle_mime() {
+ local mimetype="${1}"
+ case "${mimetype}" in
+
+ ## Text
+ text/* | */xml)
+ ## Syntax highlight
+ if [[ "$( stat --printf='%s' -- "${FILE_PATH}" )" -gt "${HIGHLIGHT_SIZE_MAX}" ]]; then
+ exit 2
+ fi
+ if [[ "$( tput colors )" -ge 256 ]]; then
+ local pygmentize_format='terminal256'
+ local highlight_format='xterm256'
+ else
+ local pygmentize_format='terminal'
+ local highlight_format='ansi'
+ fi
+ env HIGHLIGHT_OPTIONS="${HIGHLIGHT_OPTIONS}" highlight \
+ --out-format="${highlight_format}" \
+ --force -- "${FILE_PATH}" && exit 5
+ env COLORTERM=8bit bat --color=always --style="plain" \
+ -- "${FILE_PATH}" && exit 5
+ pygmentize -f "${pygmentize_format}" -O "style=${PYGMENTIZE_STYLE}"\
+ -- "${FILE_PATH}" && exit 5
+ exit 2;;
+
+ ## Media
+ image/* | video/* | audio/*)
+ exiftool "${FILE_PATH}" && exit 5
+ exit 1;;
+
+ esac
+}
+
+handle_fallback() {
+ echo '----- File Type Classification -----' && file --dereference --brief -- "${FILE_PATH}" && exit 5
+ exit 1
+}
+
+MIMETYPE="$( file --dereference --brief --mime-type -- "${FILE_PATH}" )"
+if [[ "${PV_IMAGE_ENABLED}" == 'True' ]]; then
+ handle_image "${MIMETYPE}"
+fi
+handle_extension
+handle_mime "${MIMETYPE}"
+handle_fallback
+
+exit 1