#!/bin/bash
# A parser for a mailcap-ng file

# getline($linenum)
getline() {
  cat "$HOME/.mailcap" | sed -n ${1}p
}

wherebemailcap_ng() {
  if [ ! -f "$HOME/.mailcap-ng" ]; then
    if [ ! -f "/etc/mailcap-ng" ]; then
      if [ ! -f "/usr/share/etc/mailcap-ng" ]; then
        if [ ! -f "/usr/local/etc/mailcap-ng" ]; then
          echo "Could not find mailcap-ng file! Default paths:"
          echo "  \$HOME/.mailcap-ng:/etc/mailcap-ng:/usr/share/etc/mailcap-ng:/usr/local/etc/mailcap-ng"
        else
          mailcap_ng="/usr/local/etc/mailcap-ng"
        fi
      else
        mailcap_ng="/usr/share/etc/mailcap-ng"
      fi
    else
      mailcap_ng="/etc/mailcap-ng"
    fi
  else
    mailcap_ng="$HOME/.mailcap-ng"
  fi
}

tmp="$( mktemp -p "/tmp" mailcap-ng-XXX )"
wget -O "$tmp" "$1"
mime="$( file --mime "$tmp" | sed 's/^.*: //;s/;.*$//' )"
host="$( echo "$1" | sed 's/^https\{0,1\}:\/\///;s/\/.*$//' )"
wherebemailcap_ng

for i in $( seq -s " " 1 $( wc -l < "${mailcap_ng}" ) ); do
  line="$( cat "${mailcap_ng}" | sed -n ${i}p )"
  if [ "$( echo "$line" | grep "\*[^;]*;" )" != "" ]; then
    linemime="$( echo "$line" | sed 's/\*/[^;]*/g;s/;[^;]*$//' )"
    if [ "$( echo "$mime" | grep "^$linemime" )" ]; then
      thisline="$i"
      break
    fi
  fi
  if [ "$( echo "$line" | grep "^$mime;" )" != "" ]; then
    thisline="$i"
    break
  elif [ "$( echo "$line" | grep "^$host:$mime;" )" != "" ]; then
    thisline="$i"
    break
  elif [ "$( echo "$1" | grep "$( echo "$line" | sed 's/!.*$//' )" )" != "" ]; then
    line="$( echo "$line" | sed 's/^.*!//' )"
    if [ "$( echo "$line" | grep "^$mime;" )" != "" ]; then
      thisline="$i"
      break
    elif [ "$( echo "$line" | grep "^$host:$mime;" )" != "" ]; then
      thisline="$i"
      break
    fi
  fi
done
if [ $thisline ]; then
  line="$( getline "$thisline" )"
  exe="$( echo "$line" | sed 's/^.*; //' )"
  firline="$thisline"
  totline="$( wc -l < ${mailcap_ng} )"
  while [ "$( echo "$line" | grep '\\$' )" != "" ]; do
    thisline="$(( $thisline + 1 ))"
    line="$( getline "$thisline" )"
  done
  exe="$( \
    cat ${mailcap_ng} | \
    head -n $thisline | \
    tail -n $(( $thisline - $firline + 1 )) | \
    sed 's/\\$//;1s/^[^;]*;//' \
  )"
else
  echo "Could not find mailcap entry for: $host:$mime"
  exit
fi
echo "$( echo "$exe" | sed "s%s$tmpg;s%u$1g" )" | sh
rm "$tmp"
