my $self = {
obj => $options{'Content'},
stack => [],
+ level => 0,
Handler => $options{'Handler'}
};
bless($self, $class);
my ($self, $data) = @_;
my $obj = $self->{'obj'};
+ ++$self->{'level'};
+
# find the ID, if any
my $id = $data->{'Attributes'}->{'{http://template.sesse.net/}id'};
$id = $id->{'Value'} if (defined($id));
# substitution: see if this element matches anything. if so,
# descend down into the tree.
if (ref($obj) eq 'HASH') {
+ # first of all, see if we have an attribute match.
+ for my $key (keys %$obj) {
+ next unless ($key =~ /^(#?)(.*)\/(.*)$/);
+ my ($idmarker, $name, $attr) = ($1, $2, $3);
+
+ if (($idmarker eq '#' && $id eq $name) ||
+ ($idmarker ne '#' && $data->{'LocalName'} eq $name)) {
+ $data->{'Attributes'}->{$attr} = {
+ Prefix => '',
+ LocalName => $attr,
+ Name => $attr,
+ NamespaceURI => '',
+ Value => $obj->{$key}
+ };
+ }
+ }
+
my $match = undef;
for my $key (keys %$obj) {
if ($key =~ /^#(.*)$/) {
if (defined($match)) {
$self->SUPER::start_element($data);
- # FIXME: we should match on something better than the name. But what?
- push @{$self->{'stack'}}, [ $data->{'Name'}, $obj ];
+ push @{$self->{'stack'}}, [ $self->{'level'}, $obj ];
#
# This is sort of ugly. We special-case replacement by outputting
$self->{'obj'} = XML::TemplateSAX::Buffer->new($match);
return;
}
-
- $self->{'obj'} = $match;
+
+ #
+ # If someone tries to insert a full tree, do it, just like the character
+ # replacement above.
+ #
+ if (ref($match) eq 'XML::TemplateSAX::Buffer') {
+ $match->replay($self);
+ $self->{'obj'} = undef;
+ } elsif (ref($match) eq 'XML::TemplateSAX::Deferred') {
+ $match->parse($self);
+ $self->{'obj'} = undef;
+ } else {
+ $self->{'obj'} = $match;
+ }
return;
}
}
sub end_element {
my ($self, $data) = @_;
-
+
my $stack = $self->{'stack'};
if (scalar @$stack > 0) {
my $top = $stack->[scalar @$stack - 1];
- if ($data->{'Name'} eq $top->[0]) {
+ if ($self->{'level'} == $top->[0]) {
my $obj = $self->{'obj'};
# did we just finish a clone operation?
$self->SUPER::end_element($data);
$self->{'obj'} = $top->[1];
pop @$stack;
+ --$self->{'level'};
return;
}
}
+ --$self->{'level'};
+
return if (!defined($self->{'obj'}));
if (ref($self->{'obj'}) eq 'XML::TemplateSAX::Buffer') {