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; |