diff --git a/config/preview_file.sh b/config/preview_file.sh index d0d92d82..368ea3b5 100755 --- a/config/preview_file.sh +++ b/config/preview_file.sh @@ -1,40 +1,45 @@ #!/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 a template script for creating textual file previews in Joshuto. +## +## Copy this script to your Joshuto configuration directory and refer to this +## script in `joshuto.toml` in the `[preview]` section like +## ``` +## preview_script = "~/.config/joshuto/preview_file.sh" +## ``` +## Joshuto will call this script for each file when first hovered by the cursor. +## If this script returns with an exit code 0, the stdout of this script will be +## the file's preview text in Joshuto's right panel. +## The preview text will be cached by Joshuto and only renewed on reload. +## ANSI color codes are supported if Joshuto is build with the `syntax_highlight` +## feature. +## ## 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 #. - +## It will be left untouched if you upgrade Joshuto. +## ## 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 +## +## This script is used only as a provider for textual previews. +## Image previews are independent from this script. +## + +IFS=$'\n' + +# Security measures: +# * noclobber prevents you from overwriting a file with `>` +# * noglob prevents expansion of wild cards +# * nounset causes bash to fail if an undeclared variable is used (e.g. typos) +# * pipefail causes a pipeline to fail also if a command other than the last one fails +set -o noclobber -o noglob -o nounset -o pipefail FILE_PATH="" PREVIEW_WIDTH=10 PREVIEW_HEIGHT=10 -PREVIEW_X_COORD=0 -PREVIEW_Y_COORD=0 -IMAGE_CACHE_PATH="" - -# echo "$@" while [ "$#" -gt 0 ]; do case "$1" in @@ -50,128 +55,81 @@ while [ "$#" -gt 0 ]; do shift PREVIEW_HEIGHT="$1" ;; - "--x-coord") - shift - PREVIEW_X_COORD="$1" - ;; - "--y-coord") - shift - PREVIEW_Y_COORD="$1" - ;; - "--image-cache") - shift - IMAGE_CACHE_PATH="$1" - ;; esac shift done -FILE_EXTENSION="${FILE_PATH##*.}" -FILE_EXTENSION_LOWER="$(printf "%s" "${FILE_EXTENSION}" | tr '[:upper:]' '[:lower:]')" - -MIMETYPE=$(file --mime-type -Lb "${FILE_PATH}") - -## 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 ## 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) - atool --list -- "${FILE_PATH}" && exit 5 - bsdtar --list --file "${FILE_PATH}" && exit 5 + atool --list -- "${FILE_PATH}" && exit 0 + bsdtar --list --file "${FILE_PATH}" && exit 0 exit 1;; rar) ## Avoid password prompt by providing empty password - unrar lt -p- -- "${FILE_PATH}" && exit 5 + unrar lt -p- -- "${FILE_PATH}" && exit 0 exit 1;; 7z) ## Avoid password prompt by providing empty password - 7z l -p -- "${FILE_PATH}" && exit 5 + 7z l -p -- "${FILE_PATH}" && exit 0 exit 1;; ## PDF - ## pdf) + pdf) ## Preview as text conversion - ## pdftotext -l 10 -nopgbrk -q -- "${FILE_PATH}" - | \ - ## fmt -w "${PREVIEW_WIDTH}" && exit 5 - ## mutool draw -F txt -i -- "${FILE_PATH}" 1-10 | \ - ## fmt -w "${PREVIEW_WIDTH}" && exit 5 - ## exiftool "${FILE_PATH}" && exit 5 - ## exit 1;; + pdftotext -l 10 -nopgbrk -q -- "${FILE_PATH}" - | \ + fmt -w "${PREVIEW_WIDTH}" && exit 0 + mutool draw -F txt -i -- "${FILE_PATH}" 1-10 | \ + fmt -w "${PREVIEW_WIDTH}" && exit 0 + exiftool "${FILE_PATH}" && exit 0 + exit 1;; ## BitTorrent torrent) - transmission-show -- "${FILE_PATH}" && exit 5 + transmission-show -- "${FILE_PATH}" && exit 0 exit 1;; ## OpenDocument odt|ods|odp|sxw) ## Preview as text conversion - odt2txt "${FILE_PATH}" && exit 5 + odt2txt "${FILE_PATH}" && exit 0 ## Preview as markdown conversion - pandoc -s -t markdown -- "${FILE_PATH}" && exit 5 + pandoc -s -t markdown -- "${FILE_PATH}" && exit 0 exit 1;; ## XLSX xlsx) ## Preview as csv conversion ## Uses: https://github.com/dilshod/xlsx2csv - xlsx2csv -- "${FILE_PATH}" && exit 5 + xlsx2csv -- "${FILE_PATH}" && exit 0 exit 1;; ## HTML htm|html|xhtml) ## Preview as text conversion - w3m -dump "${FILE_PATH}" && exit 5 - lynx -dump -- "${FILE_PATH}" && exit 5 - elinks -dump "${FILE_PATH}" && exit 5 - pandoc -s -t markdown -- "${FILE_PATH}" && exit 5 + w3m -dump "${FILE_PATH}" && exit 0 + lynx -dump -- "${FILE_PATH}" && exit 0 + elinks -dump "${FILE_PATH}" && exit 0 + pandoc -s -t markdown -- "${FILE_PATH}" && exit 0 ;; ## JSON json|ipynb) - jq --color-output . "${FILE_PATH}" && exit 5 - python -m json.tool -- "${FILE_PATH}" && exit 5 + jq --color-output . "${FILE_PATH}" && exit 0 + python -m json.tool -- "${FILE_PATH}" && exit 0 ;; ## Direct Stream Digital/Transfer (DSDIFF) and wavpack aren't detected ## by file(1). dff|dsf|wv|wvc) - mediainfo "${FILE_PATH}" && exit 5 - exiftool "${FILE_PATH}" && exit 5 + mediainfo "${FILE_PATH}" && exit 0 + exiftool "${FILE_PATH}" && exit 0 ;; # Continue with next handler on failure esac } -handle_image() { - ## Size of the preview if there are multiple options or it has to be - ## rendered from vector graphics. If the conversion program allows - ## specifying only one dimension while keeping the aspect ratio, the width - ## will be used. - local DEFAULT_SIZE="40x30" - - local mimetype="${1}" - case "${mimetype}" in - ## Image - image/*) - # kitty +kitten icat --clear - kitty +kitten icat \ - --transfer-mode file \ - --place "${PREVIEW_WIDTH}x${PREVIEW_HEIGHT}@${PREVIEW_X_COORD}x${PREVIEW_Y_COORD}" \ - "${FILE_PATH}" - exit 7 - ;; - esac -} - handle_mime() { local mimetype="${1}" @@ -181,7 +139,7 @@ handle_mime() { ## Preview as text conversion ## note: catdoc does not always work for .doc files ## catdoc: http://www.wagner.pp.ru/~vitus/software/catdoc/ - catdoc -- "${FILE_PATH}" && exit 5 + catdoc -- "${FILE_PATH}" && exit 0 exit 1;; ## DOCX, ePub, FB2 (using markdown) @@ -189,13 +147,16 @@ handle_mime() { ## uncommented other methods to preview those formats *wordprocessingml.document|*/epub+zip|*/x-fictionbook+xml) ## Preview as markdown conversion - pandoc -s -t markdown -- "${FILE_PATH}" && exit 5 + pandoc -s -t markdown -- "${FILE_PATH}" | bat -l markdown \ + --color=always --paging=never \ + --style=plain \ + --terminal-width="${PREVIEW_WIDTH}" && exit 0 exit 1;; ## E-mails message/rfc822) ## Parsing performed by mu: https://github.com/djcb/mu - mu view -- "${FILE_PATH}" && exit 5 + mu view -- "${FILE_PATH}" && exit 0 exit 1;; ## XLS @@ -203,7 +164,7 @@ handle_mime() { ## Preview as csv conversion ## xls2csv comes with catdoc: ## http://www.wagner.pp.ru/~vitus/software/catdoc/ - xls2csv -- "${FILE_PATH}" && exit 5 + xls2csv -- "${FILE_PATH}" && exit 0 exit 1;; ## Text @@ -211,40 +172,35 @@ handle_mime() { bat --color=always --paging=never \ --style=plain \ --terminal-width="${PREVIEW_WIDTH}" \ - "${FILE_PATH}" && exit 5 - exit 2;; + "${FILE_PATH}" && exit 0 + cat "${FILE_PATH}" && exit 0 + exit 1;; ## DjVu image/vnd.djvu) ## Preview as text conversion (requires djvulibre) - djvutxt "${FILE_PATH}" | fmt -w "${PREVIEW_WIDTH}" && exit 5 - exiftool "${FILE_PATH}" && exit 5 + djvutxt "${FILE_PATH}" | fmt -w "${PREVIEW_WIDTH}" && exit 0 + exiftool "${FILE_PATH}" && exit 0 exit 1;; ## Image image/*) ## Preview as text conversion - # img2txt --gamma=0.6 --width="${PREVIEW_WIDTH}" -- "${FILE_PATH}" && exit 4 - exiftool "${FILE_PATH}" && exit 5 + exiftool "${FILE_PATH}" && exit 0 exit 1;; ## Video and audio - ## video/* | audio/*) - ## mediainfo "${FILE_PATH}" && exit 5 - ## exiftool "${FILE_PATH}" && exit 5 - ## exit 1;; + video/* | audio/*) + mediainfo "${FILE_PATH}" && exit 0 + exiftool "${FILE_PATH}" && exit 0 + 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}" )" +FILE_EXTENSION="${FILE_PATH##*.}" +FILE_EXTENSION_LOWER="$(printf "%s" "${FILE_EXTENSION}" | tr '[:upper:]' '[:lower:]')" handle_extension +MIMETYPE="$( file --dereference --brief --mime-type -- "${FILE_PATH}" )" handle_mime "${MIMETYPE}" -handle_fallback exit 1 diff --git a/src/preview/preview_file.rs b/src/preview/preview_file.rs index 05f389e9..d1154800 100644 --- a/src/preview/preview_file.rs +++ b/src/preview/preview_file.rs @@ -66,15 +66,11 @@ impl Background { let layout_rect = layout[2]; let preview_width = layout_rect.width; let preview_height = layout_rect.height; - let preview_x_coord = layout_rect.x; - let preview_y_coord = layout_rect.y; if preview_width == 0 || preview_height == 0 { return; } - let image_cache = 0; - let script = script.clone(); let event_tx = context.clone_event_tx(); context @@ -92,12 +88,6 @@ impl Background { .arg(preview_width.to_string()) .arg("--preview-height") .arg(preview_height.to_string()) - .arg("--x-coord") - .arg(preview_x_coord.to_string()) - .arg("--y-coord") - .arg(preview_y_coord.to_string()) - .arg("--image-cache") - .arg(image_cache.to_string()) .output(); match res { Ok(output) => {