Data-Stag

 view release on metacpan or  search on metacpan

Data/Stag/BaseHandler.pm  view on Meta::CPAN

    return @R;
}
sub E {shift->end_event(@_)}
sub e {shift->end_event(@_)}


sub popnode {
    my $self = shift;
    my $node = $self->{node};
    my $topnode = pop @$node;
    return $topnode;
}

sub event {
    my $self = shift;
    my $ev = shift;
    my $st = shift;
    $self->start_event($ev);
    if (ref($st)) {
        if (ref($st) ne "ARRAY") {confess($st)}
	foreach (@$st) { 
	    confess("$ev $st $_") unless ref($_);
	    $self->event(@$_) 
	}
    }
    else {
	$self->evbody($st);
    }
    $self->end_event($ev);
}
*ev = \&event;


sub print {
    my $self = shift;
    print "@_";
}

sub printf {
    my $self = shift;
    printf @_;
}


sub start_element {
    my ($self, $element) = @_;

    my $name = $element->{Name};
    my $atts = $element->{Attributes};

    if (!$self->{sax_stack}) {
	$self->{sax_stack} = [];
    }
    push(@{$self->{sax_stack}}, $name);
    push(@{$self->{is_nonterminal_stack}}, 0);
    if (@{$self->{is_nonterminal_stack}} > 1) {
	$self->{is_nonterminal_stack}->[-2] = 1;
    }

    # check if we need an event
    # for any preceeding pcdata
    my $str = $self->{__str};
    if (defined $str) {
	# mixed attribute text - use element '.'
        $str =~ s/^\s*//;
        $str =~ s/\s*$//;
	if ($str) {
	    $self->event(".", $str) if $str;
	}
	$self->{__str} = undef;
    }

    $self->start_event($name);
    if ($atts && %$atts) {
	# treat atts same way as SXML
	$self->start_event('@');
	foreach my $k (keys %$atts) {
	    $self->event("$k", $atts->{$k});
	    $self->{is_nonterminal_stack}->[-1] = 1;
	}
	$self->end_event('@');
    }
    return $element;
}

sub characters {
    my ($self, $characters) = @_;
    my $char = $characters->{Data};
    if (defined $char) {
        $self->{__str} = "" unless defined $self->{__str};
        $self->{__str} .= $char;
    }
    return;
}

sub end_element {
    my ($self, $element) = @_;
    my $name = $element->{Name};
    my $str = $self->{__str};
    my $parent = pop(@{$self->{sax_stack}});
    my $is_nt = pop(@{$self->{is_nonterminal_stack}});
    if (defined $str) {
        $str =~ s/^\s*//;
        $str =~ s/\s*$//;
	if ($str || $str eq '0') {
	    if ($is_nt) {
		$self->event('.' =>
			     $str);
			     
	    }
	    else {
		$self->evbody($str);
	    }
	}
    }
    $self->end_event($name);
    $self->{__str} = undef;
#    $self->{Handler}->end_element($element);
}

sub start_document {



( run in 0.532 second using v1.01-cache-2.11-cpan-6aa56a78535 )