Cours 10 - Reconstruction du code (Refactoring)

N.B. Les explications de chaque commande ou de chaque bloc de codes sont données dans les commentaires.

Pour que notre script final soit plus lisible et clair, nous avons essayé de remanier notre code en mettant des blocs de code répétitifs dans des fonctions. Grâce aux exemples fournis dans le blog d’un ancien camarade, nous avons pu comprendre le foctionnement des fonctions en bash dans un cas précis et concret.

Script principal

#!/bin/bash
# importer les fonctions
. /Users/becca/Documents/nlp/coursS1/projetEncadre/PROJET-MOT-SUR-LE-WEB/PROGRAMMES/functions.sh
#--------------------Main part-----------------#
# on commence par supprimer l'éventuel fichier de résultat que l'on doit reconstruire
rm -f "$2/tableau2.html" ;
# on récupère les 2 arguments que l'on a passé au programme
# le premier : chemin vers le dossier contenant les fichiers d'URL
# le second : chemin vers le dossier devant contenir le fichier HTML final
echo "Les urls SONT DANS  : $1" ;
echo "On créé le tableau HTML dans : $2" ;
# output=$($2/tableau2.html)
ecrireMetaData $2/tableau2.html
# Création d'une variable pour compter les fichiers traités et donc le nb de tableau généré
numerotableau=1;
# Création d'une variable pour stocker notre terme ciblé
motif=$3;

# Parcours du dossier contenant les fichiers URLs
for fichier in $(ls $1)
do
compteur=1; # compteur destiné à compter les URLs pour chaque fichier d'URL
echo "$1/$fichier" ;
#-----------------------------------------------------------
# Création du tableau associé au fichier en cours de traitement
#-----------------------------------------------------------
ecrireTitre $2/tableau2.html
# "parcours" d'un fichier d'URL : lecture ligne à ligne des URLs
for ligne in $(cat "$1/$fichier")
  do
  codeRetour=$(detHttpCode $ligne);
  if [[ $codeRetour == 200 ]]
    then
    encodage=$(detEncodage1 $ligne);
    curl -L -o "../PAGES-ASPIREES/$numerotableau-$compteur.html" "$ligne";
    echo "ENCODAGE DETECTE PAR CURL : $encodage";
    if [[ $encodage == "UTF-8" ]]
      then
      procUtf8 $2/tableau2.html
    else # http_code=200, l'encodage n'est pas utf-8
      encodage=$(detEncodage2 $ligne)
      if [[ $encodage == "UTF-8" ]]
        then
        procUtf8 $2/tableau2.html
      else
        code=$(iconv -l|egrep -i $encodage)
        if [[ $code=true ]]
          then
          iconv -f $encodage -t 'utf-8' ../DUMP-TEXT/$numerotableau-$compteur.txt > ../DUMP-TEXT/$numerotableau-$compteur-converti.txt
        else
          procVide $2/tableau2.html
        fi
      fi
    fi
  else
    procVide $2/tableau2.html
  fi
  compteur=$((compteur+1)) ;
done
echo "</table><br />" >> $2/tableau2.html ;
# on incrémente le compteur de tableaux
numerotableau=$((numerotableau+1));
done
echo "</body></html>" >> $2/tableau2.html ;

Fonctions

## functions
# 1 html head
ecrireMetaData(){
  echo "<!DOCTYPE html>" > $1
  echo "<html lang=\"en\">" >> $1
  echo "<head><meta charset="UTF-8"><title>Projet Encadre</title></head>" >> $1
  echo "<body>" >> $1
 }
# 2 table title
ecrireTitre(){
  echo "<table border=\"2\" align=\"center\" width=\"80%\">" >> $1
  echo "<tr bgcolor=\"grey\"><td>N°</td><td>URL</td><td>Code http</td><td>encodage</td><td>Page aspirée</td><td>Dump</td><td>Filtrage Txt</td><td>Filtrage Html</td><td>Index</td><td>Bitexte</td><td>Fq Motif</td></tr>" >> $1
}
# 3 get http_code
detHttpCode(){
  curl -SIL -o toto -w "%{http_code}" $1
}
# 4 two ways to get encoding
detEncodage1(){
  curl -sIL -o toto  -w %{content_type} $1 | cut -f2 -d"=" | tr '[a-z]' '[A-Z]' | tr -d '\r'
}
detEncodage2(){
  egrep -oi 'charset="?[^",]+"?' $1 | cut -f2 -d"=" | tr '[a-z]' '[A-Z]' | tr -d '\r'| head -1
}

# 5 process text when encoding is utf-8
procUtf8(){
  # 1. On lynx la page aspirée
	lynx -dump -nolist -assume_charset=$encodage -display_charset=$encodage "../PAGES-ASPIREES/$numerotableau-$compteur.html" > ../DUMP-TEXT/$numerotableau-$compteur.txt;
	#-----------------------------------------------------------
	# 2. On cree le fichier contexte TXT via egrep
  egrep -i -C2 "$motif" ../DUMP-TEXT/$numerotableau-$compteur.txt > ../CONTEXTE/$numerotableau-$compteur.txt;
  #-----------------------------------------------------------
	# 3. Fq motif
	nbmotif=$(egrep -coi "$motif" ../DUMP-TEXT/$numerotableau-$compteur.txt;);
	#-----------------------------------------------------------
	# 4. contexte html
	../minigrep/minigrepmultilingue.pl "utf-8" ../DUMP-TEXT/$numerotableau-$compteur.txt ../minigrep/motif-regexp.txt ;
  mv resultat-extraction.html ../CONTEXTES/$numerotableau-$compteur.html ;
	#-----------------------------------------------------------
	# 5. index hierarchique
	egrep -o "\w+" ../DUMP-TEXT/$numerotableau-$compteur.txt | sort | uniq -c | sort -r > ../DUMP-TEXT/index-$numerotableau-$compteur.txt ;
	#-----------------------------------------------------------
	# 6. bigramme
	egrep -o "\w+" ../DUMP-TEXT/$numerotableau-$compteur.txt > bi1.txt;
	tail -n +2 bi1.txt > bi2.txt ;
	paste bi1.txt bi2.txt > bi3.txt ;
	cat bi3.txt | sort | uniq -c | sort -r >  ../DUMP-TEXT/bigramme-$numerotableau-$compteur.txt ;
	#-----------------------------------------------------------
	# 7. on écrit les résultats dans le tableau avec tous les résultats produits
  echo "<tr>
  <td>$compteur</td>
  <td><a href=\"$ligne\" target=\"_blank\">$ligne</a></td>
  <td>Code_http:$codeRetour</td>
  <td>Encodage:$encodage</td>
  <td><a href=\"../PAGES-ASPIREES/$numerotableau-$compteur.html\">$numerotableau-$compteur.html</a></td>
  <td><a href=\"../DUMP-TEXT/$numerotableau-$compteur.txt\">$numerotableau-$compteur.txt</a></td>
  <td><a href=\"../CONTEXTES/$numerotableau-$compteur.txt\">$numerotableau-$compteur.txt</a></td>
  <td><a href=\"../CONTEXTES/$numerotableau-$compteur.html\">$numerotableau-$compteur.html</a></td>
  <td><a href=\"../DUMP-TEXT/index-$numerotableau-$compteur.txt\">index-$numerotableau-$compteur</a></td>
  <td><a href=\"../DUMP-TEXT/bigramme-$numerotableau-$compteur.txt\">bigramme-$numerotableau-$compteur</a></td>
  <td>$nbmotif</td>
  </tr>" >> "$1"
}
# 6 write "-" in table
procVide(){
  echo "<tr>
  <td>$compteur</td>
  <td><a href=\"$ligne\" target=\"_blank\">$ligne</a></td>
  <td>Code_http:$codeRetour</td>
  <td>Encodage:$encodage</td>
  <td><a href=\"../PAGES-ASPIREES/$numerotableau-$compteur.html\">$numerotableau-$compteur.html</a></td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td><td>-</td></tr>" >> "$1"
}
article précédent