#!/bin/sh
# shpell - Programme de correcteur orthographique interactif qui vous
#   permet de parcourir un  un tous les mots suspects du document,
#   indiquer ceux que vous souhaitez corriger et de quelle manire, et
#   qui applique ensuite ces modifications au fichier.
#   La version originale du fichier est conserve sous le suffixe .shp,
#   et la version corrige remplace le fichier de dpart.

# Vous remarquerez qu'il faut disposer d'une commande spell standard
#   pour que ceci fonctionne; vous devrez donc parfois
#   installer aspell, ispell ou pspell sur votre systme.

tempfile="/tmp/$0.$$"
changerequests="/tmp/$0.$$.sed"
spell="ispell -l -d french"      #  modifier en fonction de votre installation

trap "rm -f $tempfile $changerequests" EXIT HUP INT QUIT TERM

# Inclut les dfinitions de squences de couleurs ANSI

. script-library.sh
initializeANSI

getfix()
{
# Demande  l'utilisateur de spcifier une correction. Si le mot propos
#   est galement mal crit, la fonction s'appelle elle-mme, avec une
#   rcursivit de niveau 2. Ceci peut se poursuivre indfiniment, mais 
#   garder la trace du niveau d'imbrication nous permet de n'mettre le 
#   message du mot de remplacement qu'au niveau 1.

  word=$1
  filename=$2
  misspelled=1

  while [ $misspelled -eq 1 ]
  do
    echo ""; echo "${boldon}Mot ${word} mal crit:${boldoff}"
    grep -n $word $filename |
      sed -e 's/^/ /' -e "s/$word/$boldon$word$boldoff/g"
    echo -n "i)gnorer, q)uitter, ou taper un mot de remplacement: "
    read fix
    if [ "$fix" = "q" -o "$fix" = "quit" ] ; then
      echo "Fin du programme; aucune correction applique."; exit 0
    elif [ "${fix%${fix#?}}" = "!" ] ; then
      misspelled=0    # l'utilisateur force la correction, 
                      #   on cesse les vrifications
      echo "s/$word/${fix#?}/g" >> $changerequests
    elif [ "$fix" = "i" -o -z "$fix" ] ; then
      misspelled=0
    else
      if [ ! -z "$(echo $fix | sed 's/[^ ]//g')" ] ; then
        misspelled=0  # quand on voit des blancs, on cesse la vrification
        echo "s/$word/$fix/g" >> $changerequests
      else
        # C'est le remplacement d'un mot, vrifions aussi son orthographe
        if [ ! -z "$(echo $fix | $spell)" ] ; then
          echo ""
          echo "*** Votre proposition de remplacement $fix est mal crite."
          echo "*** Prfacez le mot de ! pour l'imposer sans contrle."
        else  
          misspelled=0   # le mot suggr est acceptable
          echo "s/$word/$fix/g" >> $changerequests
        fi 
      fi  
    fi 
  done 
}

### Dbut du corps du script  proprement parler
if [ $# -lt  1 ] ; then 
  echo "Syntaxe: $0 nom_de_fichier" >&2 ; exit 1 
fi

if [ ! -r $1 ] ; then 
  echo "$0: je ne peux lire le fichier $1 et en contrler l'orthographe" >&2 
  exit 1 
fi

# L'appel suivant remplit au passage le fichier $tempfile
errors="$($spell < $1 | tee $tempfile | wc -l | sed 's/[^[:digit:]]//g')"

if [ $errors -eq 0 ] ; then 
  echo "Aucune erreur d'orthographe dtecte dans $1."; exit 0 
fi

echo "Nous devons corriger $errors mots mal crits dans le document."
echo "Rappelez-vous, si vous tes paresseux, que la rponse par"
echo "  dfaut  l'invite du correcteur orthographique est ignorer."

touch $changerequests

for word in $(cat $tempfile) 
do
  getfix $word $1 1 
done

if [ $(wc -l < $changerequests) -gt 0 ] ; then
  sed -f $changerequests $1 > $1.new
  mv $1 $1.shp
  mv $1.new $1
  echo Fini. $(wc -l < $changerequests) modifications effectues. 
fi

exit 0
