#!/bin/bash
#
# $Id: lliaphon_test,v 1.6 2003/06/21 16:17:25 bigphil Exp $
#
# Cr par Phil's Free le 30/05/2003
#
# Copyright (C) Phil Buch 2003
#
# Contact : biglux@culte.org
#
# Description : Lecture d'un fichier par paragraphe ou par ligne.
#               Pour chaque paragraphe un fichier temporaire est cr
#               reprenant le nom du fichier et le numro de la premire
#               ligne du paragraphe.
#               LLiaPhon est appel pour ce fichier temporaire
#               puis MBrola si un fichier d'extension ".ola" a t obtenu.
#               L'utilisateur coute le rsultat de la synthse vocale et peut :
#               - soit valider cette ligne, en tapant <Entree>
#                 le fichier temporaire est alors dtruit;
#               - soit taper "r" + <Entree> pour rcouter l'extrait qui vient
#                 d'tre lu dans le mode courant;
#               - soit taper "a" + <Entree> pour rcouter l'extrait qui vient
#                 d'tre lu en mode raccentuation automatique;
#               - soit taper "na" + <Entree> pour rcouter l'extrait qui vient
#                 d'tre lu en nvalidant le mode raccentuation automatique;
#               - soit rdiger un commentaire d'anomalie (d'une ligne);
#                 dans ce cas, le fichier temporaire prend une extension ".err"
#                 et le commentaire entre dans une fichier d'extension ".cmt".

wkf=/tmp/lliaphon_test.$$
trap "rm -f debug $wkf; exit 255" 2 15

tty=`tty`
prog=`basename $0`
mem=llpt    # suffixe du fichier de memorisation de la dernire ligne lue
mode=p      # par dfaut, lecture paragraphe par paragraphe
again=r     # par dfaut, chaine de demande de rcoute du dernier extrait lu
help1=h     # chaine de demande d'aide
help2='?'   # chaine de demande d'aide (alternative)
accrep=a    # chaine tape par l'utilisateur pour obtenir l'accentuation automatique
nacrep=na   # chaine tape par l'utilisateur pour supprimer l'accentuation automatique
accopt=     # option de demande de raccentuation automatique (pas par dfaut)

# Fonction de fin avec rappel de syntaxe
usage() {
  echo "Usage : $prog [-p|-l] [-r <replay_string>] \\"
  echo "              -acc \\"
  echo "              -t <duree> -f <frequence> \\"
  echo "              <fichier_texte> ..."
  echo " "
  echo "        -p   : lecture par paragraphe (par defaut)"
  echo "        -l   : lecture par ligne"
  echo "        -r   : introduit la chaine de caractres (<replay_string>)"
  echo "               qui doit tre tape pour rcouter le dernier extrait"
  echo '               (par dfaut, "r")'
  echo '        -acc : raccentuation automatique (cf. lliaphon)'
  echo "        -t <duree>   : facteur de dure d'un phonme (cf. play_ola)"
  echo '        -f <hauteur> : facteur de hauteur de la voix (cf. play_ola)'
  echo ' '
  echo 'Exemple :'
  echo "    $prog -r encore -acc -t 0.7 -f 1.5 examples/dino.txt"
  exit 255
}

# Fonction d'affichage d'aide en cours de fonctionnement
helpmsg() {
  echo "Vous pouvez taper maintenant <Entree> prcd de :"
  echo "  - rien si le dernier extrait a t lu correctement"
  echo "  - '${again}' pour rcouter cet extrait"
  if [ -z "$accopt" ]
  then
    accopt="-acc"
    echo "  - '${accrep}' pour rcouter l'extrait avec l'accentuation automatique"
  else
    accopt=
    echo "  - '${nacrep}' pour rcouter l'extrait sans l'accentuation automatique"
  fi
  echo "  - un commentaire d'anomalie (d'une ligne)"
}

# Fonction de lecture par MBrola et de jugement d'un fichier
lire_fichier() {
  file=$1
  boucle=1
  while [ $boucle -ne 0 ]
  do
    lliaphon $accopt $file >/dev/null 2>&1
    if [ $? -eq 0 ]
    then
      echo "LECTURE de $file : "
      cat $file
      play_ola $opt_play $file.ola
      rep=$help1
      while [ "$rep" = "$help1" ]
      do
        echo "Si NOK, merci de taper 1 commentaire (au moins 1 caractre)"
#      echo "Si vous voulez reecouter l'extrait qui vient d'tre lu, tapez '${again}'"
        echo "Pour plus d'aide, vous pouvez tapez '${help1}' ou '${help2}'"
        read rep < $tty
        if [ -z "$rep" ]
        then
          echo "lecture de $fic ligne $first a $num consideree comme OK"
          rm $file
          boucle=0
        else
          if [ "$rep" = $help1 -o "$rep" = $help2 ]
          then
            helpmsg
	    rep=$help1
          else
            if [ "$rep" != "$again" ]
            then
              if [ "$rep" != "$accrep" -a "$rep" != "$nacrep" ]
              then
                mv $file $file.err
                echo "$rep" > $file.cmt
                boucle=0
              else
                case "$rep" in
		  $accrep) accopt="-acc"
		           ;;
		  $nacrep) accopt=
		           ;;
		  *)       echo "$prog : erreur interne"
		           exit 255
		           ;;
                esac
	      fi
            fi
          fi
        fi
      done
    else
      mv $file $file.err
      echo "lliaphon ne retourne pas 0" | tee $file.cmt
      boucle=0
    fi
  done
  rm -f $file.ola $file.dat* debug
}


# Analyse des arguments

if [ $# -lt 1 ]
then
  usage
fi
while [ $# -ge 1 ]
do
  case $1 in
    '-p') ;;
    '-l') mode=l
          ;;
    '-r') shift
          if [ $# -eq 0 ]
          then
            usage
          else
            again="$1"
            if [ $1 = Escape ]
            then
              again=""
            fi
          fi
          ;;
    '-acc')
          accopt="-acc"
          ;;
    -[tf])
          if [ $# -lt 2 ]
          then
            usage
          fi
          opt_play="$opt_play $1 $2"
          shift
          ;;
    *) listef="$listef $1"
          ;;
  esac
  shift
done
        
# Traitement de fichiers

tmpf=""
for fic in $listef
do
  rad=`expr "$fic" : '\(.*\)\.txt'`
  if [ -z "$rad" ]
  then
    rad=$fic
  fi
  # test de reprise
  if [ -f $rad.$mem ]
  then
    startl=`cat $rad.$mem`
    rep=
    while [ -z $rep ]
    do 
      echo "Voulez-vous reprendre la lecture de $fic  la ligne $startl [O/n] ?"
      read rep
      case $rep in
        [Oo]) ;;
        [Nn]) startl=1
              ;;
        *)    rep=
              ;;
      esac
    done
  else
    startl=1
  fi

  # prparation de fichier
  num=0
  tmpf=""
  tr -d '\r' < $fic > $wkf
  # lecture de fichier
  while read ligne
  do
    num=`expr $num + 100001`
    num=`expr $num : '1\(.*\)'`
    if [ $num -lt $startl ]
    then
      continue
    fi

    nmots=`echo "$ligne" | wc -w`
    if [ $nmots -ne 0 ]
    then
      # ligne non vide
      if [ -z "$tmpf" ]
      then
        first=$num
        tmpf=$rad.$num
        rm -f $tmpf $tmpf.cmt $tmpf.err
        # memorisation du numro de ligne de dbut d'extrait  lire
        echo $first > $rad.$mem
      fi
      echo "$ligne" >> $tmpf
      allons=$mode
      dercar=
      if [ $mode = p ]
      then
        dercar=`expr "$ligne" : '.*\([\.;]\)[	 ]*$'`
        if [ "$dercar" ]
        then
          # fin de paragraphe (ou de phrase)
          allons=l
        fi
      fi
      if [ $allons = l ]
      then
        # lliaphon plante si pas de point final
        if [ ! "$dercar" ]
        then
          dercar=`expr "$ligne" : '.*\([\.]\)[	 ]*$'`
        fi
        if [ "$dercar" != "." ]
        then
          echo "." >> $tmpf
        fi
        lire_fichier $tmpf
        tmpf=
      fi 
    else
      # ligne vide => fin de paragraphe
      if [ "$tmpf" ]
      then
        echo "." >> $tmpf
        lire_fichier $tmpf
        tmpf=
      fi
    fi
  done < $wkf
  # lecture du dernier paragraphe
  if [ "$tmpf" ]
  then
    echo "." >> $tmpf
    lire_fichier $tmpf
  fi
done

rm -f $wkf debug
exit 0

