use XML::Parser;
use strict;
#
#
package filtreur;
#
# des champs "statiques" car je n'arrive pas
# à accéder aux champs d'une instance depuis les
# fonctions déclarées dans le parseur. ??
# 
# TEXT est un tableau qui contient pour chaque balise recherché le texte correspondant. 
# NAME est le nom des balises à rechercher
# CUM est le buufer dans lequel on cumule le contenu du texte. ( Il n'est pas envoyé
# forcément en une seule fois )
# TT indicateur pour faire le cumul d'une balise à l'autre.
#
my @TEXT  ;
my $NAME  ;
my $NAME  ;
my $CUM   ;
my $TT    ;
#
# Le "constructeur" crée le parseur et l'initialise.
# On peut donc partager le parseur pour tous les fichiers à parser.
# Seul le champ contenant le nom du fichier à parser est dans l'instance.
# 
sub new {
    my ($class,$file) = @_ ;
    $class = ref($class) || $class ;
    my $this = {};
    bless($this, $class);
    $this->{PSAX} = new XML::Parser(Handlers => {Start => \&filtreur::handle_start,
 						 End   => \&filtreur::handle_end,
 						 Char  => \&filtreur::handle_char});
    reset($this);
    return $this;
}
#
# initialise les champs globaux.
# moindre mal ... Ca servira donc aussi à l'utilisateur de la classe
# qui doit appeler cette méthode après chaque fichier différent.
#
sub reset {
    my ($this) = @_ ; 
    $TT = 0;
    $CUM= "";
    @TEXT = ();
    $NAME = "";
    $this->{FILE} ="";
}
#
# configure le nom du fichier à parser.
# 
sub setFile {
    my ($this,$file) = @_ ; 
    $this->{FILE} = $file;
}
#
# configure le nom de la balise à chercher
#
sub setElementName {
    my ($this,$name) = @_ ; 
    $NAME = $name;
}
#
# Appelée par le parseur en début d'élément
#
sub handle_start {
    my ($this,$element) = @_ ;
    if ( $element eq $NAME ) {
	$TT = 1 ;
    }
}
#
# Appelée par le parseur à la fin d'un élément , on écrit tous les characters
# accumulés dans TEXT
#
sub handle_end {
    my ($this,$element) = @_ ;
     if ( $element eq $NAME ) {
	$TT = 0 ;
  	push  @TEXT , $CUM ;
 	$CUM = "" ;
    }
}
#
# Appelée par le parseur sur un noeud text: On cumuler le contenu du nodetext.
#
sub handle_char {
    my ($this,$string) = @_ ;
    if ( $TT == 1 ) {
	$CUM = $CUM . $string ;
    }
}
#
# retourne dans un tableau les textes des balises 
# recherchées.
#
sub getStuffAsArray {
    my ($this) = @_ ;
    return @TEXT;
}
#
# Démarre le parsing 
#
sub process {
    my ($this) = @_ ;
    $this->{PSAX}->parsefile($this->{FILE});
}
1;
