#!/bin/bash

#
# Copyright (c) 2015-2017 Samuel Thibault <samuel.thibault@ens-lyon.org>
# 
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# 
# 
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
# 
# 
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
# 

# Make sure we have enough options
if [ $# != 5 -a $# != 6 ]; then
  echo "ERROR: $0 jobid user name nb options [filename]" >&2
  exit 1
fi

NB=$4
OPTIONS=$5
FILE=$6

. /usr/share/cups/braille/cups-braille.sh

####################
# Liblouis options #
####################
LIBLOUIS_CONFIG=""

#  number of cells per line
LIBLOUIS_CONFIG+=" -CcellsPerLine=$TEXTWIDTH -ClinesPerPage=$TEXTHEIGHT -CbraillePages=yes"

#  input encoding
if [ "$CHARSET" = utf-8 ]
then
  LIBLOUIS_CONFIG+=" -CinputTextEncoding=UTF8"
else
  LIBLOUIS_CONFIG+=" -CinputTextEncoding=ascii8"
fi

echo "DEBUG: Input content type: $CONTENT_TYPE" >&2

# FIXME CONTENT_TYPE contains original document, not document passed as parameter ?!!

setupTextRendering() {
  # Default rendering without translation: just reformat paragraphs
  RENDER_CALL="fmt -$TEXTWIDTH"

  #  Tool to be used for the conversion
  case $CONTENT_TYPE in
    text/plain)
      CONVERT=""
      ;;
    text/html)
      CONVERT=""
      RENDER_CALL="lynx -width=$TEXTWIDTH -dump -stdin"
      checkTool lynx lynx "translating html files"
      ;;
    application/msword)
      CONVERT="antiword -"
      checkTool antiword antiword "translating MS-Word doc files"
      ;;
    application/vnd.openxmlformats-officedocument.wordprocessingml.document)
      CONVERT="docx2txt"
      checkTool docx2txt docx2txt "translating MS-Word docx files"
      ;;
    text/rtf|application/rtf)
      CONVERT="rtf2txt /dev/stdin"
      checkTool rtf2txt rtf2txt "translating RTF files"
      ;;
    application/pdf|application/vnd.cups-pdf-banner)
      CONVERT="pdftotext -raw - -"
      checkTool pdftotext poppler "translating PDF files"
      ;;
    *)
      echo "ERROR: unsupported content type $CONTENT_TYPE" >&2
      exit 1
      ;;
  esac
}

# sometimes we can't filter directly from stdin because the tools need to seek
# within the file (e.g. unzip). This can be called in such case to dump stdin to
# a file
dumptofile() {
  [ -z "$FILE" ] || return 0 # Already a file
  trap -- 'rm -f "$FILE"' EXIT
  FILE=$(mktemp "${TMPDIR:-/tmp}/texttobrf.tmp")
  cat > "$FILE"
}

#  Selected braille table
if [ -n "$LIBLOUIS_TABLES" ]
then
  if type file2brl > /dev/null
  then
    # Good, we can use liblouisutdml
    case $CONTENT_TYPE in
      text/plain)
	LIBLOUIS_TOOL="file2brl"
	CONVERT=""
	;;
      text/html)
	LIBLOUIS_TOOL="file2brl -t"
	CONVERT=""
	;;
      text/xml|application/xml|application/xhtml+xml|application/sgml)
	LIBLOUIS_TOOL="file2brl"
	CONVERT=""
	;;
      application/msword)
	LIBLOUIS_TOOL="file2brl"
	CONVERT="antiword -x db -"
	checkTool antiword antiword "translating MS-Word doc files"
	;;
      application/vnd.oasis.opendocument*)
	LIBLOUIS_TOOL="file2brl"
	dumptofile
	CONVERT="unzip -p $FILE content.xml"
	checkTool unzip unzip "translating LibreOffice/OpenOffice OpenDocument files"
	;;
      application/vnd.openxmlformats-officedocument*)
	LIBLOUIS_TOOL="file2brl"
	dumptofile
	CONVERT="unzip -p $FILE word/document.xml"
	checkTool unzip unzip "translating MS-Word docx files"
	;;
      text/rtf|application/rtf)
	LIBLOUIS_TOOL="file2brl"
	CONVERT="rtf2xml /dev/stdin"
	checkTool rtf2xml rtf2xml "translating RTF files"
	;;
      application/pdf|application/vnd.cups-pdf-banner)
	LIBLOUIS_TOOL="file2brl -p"
	CONVERT="pdftotext -raw - -"
	checkTool pdftotext poppler "translating PDF files"
	;;
      *)
	echo "ERROR: unsupported content type $CONTENT_TYPE" >&2
	exit 1
	;;
    esac
    RENDER_CALL="$LIBLOUIS_TOOL -CliteraryTextTable=$LIBLOUIS_TABLES,braille-patterns.cti $LIBLOUIS_CONFIG"
  elif type lou_translate > /dev/null
  then
    # Only liblouis, but better than nothing
    setupTextRendering
    printf "WARN: The liblouisutdml package is required for translating braille better\n" >&2
    TRANSLATE="lou_translate $LIBLOUIS_TABLES,braille-patterns.cti"
  else
    printf "ERROR: The liblouisutdml package is required for translating braille\n" >&2
    exit 1
  fi
else
  # No translation, only text rendering
  setupTextRendering
fi

# Now proceeed
cd $TMPDIR
echo "INFO: Reformating text" >&2

if [ -z "$CONVERT" ]
then
  printf "DEBUG: Calling $RENDER_CALL on '%s'\n" "$FILE" >&2
  if [ -z "$FILE" ]
  then
    $RENDER_CALL 2> /dev/null
  else
   < "$FILE" $RENDER_CALL 2> /dev/null
  fi
elif [ -z "$TRANSLATE" ]
then
  printf "DEBUG: Calling $CONVERT | $RENDER_CALL on '%s'\n" "$FILE" >&2
  if [ -z "$FILE" ]
  then
    $CONVERT | $RENDER_CALL 2> /dev/null
  else
  < "$FILE" $CONVERT | $RENDER_CALL 2> /dev/null
  fi
else
  printf "DEBUG: Calling $CONVERT | $RENDER_CALL | $TRANSLATE on '%s'\n" "$FILE" >&2
  if [ -z "$FILE" ]
  then
    $CONVERT | $RENDER_CALL 2> /dev/null | $TRANSLATE
  else
  < "$FILE" $CONVERT | $RENDER_CALL 2> /dev/null | $TRANSLATE
  fi
fi

echo "INFO: Ready" >&2
