Boujour à tous,
Vous aimez
bashfr ? Vous trouvez ça absolument stupide mais vraiment divertissant voir indispensable 😛.
Vous aimez fortune (ie pour ceux qui ne connaissent pas tapez fortune dans votre terminal ) ? Mais certaines blagues vous échappent car l'anglais c'est pas vot' truc ? 😛 et la version française ne vous convient pas :/ ?
Vous aimez cowsay, et vous l'utilisez lors de l'ouverture de votre terminal ?
Et bien je suis fier de vous présenter en exclusivité le 2eme (voir plus bas) fortune dédié à bashfr. 😃
Le projet :
Lorsque je suis arrivé sur le forum j'ai découvert
cowsay : un chouet programme.
Mais l'exemple qui était donné me paraissait un tantinet triste. Alors j'ai fait des recherches plus approfondies (cf. man cowsay) et j'ai bidouillé pour avoir un truc plus sympas.
Voici ce que j'utilise actuellement :
fortune | cowsay -e -- -f bunny.cow
Comme vous pouvez le voir j'ai couplé fortune avec cowsay et quelques options.
Ensuite je me suis dit : ça serait terrible si à la place de fortune on aurait les quotes de bashfr.
Et cette idée ma longuement trotté dans la tête. Mais pour réaliser ce type de programme il fallait déjà savoir comment récupérer le contenu d'une page web dans le terminal :/.
J'ai trouvé le salut Dimanche dernier sur
cette page
J'ai donc analysé pendant un certain temps le code de la page pour savoir ce que je devais extraire de cette montagne de texte. J'ai donc voulu utiliser les scripts bash.
Mais ça ne marchait pas, même avec des grep, cut ou substr, je n'arrivais pas à obtenir le résultat souhaité. Le lendemain je me suis tourné vers Perl que je ne connaissait pas : je me suis dit chouet tu va pouvoir apprendre un nouveau langage.
Et hier soir j'ai obtenu ce que je voulais. Je publie donc le code source ici pour en faire profiter à tout le monde. 😉
J'espère que certains pourrons m'aider à l'améliorer et si possible ne pas uniquement traiter les citations de bashfr 😃.
Présentation du programme :
Nom : quote-from-bashfr.
Langage : Perl.
Version : 1.0
Réalisation : 24 juillet 2006
Le programme entier comporte 2 fichiers distincts :
D'un coté un script bash qui traite les arguments et qui lance le 2eme fichier.
De l'autre coté un fichier perl qui est le coeur du progamme.
Le code source :
Fichier 1 : quote-from-bashfr.sh
#!/bin/bash
#*********************************************#
# quote-from-bashfr #
# écrit par tOkeshu #
# 24 Juil. 2006 #
# #
# version 1.0 #
# #
# Récupère les citations de votre site #
# préféré: bashfr.org #
#*********************************************#
# ----------------------------------------------------------- #
# Ce script prépare le lancement de quote.pl. #
# Il accepte 3 choix possible : latest | random | top50 #
# Ils correspondent ou 3 pages de citation de bashfr : #
# #
# http://www.bashfr.org/?sort=latest #
# http://www.bashfr.org/?sort=random #
# http://www.bashfr.org/?sort=top50 #
# #
# Le choix par défaut est random. #
# ----------------------------------------------------------- #
if [[ $1 = "-latest" || $1 = "-random" || $1 = "-top50" ]]
then
choix=`expr substr $1 2 7`
else
choix="random"
fi
GET -a http://www.bashfr.org/?sort=$choix > bashfr
exec quote.pl
fichier 2 : quote.pl
#!/usr/bin/env perl
#*********************************************#
# quote-from-bashfr #
# écrit par tOkeshu #
# 24 Juil. 2006 #
# #
# version 1.0 #
# #
# Récupère les citations de votre site #
# préféré: bashfr.org #
#*********************************************#
# ----------------------------------------------------------- #
# Ce script prépare et traite les citations contenues dans le #
# fichier "bashfr" précédement créé. #
# ----------------------------------------------------------- #
# On ouvre le fichier "bashfr" précédement créé.
open(FILE,"bashfr") || die ("Erreur d'ouverture de FILE") ;
# Variable d'état (somme-nous dans la citation ? : vrai(>0) ou non(0)).
$in_the_quote=0;
# On parcours tout le fichier par l'intermédiare de FILE.
# A chaque tour de boucle on ne considère qu'une seule ligne ( $_ ).
for (<FILE>) {
# 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!quote-1!) && $in_the_quote!=0 )
{
last;
}
# Somme nous dans la citation ?
# Si index trouve quote1 (!=-1) nous venons de trouver la 1ere citation.
$i=index($_,'quote1');
if ( $i!=-1 )
{
# Changement d'état (dans la citation).
$in_the_quote=1;
}
# 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 )
{
# 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/<br \/>/%%%%%%/g;
s/"/%%%%%%\"/g;
s/&/%%%%%&/g;
s/</%%%</g;
s/>/%%%>/g;
s/œ/%%%%%%Œ/g;
s/ /%%%%% /g;
s/©/%%%%%©/g;
s/ª/%%%%%ª/g;
s/°/%%%%°/g;
s/²/%%%%%²/g;
s/À/%%%%%%%%À/g;
s/Ã/%%%%%%%%à/g;
s/Ç/%%%%%%%%Ç/g;
s/È/%%%%%%%%È/g;
s/É/%%%%%%%%É/g;
s/Ê/%%%%%%%Ê/g;
s/ï/%%%%%%ï/g;
s/&\#039;/%%%%%\'/g;
s/é/%%%%%%%é/g;
s/à/%%%%%%%à/g;
s/â/%%%%%%â/g;
s/ç/%%%%%%%ç/g;
s/è/%%%%%%%è/g;
s/é/%%%%%%%é/g;
s/ê/%%%%%%ê/g;
s/ë/%%%%%ë/g;
s/î/%%%%%%î/g;
s/ô/%%%%%%ô/g;
s/ù/%%%%%%%ù/g;
s/û/%%%%%%û/g;
# Pour conclure on supprime les marqueurs.
s/%+//g;
# On affiche enfin la ligne de citation traitée.
print "$_ \n";
}
}
# On ferme le fichier.
close(TOTO);
Installation :
Les deux fichiers doivent être dans le même dossier ou bon vous semblera.
IMPORTANT :
La commande GET (lwp-request) se trouvre dans la libwww de perl (package perl-libwww-perl-version)
Comme son nom l'indique elle fait un un GET sur une page, cela renvoie le code source de la page.
La grande partie du programme étant du Perl, il y aura surement des dépédances à prendre en compte. Si c'est le cas faites moi savoir lequelles.
Si vous souhaitez l'executer depuis n'importe ou dans votre terminal je vous conseille de rajouter dans votre bashrc : (prendre en compte la ligne déjà existante)
PATH=$PATH:/chemin_de_votre_dossier
La variable d'environnement PATH donne au système les différents dossiers à parcourir pour trouver une commande. (ex: lorsque vous faites fortune tous les dossiers contenus dans PATH seront parcouru pour trouver le fichier correspondant, ou que vous soyez. Pour plus d'infos : echo $PATH ).
Si vous voulez le lancer à l'ouverture d'un terminal ajouter au bashrc :
quote-from-bashfr.sh
Quelques variantes :
quote-from-bashfr.sh -random | cowsay -W 100
#quote.pl garde la dernière quote affichée.
quote.pl | cowsay -f bunny.cow -W 100
Informations supplémentaires :
Sachez que le principe du programme est globalement assez lourd (ou récupère l'intégralité de la source html). La vitesse d'affichage dépend donc obligatoirement de la connection :/.
Si d'autres personnes ont des idées à proposées pour optimiser le programme faites le moi savoir.
Si jamais vous trouvez encore des résidus de format html (ex: , > etc...) faites le moi savoir et donner la référence de la quote (faites une recherche à l'aide des pseudo sur www.bashfr.org)
La source du fichier quote.pl est très commentée n'hésitez pas à y jeter un coup d'œil. 😉