From 7bb116da0fe1c8c94a55f3ed3d960070a6d69458 Mon Sep 17 00:00:00 2001 From: Luca Bilke <luca@bil.ke> Date: Fri, 7 Mar 2025 13:41:30 +0100 Subject: [PATCH] lf: rewrite preview script --- common/.config/lf/preview | 244 +++++++++++++++++++++----------------- 1 file changed, 135 insertions(+), 109 deletions(-) diff --git a/common/.config/lf/preview b/common/.config/lf/preview index e0de4974..e5643944 100755 --- a/common/.config/lf/preview +++ b/common/.config/lf/preview @@ -1,32 +1,116 @@ #!/bin/sh -set -C -f +f="$(realpath "$1")" w=$2 h=$3 _x=$4 _y=$5 -f="$(realpath "$1")" w=$2 h=$3 x=$4 y=$5 - -RED="\033[31m" -RESET="\033[0m" RS="$(printf "\037")" CACHE="${XDG_CACHE_HOME}/lf/$(stat --printf "%n %i %F %s %W %Y" -- "$(readlink -f "$1")" | sha256sum | awk '{print $1}')" SIZED_CACHE="${XDG_CACHE_HOME}/lf/$(stat --printf "%n %i %F %s %W %Y ${w} ${h}" -- "$(readlink -f "$1")" | sha256sum | awk '{print $1}')" BAT="bat --style=plain --color=always --italic-text=always --pager=never --tabs=4 --theme=base16 --line-range=:$h --terminal-width=$((w - 2))" CHAFA="chafa -f sixel -s ${w}x${h} --polite on --animate false" -run() { - #shellcheck disable=SC2068 - if ! command -v "$1" >/dev/null 2>&1; then - printf "%b" "${RED}Cannot execute ${1}${RESET}" - elif "$@"; then - : - else - printf "%b" "${RED}Failed to run command: ${RESET}" - for l in "$@"; do - printf "%b" "\n${RED} ${l}${RESET}" - done - fi +# NOTE: preview functions + +archive1() { + 7z l "$f" | sed 1,11d } -cached_text() { +archive2() { + als -- "$f" +} + +csv() { + mlr --icsv --omd cat "$f" | CLICOLOR_FORCE=1 COLORTERM=truecolor glow -w "$w" -s tokyo-night +} + +docx() { + docx2txt "$f" - +} + +epub() { + gnome-epub-thumbnailer -s 1024 "$f" /dev/stdout +} + +html() { + lynx -dump "$f" +} + +image() { + $CHAFA "$f" +} + +iso() { + iso-info --no-header -l "$f" +} + +json() { + jq -C . "$f" +} + +lua() { + $BAT --language=lua "$f" +} + +markdown() { + CLICOLOR_FORCE=1 COLORTERM=truecolor glow -w "$w" -s tokyo-night "$f" +} + +word() { + catdoc "$f" +} + +ods() { + ssconvert --export-type=Gnumeric_stf:stf_assistant -O separator="$RS" "$f" "fd://1" | column -t -s "$RS" +} + +odt() { + odt2txt "$f" +} + +pdf() { + pdftoppm -jpeg -f 1 -singlefile "$f" +} + +sqlite() { + printf ".headers on\n.mode list\nSELECT name FROM sqlite_master WHERE type='table';\n" | + sqlite3 "$f" | + grep -v name | + while read -r table; do + [ "$table" != "name" ] && + printf "SELECT * FROM %s;" "$table" | + sqlite3 -header -separator "$RS" "$f" + done | + column -t -s "$RS" +} + +svg() { + inkscape \ + --convert-dpi-method=none \ + --export-filename=- \ + --export-overwrite \ + --export-area-drawing \ + --export-png-color-mode=RGBA_16 "$f" | + $CHAFA +} + +text() { + $BAT "$f" +} + +torrent() { + transmission-show "$f" +} + +video() { + ffmpegthumbnailer -s 0 -i "$f" -o "/dev/stdout" | $CHAFA +} + +yaml() { + $BAT --language=yaml "$f" +} + +# NOTE: other functions + +run() { if [ "$1" = "-s" ]; then cache="$SIZED_CACHE" shift @@ -34,105 +118,47 @@ cached_text() { cache="$CACHE" fi - if [ -f "$cache" ]; then - # shellcheck disable=SC2086 - $BAT "$cache" + if [ -r "$cache" ]; then + cat "$cache" else - # shellcheck disable=SC2086 - run "$@" | tee -p "$cache" | $BAT + "$@" | tee -p "$cache" fi } -cached_image() { - if [ -f "$CACHE" ]; then - $CHAFA "$CACHE" - else - run "$@" | tee -p "$CACHE" | $CHAFA - fi -} +preview() { + mimetype=$1 -mimetest() { - case "$1" in - # */pgp-encrypted) run gpg -d -- "$f" ;; - */vnd.openxmlformats-officedocument.spreadsheetml.sheet | */vnd.oasis.opendocument.spreadsheet) - if [ -f "$CACHE" ]; then - $BAT "$CACHE" - else - ssconvert --export-type=Gnumeric_stf:stf_assistant -O separator="$RS" "$f" "fd://1" | - column -t -s "$RS" | tee -p "$CACHE" - fi - ;; - */vnd.sqlite3) - if [ -f "$CACHE" ]; then - $BAT "$CACHE" - else - printf ".headers on\n.mode list\nSELECT name FROM sqlite_master WHERE type='table';\n" | - sqlite3 "$f" | - grep -v name | - while read -r table; do - [ "$table" != "name" ] && - printf "SELECT * FROM %s;" "$table" | - sqlite3 -header -separator "$RS" "$f" - done | - column -t -s "$RS" | tee -p "$CACHE" - fi - ;; - */x-7z-compressed | */vnd.rar | */x-tar | */zip | */x-java-archive | */x-xz | */gzip) - if [ -f "$CACHE" ]; then - $BAT "$CACHE" - else - run 7z l "$f" | sed 1,11d | tee -p "$CACHE" | $BAT - fi - ;; - */epub+zip) cached_image gnome-epub-thumbnailer -s 1024 "$f" "$CACHE" ;; - image/svg+xml) - cached_image inkscape \ - --convert-dpi-method=none \ - --export-filename=- \ - --export-overwrite \ - --export-area-drawing \ - --export-png-color-mode=RGBA_16 "$f" - ;; - image/*) $CHAFA "$f" ;; - */pdf) cached_image pdftoppm -jpeg -f 1 -singlefile "$f" ;; - video/*) cached_image ffmpegthumbnailer -s 0 -i "$f" -o "/dev/stdout" ;; - */vnd.oasis.opendocument.text) cached_text odt2txt "$f" ;; - */vnd.openxmlformats-officedocument.wordprocessingml.document) cached_text docx2txt "$f" - ;; - */csv) - export COLORTERM=truecolor - export CLICOLOR_FORCE=1 - # TODO: caching - mlr --icsv --omd cat "$f" | glow -w "$w" -s tokyo-night - ;; - */markdown) - export COLORTERM=truecolor - export CLICOLOR_FORCE=1 - cached_text -s glow -w "$w" -s tokyo-night "$f" - ;; - */html) cached_text lynx -dump "$f" ;; - */*json) cached_text jq -C . "$f" ;; - */msword) cached_text catdoc "$f" ;; - */x-bittorrent) cached_text transmission-show "$f" ;; - */x-cd-image) cached_text iso-info --no-header -l "$f" ;; - */x-bzip-compressed-tar | */x-compressed-tar | */x-xz-compressed-tar) cached_text als -- "$f" ;; - */*lua) $BAT --language=lua "$f" ;; - */*yaml) $BAT --language=yaml "$f" ;; - *text*) $BAT "$f" ;; + case "$mimetype" in + */vnd.openxmlformats-officedocument.spreadsheetml.sheet | */vnd.oasis.opendocument.spreadsheet) run ods ;; + */vnd.sqlite3) run sqlite ;; + */x-7z-compressed | */vnd.rar | */x-tar | */zip | */x-java-archive | */x-xz | */gzip) run archive1 ;; + */epub+zip) run -s epub ;; + image/svg+xml) run -s svg ;; + image/*) run -s image ;; + */pdf) run -s pdf ;; + video/*) run -s video ;; + */vnd.oasis.opendocument.text) run odt ;; + */vnd.openxmlformats-officedocument.wordprocessingml.document) run docx ;; + */csv) run -s csv ;; + */markdown) run -s markdown ;; + */html) run html ;; + */*json) run json ;; + */msword) run word ;; + */x-bittorrent) run torrent ;; + */x-cd-image) run iso ;; + */x-bzip-compressed-tar | */x-compressed-tar | */x-xz-compressed-tar) run archive2 ;; + */*lua) run lua ;; + */*yaml) run yaml ;; + *text*) run text ;; *) return 1 ;; esac } -# Special cases -[ "$(dirname "$(realpath "$f")" | rev | cut -d/ -f1 | rev)" = "factscache" ] && - [ -f "$(dirname "$(dirname "$(realpath "$f")")")/ansible.cfg" ] && - jq -C <"$f" && exit +mimetype_gio="$(gio info "$f" 2>/dev/null | grep standard::content-type | cut -d' ' -f4)" +preview "$mimetype_gio" && exit +mimetype_file="$(file --brief --dereference --mime-type "$f")" +preview "$mimetype_file" && exit -giorun="$(gio info "$f" 2>/dev/null | grep standard::content-type | cut -d' ' -f4)" -mimetest "$giorun" && exit - -filerun="$(file --brief --dereference --mime-type "$f")" -mimetest "$filerun" && exit - -printf "%b" "\$(file --mime-type)\t\t\t : $filerun\n" -[ -n "$giorun" ] && printf "%b" "\$(gio info)\t\t\t\t : $giorun\n" +[ -n "$mimetype_file" ] && printf "%b" "\$(file --mime-type)\t\t\t : ${mimetype_file}\n" +[ -n "$mimetype_gio" ] && printf "%b" "\$(gio info)\t\t\t\t : ${mimetype_gio}\n" mediainfo "$1" | head -n -2 | grep -v -e "Complete name" -e "General"