#!/usr/bin/env perl

       #*********************************************#
       #              quote-from-bashfr              #
       #              écrit par tOkeshu              #
       #                02 août. 2006                #
       #                   bashfr.pl                    #
       #                 version 1.1                 #
       #                                             #
       #    Récupère les citations de votre site     #
       #              préféré: bashfr.org            #
       #*********************************************#
       

# ----------------------------------------------------------- #
# Ce script prépare et traite les citations du site Bashfr.org#
# Il accepte 6 arguments possible :                           #
# -latest | -random | -random2 | -top50                                  #
# Ils correspondent ou 4 pages de citation de bashfr :        #
#                                                             #
# http://www.bashfr.org/?sort=latest                          #
# http://www.bashfr.org/?sort=random                          #
# http://www.bashfr.org/?sort=random2                          #
# http://www.bashfr.org/?sort=top50                           #
#                                                             #
# -quote x (avec x>0)                                         #
# Correspond à la page : http://www.bashfr.org/?x             #
#                                                             #
# -n est un argument qui est utilisé avec les 3 premiers:     #
# Il permet de selectionner une quote parmis les 3 différentes#
# pages énoncées. (ex: -latest -n 2 )                         #
#                                                             #
# Le choix par défaut est random.                             #
# ----------------------------------------------------------- #

# Variable qui permet de décompter le nombre de citations parcourues.
$quote_number=1;

$caracterebizarre=0;

# On vérifie les arguments.
# Cas génériques : top50, aléatoire, et dernier ajout.
if ( $ARGV[0] eq "-latest" || $ARGV[0] eq "-random" || $ARGV[0] eq "-top50" || $ARGV[0] eq "-random2" )
{
    $choix=substr ($ARGV[0],1,8);
    $choix="sort="."$choix";
    
# Argument qui permet d'afficher une citation en particulier.
}elsif ( $ARGV[0] eq "-quote" )
{
    $choix="$ARGV[1]";
    
# Argument par défaut.
}else{
    $choix="sort=random2";
    
}

# Argument qui permet de selectionner une citation en particulier avec 
# les arguments précédents. (ex : quote.pl -latest -n 2 )
if ( $ARGV[1] eq "-n" )
{
    $quote_number=$ARGV[2];
}

# Variable d'état (somme-nous dans une citation ? : vrai(>0) ou non(0)).
$in_the_quote=0;

# On récupère directement la page HTML.
use LWP::Simple;
$url="http://www.bashfr.org/?"."$choix";
$source = get($url);
# On récupère chaque ligne dans un tableau.
@tab = split(/\n/,$source);

# On parcours tout le tableau.
# A chaque tour de boucle on ne considère qu'une seule ligne ( $_ ).
 foreach $_ (@tab) {
    # Condition d'arret (somme nous sortis de la citation ?).
    # SI oui alors on arrete la boucle.
    # Si non on continue à parcourir le fichier.
    if ( ("$_" =~ m!div!) && $in_the_quote!=0 )
    {
    last;
    }

    # Somme nous dans la citation ?
    # Si index trouve quote1 ou quote-1 (!=-1) nous venons de trouver une citation.
    $i=index($_,'quote1');
    $j=index($_,'quote-1');
    if ( $i!=-1 || $j!=-1 )
    {
        if ( $quote_number == 1 )
        {
            # Changement d'état (dans la citation).
            $in_the_quote=1;
        }else 
        {
            $quote_number--;
        }
    }

    # Si nous avons changé d'état nous traitons la citation.
    if ( $in_the_quote!=0 )
    {
        # Enlève les balises superflues de début de citation.
        if ( $in_the_quote==1 )
        {
            $_ =~ m/\?([0-9]+)/g;
            # Repère le tout début de la citation dans la ligne (après <br />).
            $pos_debut=index($_,'<br />');
            $pos_debut+=6;
            $pos_fin=length($_);
            # Modifie la ligne actuellement considérée en récupérant
            # uniquement ce qui nous intéresse.
            $_=substr ($_,$pos_debut,$pos_fin);
            # Changement d'état (corps et fin de la citation, rien à enlever).
            $in_the_quote=2;
        }
            # Toute la partie suivante vise à enlever le formatage HTML.
            # ( certaines méthodes existent déjà mais ici rien de compliqué ).
            # Comme substituer une chaine longue à une chaine + courte est 
            # fastidieuse, on remplace l'espace des caractère en trop par un
            # marqueur ( ici % ).
            s/&quot;/%%%%%%\"/g;
            s/&amp;/%%%%%&/g;
            s/&lt;/%%%</g;
            s/&gt;/%%%>/g;
            s/&oelig;/%%%%%%Œ/g;
            s/&nbsp;/%%%%% /g;
            s/&copy;/%%%%%©/g;
            s/&not;/%%%%¬/g;
            s/&ordf;/%%%%%ª/g;
            s/&deg;/%%%%°/g;
            s/&sup2;/%%%%%²/g;
            s/&Agrave;/%%%%%%%%À/g;
            s/&Atilde;/%%%%%%%%à/g;
            s/&Ccedil;/%%%%%%%%Ç/g;
            s/&Egrave;/%%%%%%%%È/g;
            s/&Eacute;/%%%%%%%%É/g;
            s/&Ecirc;/%%%%%%%Ê/g;
            s/&iuml;/%%%%%%ï/g;
            s/&\#039;/%%%%%\'/g;
            s/&eacute;/%%%%%%%é/g;
            s/&agrave;/%%%%%%%à/g;
            s/&acirc;/%%%%%%â/g;
            s/&ccedil;/%%%%%%%ç/g;
            s/&egrave;/%%%%%%%è/g;
            s/&eacute;/%%%%%%%é/g;
            s/&ecirc;/%%%%%%ê/g;
            s/&euml;/%%%%%ë/g;
            s/&icirc;/%%%%%%î/g;
            s/&ocirc;/%%%%%%ô/g;
            s/&ugrave;/%%%%%%%ù/g;
            s/&ucirc;/%%%%%%û/g;    
            s/<br \/>/%%%%%/g;            

        $caracterebizarre+=1;
        if ($caracterebizarre>=1)  {$_=substr ($_,0,-1);}
        s/%+//g;

        # Pour conclure on supprime les marqueurs.
        # On affiche enfin la ligne de citation traitée.
        print "$_ \n";
        
    }
}
print "\n";

