libxml-enno

 view release on metacpan or  search on metacpan

lib/XML/Filter/Reindent.pm  view on Meta::CPAN

			$level : undef;

    $event->{IndentChildren} = $self->indent_children ($event);
}

sub end_element
{
    my ($self, $event) = @_;
    my $start_element = $self->{ParentStack}->[-1];

    if ($start_element->{IndentChildren} == MAYBE)
    {
	my $q = $self->{EventQ};
	my $prev = $q->[-1];

	if ($prev == $start_element)
	{
	    # End tag follows start tag: compress tag
	    $start_element->{Compress} = 1;
	    $event->{Compress} = 1;
#?? could detect if it contains only ignorable_ws
	}
	elsif ($prev->{EventType} eq 'characters')
	{
	    if ($q->[-2] == $start_element)
	    {
		# Element has only one child, a text node.
		# Print element as: <a>text here</a>
		delete $prev->{Indent};
		$start_element->{IndentChildren} = 0;
	    }
	}
    }

    my $level = --$self->{Level};
    $event->{Indent} = $start_element->{IndentChildren} ? $level : undef;

    my $compress = $start_element->{Compress};
    if ($compress)
    {
	$event->{Compress} = $compress;
	delete $event->{Indent};
    }

    $self->SUPER::end_element ($event);
}

sub end_document
{
    my ($self, $event) = @_;

    $self->push_event ('end_document', $event || {});
    $self->flush (0);	# send remaining events
}

sub push_event
{
    my ($self, $type, $event) = @_;

    $event->{EventType} = $type;
    if ($type =~ /^(characters|comment|processing_instruction|entity_reference|cdata)$/)
    {
	my $indent_kids = $self->{ParentStack}->[-1]->{IndentChildren} ? 1 : 0;
	$event->{Indent} =  $indent_kids ? $self->{Level} : undef;
    }

    my $q = $self->{EventQ};
    push @$q, $event;

    $self->flush (4);	# keep 4 events on the stack (maybe 3 is enough)
}

sub flush
{
    my ($self, $keep) = @_;
    my $q = $self->{EventQ};

    while (@$q > $keep)
    {
	my $head = $q->[0];
#	print "head=" . $head->{EventType} . " indent=" . $head->{Indent} . "\n";

	if ($head->{EventType} =~ /ws|ignorable/)
	{
	    my $next = $q->[1];
	    my $indent = $next->{Indent};

	    if (defined $indent)	# fix existing indent
	    {
		$head->{Data} = $self->{Newline} . ($self->{Tab} x $indent);
		$self->send (2);
	    }
	    else		# remove existing indent
	    {
		shift @$q;
		$self->send (1);
	    }
#?? remove keys: Indent, ...
	}
	else
	{
	    my $indent = $head->{Indent};

	    if (defined $indent)	# insert indent
	    {
		unshift @$q, { EventType => 'ws', 
			       Data => $self->{Newline} . ($self->{Tab} x $indent) };
		$self->send (2);
	    }
	    else		# no indent - leave as is
	    {
		$self->send (1);
	    }
	}
    }
}

sub send
{
    my ($self, $i) = @_;
    



( run in 3.007 seconds using v1.01-cache-2.11-cpan-f0ff5d10edf )