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 )