common/tools/raptor/RaptorSAXHandler.pm
changeset 227 51e429810aba
parent 180 1d9c60a4e308
equal deleted inserted replaced
226:c451bd0c0782 227:51e429810aba
    20     my ($type) = @_;
    20     my ($type) = @_;
    21     
    21     
    22     return bless {}, $type;
    22     return bless {}, $type;
    23 }
    23 }
    24 
    24 
    25 sub set_init_status
    25 sub add_observer
    26 {
    26 {
    27 	my ($self, $initialstatus) = @_;
    27 	my ($self, $name, $initialstatus) = @_;
    28 	
    28 	
    29 	$self->{status} = $initialstatus;
    29 	$self->{observers} = {} if (!defined $self->{observers});
       
    30 	
       
    31 	$self->{observers}->{$name} = $initialstatus;
    30 }
    32 }
    31 
    33 
    32 sub start_document
    34 sub start_document
    33 {
    35 {
    34 	my ($self, $doc) = @_;
    36 	my ($self, $doc) = @_;
    44 	
    46 	
    45 	my $tagname = $el->{LocalName};
    47 	my $tagname = $el->{LocalName};
    46 	
    48 	
    47 	#print "start_element($tagname)\n";
    49 	#print "start_element($tagname)\n";
    48 	
    50 	
    49 	
    51 	for my $observer (keys %{$self->{observers}})
    50 	if (defined $self->{status}->{next_status}->{$tagname})
       
    51 	{
    52 	{
    52 		my $oldstatus = $self->{status};
    53 		#print "processing observer $observer: $self->{observers}->{$observer} $self->{observers}->{$observer}->{name}\n";
    53 		$self->{status} = $self->{status}->{next_status}->{$tagname};
    54 		#for (keys %{$self->{observers}->{$observer}->{next_status}}) {print "$_\n";}
    54 		#print "status is now $self->{status}->{name}\n";
    55 		
    55 		$self->{status}->{next_status}->{$tagname} = $oldstatus;
    56 		if (defined $self->{observers}->{$observer}->{next_status}->{$tagname})
    56 		&{$self->{status}->{on_start}}($el) if (defined $self->{status}->{on_start});
    57 		{
    57 	}
    58 			#print "processing observer $observer\n";
    58 	elsif (defined $self->{status}->{next_status}->{'?default?'})
    59 			my $oldstatus = $self->{observers}->{$observer};
    59 	{
    60 			$self->{observers}->{$observer} = $self->{observers}->{$observer}->{next_status}->{$tagname};
    60 		#print "changing to default status\n";
    61 			#print "$observer: status is now $self->{observers}->{$observer}->{name}\n";
    61 		my $oldstatus = $self->{status};
    62 			$self->{observers}->{$observer}->{next_status}->{$tagname} = $oldstatus;
    62 		$self->{status} = $self->{status}->{next_status}->{'?default?'};
    63 			&{$self->{observers}->{$observer}->{on_start}}($el) if (defined $self->{observers}->{$observer}->{on_start});
    63 		#print "status is now ?default?\n";
    64 		}
    64 		$self->{status}->{next_status}->{$tagname} = $oldstatus;
    65 		elsif (defined $self->{observers}->{$observer}->{next_status}->{'?default?'})
    65 		&{$self->{status}->{on_start}}($el) if (defined $self->{status}->{on_start});
    66 		{
       
    67 			#print "processing observer $observer\n";
       
    68 			#print "changing to default status\n";
       
    69 			my $oldstatus = $self->{observers}->{$observer};
       
    70 			$self->{observers}->{$observer} = $self->{observers}->{$observer}->{next_status}->{'?default?'};
       
    71 			#print "status is now ?default?\n";
       
    72 			$self->{observers}->{$observer}->{next_status}->{$tagname} = $oldstatus;
       
    73 			&{$self->{observers}->{$observer}->{on_start}}($el) if (defined $self->{observers}->{$observer}->{on_start});
       
    74 		}
    66 	}
    75 	}
    67 }
    76 }
    68 
    77 
    69 sub end_element
    78 sub end_element
    70 {
    79 {
    73 	
    82 	
    74 	my $tagname = $el->{LocalName};
    83 	my $tagname = $el->{LocalName};
    75 	
    84 	
    76 	#print "end_element($tagname)\n";
    85 	#print "end_element($tagname)\n";
    77 	
    86 	
    78 	if (defined $self->{status}->{next_status}->{$tagname})
    87 	for my $observer (keys %{$self->{observers}})
    79 	{
    88 	{
    80 		&{$self->{status}->{on_end}}($el) if (defined $self->{status}->{on_end});
    89 		if (defined $self->{observers}->{$observer}->{next_status}->{$tagname})
    81 		$self->{status} = $self->{status}->{next_status}->{$tagname};
    90 		{
    82 		#print "status is now $self->{status}->{name}\n";
    91 			&{$self->{observers}->{$observer}->{on_end}}($el) if (defined $self->{observers}->{$observer}->{on_end});
       
    92 			$self->{observers}->{$observer} = $self->{observers}->{$observer}->{next_status}->{$tagname};
       
    93 			#print "status is now $self->{observers}->{$observer}->{name}\n";
       
    94 		}
    83 	}
    95 	}
    84 }
    96 }
    85 
    97 
    86 sub characters
    98 sub characters
    87 {
    99 {
    88 	my ($self, $ch) = @_;
   100 	my ($self, $ch) = @_;
    89 	
   101 	
    90 	&{$self->{status}->{on_chars}}($ch) if (defined $self->{status}->{on_chars});
   102 	for my $observer (keys %{$self->{observers}})
       
   103 	{
       
   104 		&{$self->{observers}->{$observer}->{on_chars}}($ch) if (defined $self->{observers}->{$observer}->{on_chars});
       
   105 	}
    91 }
   106 }
    92 
   107 
    93 1;
   108 1;