#!/bin/bash
# Best effort auto-pygmentization with transparent decompression
# (c) Reuben Thomas 2012-2013
# This program is in the public domain.

# Strategy: first see if pygmentize can find a lexer; if not, ask file; if that finds nothing, fail
# Set the environment variable PYGMENTIZE_OPTS or pass options before the file path to configure pygments.

# This program can be used as a .lessfilter for the less pager to auto-color less's output

file="${!#}"              # last argument
options=${@:1:$(($#-1))}  # handle others args as options to pass to pygmentize

file_common_opts="--brief --dereference"

lexer=$(pygmentize -N "$file")
if [[ "$lexer" == text ]]; then
    unset lexer
    case $(file --mime-type --uncompress $file_common_opts "$file") in
        application/xml|image/svg+xml) lexer=xml;;
        text/html) lexer=html;;
        text/troff) lexer=nroff;;
        text/x-asm) lexer=nasm;;
        text/x-awk) lexer=awk;;
        text/x-c) lexer=c;;
        text/x-c++) lexer=cpp;;
        text/x-diff) lexer=diff;;
        text/x-fortran) lexer=fortran;;
        text/x-gawk) lexer=gawk;;
        text/x-java) lexer=java;;
        text/x-lisp) lexer=common-lisp;;
        text/x-lua) lexer=lua;;
        text/x-makefile) lexer=make;;
        text/x-msdos-batch) lexer=bat;;
        text/x-nawk) lexer=nawk;;
        text/x-pascal) lexer=pascal;;
        text/x-perl) lexer=perl;;
        text/x-php) lexer=php;;
        text/x-po) lexer=po;;
        text/x-python) lexer=python;;
        text/x-ruby) lexer=ruby;;
        text/x-shellscript) lexer=sh;;
        text/x-tcl) lexer=tcl;;
        text/x-tex|text/x-texinfo) lexer=latex;; # FIXME: texinfo really needs its own lexer
        
        # Types that file outputs which pygmentize didn't support as of file 5.11, pygments 1.6rc1
        # text/calendar
        # text/PGP
        # text/rtf
        # text/texmacs
        # text/x-bcpl
        # text/x-info
        # text/x-m4
        # text/x-vcard
        # text/x-xmcd
        
        text/plain)  # special filenames. TODO: insert more
            case $(basename "$file") in
                .zshrc) lexer=sh;;
            esac
            ;;
    esac
fi

encoding=$(file --mime-encoding --uncompress $file_common_opts "$file")
if [[ $encoding == "us-asciibinarybinary" ]]; then
	encoding="us-ascii"
fi

if [[ -n "$lexer" ]]; then
    concat=cat
    case $(file $file_common_opts --mime-type "$file") in
        application/x-gzip)  concat=zcat;;
        application/x-bzip2) concat=bzcat;;
        application/x-xz)    concat=xzcat;;
    esac
    # FIXME: Specify input encoding rather than output encoding https://bitbucket.org/birkenfeld/pygments-main/issue/800
    exec $concat "$file" | pygmentize -f terminal256 -O style=native,encoding=$encoding,outencoding=UTF-8 $PYGMENTIZE_OPTS $options -l $lexer
fi

exit 1
