Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 25/07/2006, à 14:42

tOkeshu

Bashfr dans votre terminal ? [Perl inside]

Boujour à tous,

Vous aimez bashfr ? Vous trouvez ça absolument stupide mais vraiment divertissant voir indispensable tongue.

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 ? tongue et la version française ne vous convient pas hmm ?

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. big_smile


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 hmm.
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. wink
J'espère que certains pourrons m'aider à l'améliorer et si possible ne pas uniquement traiter les citations de bashfr big_smile.

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/&quot;/%%%%%%\"/g;
			s/&amp;/%%%%%&/g;
			s/&lt;/%%%</g;
			s/&gt;/%%%>/g;
			s/&oelig;/%%%%%%Œ/g;
			s/&nbsp;/%%%%% /g;
			s/&copy;/%%%%%©/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;		
						
			# 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 hmm.

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: &nbsp;, &gt; 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. wink

Dernière modification par tOkeshu (Le 25/07/2006, à 17:06)


Pourquoi faire simple quand on peu faire compliqué :
Moi j'aime bien utiliser cygwin dans une session windows émulée sous ubuntu... :P

Hors ligne

#2 Le 25/07/2006, à 14:53

SamheG

Re : Bashfr dans votre terminal ? [Perl inside]

Inutile ... donc INDISPENSABLE big_smile
Merci

Hors ligne

#3 Le 25/07/2006, à 16:24

Smarter

Re : Bashfr dans votre terminal ? [Perl inside]

Si tu avais regarder 30 secondes la page d'accueil tu aurais vu ça tongue

Hors ligne

#4 Le 25/07/2006, à 17:00

tOkeshu

Re : Bashfr dans votre terminal ? [Perl inside]

Oui effectivement je n'avais jamais vu, pourtant j'ai longtemps et souvent traîné sur le site tongue.

Mais dit moi, avec ces fortunes peux tu avoir la citation ayant le plus de voix (top50) ou encore le tout dernier ajout ? Je ne crois pas.
En plus ce script peut déjà servir de base pour récupérer d'autres citations sur d'autres sites moins accessible, non ?
Enfin, lorsqu'on a fini d'installer nos deux pauvres fichiers, il n'y a rien à mettre à jour (seulement si la structure fondamentale du site change) big_smile.

Pour les autres, ceux qui veulent simplement utiliser le fortune de bashfr, sur cette page tout est expliqué.

Mais maintenant que je connais l'existence d'une telle page cela va me permettre d'améliorer mon script au moins pour le random wink.

Dernière modification par tOkeshu (Le 25/07/2006, à 17:07)


Pourquoi faire simple quand on peu faire compliqué :
Moi j'aime bien utiliser cygwin dans une session windows émulée sous ubuntu... :P

Hors ligne

#5 Le 26/07/2006, à 05:45

Shyne

Re : Bashfr dans votre terminal ? [Perl inside]

#1337 (+) 5269/5685 (-)
<Danao> euh, i am french so excuse my langage...
<Krost> ^^
<Krost> I'm American so excuse my president.

lol

Hors ligne

#6 Le 26/07/2006, à 07:54

iuchiban

Re : Bashfr dans votre terminal ? [Perl inside]

lol:lol::lol:


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#7 Le 27/07/2006, à 00:58

109

Re : Bashfr dans votre terminal ? [Perl inside]

Ah, merci pour ce message qui m'a bien fait rerire à relire bashfr big_smile

* karmAkoma has joined #aeria
<titanius--> Clem!
<titanius--> ca va?
<karmAkoma> un peu perturbé
<karmAkoma> je viens de retrouver mon chat dans le grenier
<titanius--> cool^^
<33fran> ca faisait combien de temps que tu l'avais perdu?
<karmAkoma> 9 ans
<titanius--> ...


Lorsque vous avez la solution, n'oubliez pas de passer votre sujet en [Résolu]
Dernier blogbutiement : Brad Sucks sur Jamendo !

Hors ligne

#8 Le 31/07/2006, à 17:44

Bloodshed

Re : Bashfr dans votre terminal ? [Perl inside]

Salut, y'a aussi le flux RSS de BashFR que tu peux traiter avec :
http://search.cpan.org/dist/XML-RSS/

le flux : http://www.bashfr.org/quotes.xml

ca sera moins lourd et sûr de pas changer (contrairement à la page HTML).

Bonne soirée.


-- Le vampire au visage marmoréen et à la chevelure flamboyante.

Hors ligne

#9 Le 02/08/2006, à 22:52

tOkeshu

Re : Bashfr dans votre terminal ? [Perl inside]

Voili voilou, je reviens avec une nouvelle version de mon petit programme big_smile :

Améliorations :

Amélioration majeure, le programme n'est plus constitué que d'un seul fichier. En effet, la raison principale pour laquelle il était scindé en 2 parties était que je ne savais pas comment récupérer le contenu html directement dans perl.
J'utilisais donc un shell-script, est faisais tout passer dans un fichier (très lourd tout ça).
Mais maintenant, c'est réglé, je passe directement par une variable, et la transforme en tableau.
Je pense donc que cette optimisation majeure rend plus rapide le processus. Néanmoins cela est toujours un petit peu lent hmm.

Toujours dans le registre des améliorations nous avons :

-Affichage du numéro de citation
-Possibilité de sélectionner les citations au delà de la première qui est contenue dans la page. (très utile pour un -latest ou un -top50).
-Sélection d'une quote en particulier parmi toutes celles existantes.

Lancement du programme :

Comme dis plus haut, maintenant, pour lancer le programme il suffit juste de lancer quote.pl
Concernant les arguments, nous avons :

-latest | -random | -top50 (même comportement qu'avant)
-quote x (avec x>0) Permet de sélectionner une quote en particulier parmi toutes celles existantes.
-n x (avec x>0) sélectionne la citation x dans la page. (à combiner avec -latest | -random | -top50 ).


Code source :

#!/usr/bin/env perl

       #*********************************************#
       #              quote-from-bashfr              #
       #              écrit par tOkeshu              #
       #                02 août. 2006                #
       #                                             #
       #                 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 5 arguments 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				           #
#                                                             #
# -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;

# 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" )
{
	$choix=substr ($ARGV[0],1,7);
	$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=random";
	
}

# 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;
			print "Quote n°$1\n\n";
			# 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 \/>/%%%%%\n/g;						
			# Pour conclure on supprime les marqueurs.
			s/%+//g;
			# On affiche enfin la ligne de citation traitée.
			print "$_ \n";
	}
}

J'attends de ceux qui l'utilisent ou ceux qui veulent le tester des retours constructifs (si possible wink).
Si par ailleurs vous avez une petite idée d'amélioration n'hésitez pas !

Pour info je prévois une petite update, j'espère que je pourrais la réaliser smile.


Pourquoi faire simple quand on peu faire compliqué :
Moi j'aime bien utiliser cygwin dans une session windows émulée sous ubuntu... :P

Hors ligne

#10 Le 03/08/2006, à 07:16

Bloodshed

Re : Bashfr dans votre terminal ? [Perl inside]

Salut ;

C'est très bien, pour mes suggestions :
- Utiliser le flux RSS plutôt que la page HTML serait un gain de temps au niveau d'exécution et une assurance de pérennité.
- Insérer une page de manuel (tout programme console se doit d'en avoir une ! wink)
http://larkine.developpez.com/cours/unix/manpage/
- Créer un programme d'installation .deb pour les nouveaux qui voudraient profiter de ce programme, et pourquoi pas un frontend GTK+ quand le programme sera plus évolué (pas sûr que ce soit nécessaire, car là, autant ouvrir son browser).


-- Le vampire au visage marmoréen et à la chevelure flamboyante.

Hors ligne

#11 Le 30/11/2006, à 19:24

iuchiban

Re : Bashfr dans votre terminal ? [Perl inside]

Allez, on déterre un post pas si vieux que ça.
Ben je viens de tester le quotes.pl en l'intégrant à ma console :

- ouvrir une console
- gedit quotes.pl
- copier coller le code du script
- Ctrl + S
- Alt + F4
- gedit /home/NomDeLUtilisateur/.bashrc
- ajouter "perl quotes.pl -random" à la fin

A chaque ouverture de console vous aurez une citation de bash.

Mes impressions :
- ça marche
- j'ai des lignes sautées  entre chaque ligne de citation -> pas top
- est il possible d'avoir un random >0 pour avoir que les citations qui sont bien?

En tous cas, bravo.


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#12 Le 30/11/2006, à 19:43

iuchiban

Re : Bashfr dans votre terminal ? [Perl inside]

Bon ben en fait c'était plutôt simple à changer.

#!/usr/bin/env perl

       #*********************************************#
       #              quote-from-bashfr              #
       #              écrit par tOkeshu              #
       #                02 août. 2006                #
       #                                             #
       #                 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;

# 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;
            print "\nQuote n°$1\n\n";
            # 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 \/>/%%%%%\n/g;                        
            # Pour conclure on supprime les marqueurs.
            s/%+//g;
            # On affiche enfin la ligne de citation traitée.
            print "$_ ";
    }
}
print "\n";

Ce que j'ai changé :
- possibilité d'avoir une quote au hasard parmi celles notées positivement (-random2)
- ajout d'une ligne vide avant le numéro de quote
- suppression des lignes entre les quotes
- ajout d'une ligne vide après les quotes pour un soucis de lisibilité

Ce qui donne par exemple :

alban@nightprowler:~$ perl quotes.pl -random2

Quote n°780

<spacie> ok je te le mets n'importe où ?
<Corsac> dtc
<spacie> Unknown directory
<Corsac> d\t\c\
<spacie> Unknown directum

alban@nightprowler:~$


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#13 Le 01/12/2006, à 19:54

rahancrao

Re : Bashfr dans votre terminal ? [Perl inside]

Le script de tOkeshu tourne à partir de mon .bashrc depuis hier.
Depuis je passe mon temps à ressourcer mon profile en rigolant comme un âne big_smile

Faudra que j'essaye le tiens iuchiban.


Ingé en préprod Unix : forcément sous GNU/Linux à la maison (Ubuntu 10.10 + ArchLinux tout neuf)

Hors ligne

#14 Le 01/12/2006, à 21:55

iuchiban

Re : Bashfr dans votre terminal ? [Perl inside]

Ben en fait, c'est le script de tokeshu que j'ai remanié pour qu'il corresponde mieux à mes attentes.
Donc tu peux maintenant choisir une quote au hasard parmi celles notées positivement (ça évite les gros boulets) en utilisant -random2 comme option.


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#15 Le 01/12/2006, à 22:58

rahancrao

Re : Bashfr dans votre terminal ? [Perl inside]

Je note.

Et je dis : autant d'ingéniosité pour un truc aussi débile, ca vaut le coup. Merci à tous les deux.

Dernière modification par rahancrao (Le 01/12/2006, à 23:04)


Ingé en préprod Unix : forcément sous GNU/Linux à la maison (Ubuntu 10.10 + ArchLinux tout neuf)

Hors ligne

#16 Le 02/12/2006, à 22:10

herlock

Re : Bashfr dans votre terminal ? [Perl inside]

Personnellement je me suis fait un script en python :

Il vous faut d'abord télécharger http://www.bashfr.org/bashfr_fortunes et ensuite le renommer en quotes.txt

#!/usr/bin/python
import random

quote = open("/home/herlock/prog/quotes/quotes.txt").read()
# creation d'une liste
lst = quote.split('%')
# melange de la liste
random.shuffle(lst)
# affichage du premier element
print lst[0]

Après cela vous ajouté à la fin de votre fichier .bashrc

PATH=$PATH:/home/herlock/prog/quotes
quote.py

Changez les path et le tour est joué.

#17 Le 03/12/2006, à 01:37

tOkeshu

Re : Bashfr dans votre terminal ? [Perl inside]

Ohhh, Quelle belle surprise !

Je suis content que certaines personnes utilisent ce script. Surtout quand elles contribuent à l'amélioration de celui-ci wink  !

Pouvoir sélectionner des quotes bien notées, ça c'est ce que j'appelle une bonne idée !

C'est dommage que je n'ai pas mis le nez dans ce bout de code depuis longtemps, mais peut-être que je vais m'y remettre !

Donc résumons notre affaire :

Ce script prépare et traite les citations du site Bashfr.org
Il accepte 5 arguments possible :
-latest | -random | -random2 | -top50
Ils correspondent aux 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 4 premiers:
Il permet de sélectionner une quote parmi les 3 différentes
pages énoncées. (ex: -latest -n 2 )

Le choix par défaut est random2.

Je te remercie donc iuchiban pour cette heureuse contribution.

Maintenant concernant herlock, dis moi si je me trompe mais je pense que ton script est inutile !
Pourquoi ? et bien nous avons déjà parlé des fortunes de bashfr dans ce topic (voir plus haut) et avec les fortunes tu peux justement sélectionner une quote au hasard !
Ton script fait donc la même choses que les fortunes.

De plus ce script donne bien plus de possibilités qu'un simple fichier fortunes : pas besoin d'actualisation régulière, il est adapté aux fonctionnalités du site bashfr.
C'est vrai ces fonctions ont un prix et des limites : besoin de se connecter à internet, processus lent.
Maintenant ce que l'on peut envisager, c'est une simple mise à jour d'un fichier fortune par le Perl.
ça permettrais sûrement d'accélérer le processus...
De plus il reste encore à faire une page man. Ce qui me donne encore du boulot smile.

Merci encore à tous ceux qui s'intéressent à ce script. Et... vive Bashfr.


Pourquoi faire simple quand on peu faire compliqué :
Moi j'aime bien utiliser cygwin dans une session windows émulée sous ubuntu... :P

Hors ligne

#18 Le 22/12/2006, à 11:39

Asumbaa

Re : Bashfr dans votre terminal ? [Perl inside]

Salut,

J'ai un souci avec les quotes affichées dans la console, les accents sont pas dans le bon encodage... Vous sauriez d'où ça vient ?


Asumbaa
Ubuntera depuis avril 2006

Hors ligne

#19 Le 26/08/2007, à 22:04

lepirlouit

Re : Bashfr dans votre terminal ? [Perl inside]

j'utilise ton code sur mon serveur,

des fois, en lisant la quote, j'oublie ce que j'étais venu faire

Hors ligne

#20 Le 14/01/2008, à 20:28

Skippy le Grand Gourou

Re : Bashfr dans votre terminal ? [Perl inside]

tOkeshu a écrit :

Si par ailleurs vous avez une petite idée d'amélioration n'hésitez pas !

lynx --dump --display_charset=utf8 http://www.bashfr.org/?sort=random2 | awk '$1~"#" && $0!~"RSS" { getline; while ($1!~"#") { print $0; getline;}; exit}'

wink

Hors ligne

#21 Le 06/02/2008, à 19:26

shyne69

Re : Bashfr dans votre terminal ? [Perl inside]

Skippy le Grand Gourou a écrit :
lynx --dump --display_charset=utf8 http://www.bashfr.org/?sort=random2 | awk '$1~"#" && $0!~"RSS" { getline; while ($1!~"#") { print $0; getline;}; exit}'

wink

Merci pour l'astuce smile

#22 Le 07/02/2008, à 10:17

iuchiban

Re : Bashfr dans votre terminal ? [Perl inside]

C'est là  qu'on voit la puissance de GNU/Linux et de Skippy le Grand Gourou : réaliser en 1 ligne un script (fort bien fait d'ailleurs) de 50 lignes (grosso modo tongue).

Y'a des gens qui ont essayé la même chose sous Windows??


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#23 Le 09/02/2008, à 02:23

herberts

Re : Bashfr dans votre terminal ? [Perl inside]

Génial big_smile ! pour info, j'ai juste recopié la ligne de skippy à  la fin de mon .bashrc (après l'avoir testé en console quand même, au moins histoire de vérifier les dépendances),
suivi de

echo - - - - - - - - - - - - - - - -

à  la ligne en dessous, pour faire une séparation avec mon prompt.

Un grand merci en tout cas.

Hors ligne

#24 Le 09/02/2008, à 15:32

k-o-x

Re : Bashfr dans votre terminal ? [Perl inside]

Moi je préfère le faire suivre de | cowsay

smile

Hors ligne

#25 Le 01/07/2008, à 12:59

redisded

Re : Bashfr dans votre terminal ? [Perl inside]

Skippy le Grand Gourou a écrit :
tOkeshu a écrit :

Si par ailleurs vous avez une petite idée d'amélioration n'hésitez pas !

lynx --dump --display_charset=utf8 http://www.bashfr.org/?sort=random2 | awk '$1~"#" && $0!~"RSS" { getline; while ($1!~"#") { print $0; getline;}; exit}'

wink

o_O !!!

Total respect skippy le grand gourou ! wink

je suis en train d'écrire, pour m'entrainer au bash, un petit script qui permet, entre autre, d'afficher les nouvelles quotes ou une quote aléatoire dans une notification zenity. Il me fallait 4 lignes pour en arriver au meme résultat (et encore ta ligne renvoi la quote avec un meilleur agencement roll ).
Je m'en vais donc effrontément copier cette ligne dans mon script wink.
Un grand merci à toi pour ce tour de force !

p.s : serait-ce trop te demander d'expliquer un peu la partie awk parce que j'essai de commencer à m'en servir donc j'aimerais bien comprendre ce qui se passe exactement dans ta commande mais meme avec le man et google je galère pour dechiffrer wink

Hors ligne