#
# Copyright (C) 1998, 1999 Ken MacLeod
# XML::Handler::CanonXMLWriter is free software; you can redistribute
# it and/or modify it under the same terms as Perl itself.
#
# $Id: CanonXMLWriter.pm,v 1.2 1999/12/22 21:15:00 kmacleod Exp $
#
use strict;
package XML::Handler::CanonXMLWriter;
use vars qw{ $VERSION %char_entities };
# will be substituted by make-rel script
$VERSION = "0.08";
%char_entities = (
"\x09" => ' ',
"\x0a" => '
',
"\x0d" => '
',
'&' => '&',
'<' => '<',
'>' => '>',
'"' => '"',
);
sub new {
my ($class, %args) = @_;
my $self = \%args;
return bless $self, $class;
}
sub start_document {
my $self = shift; my $document = shift;
$self->{'_text_array'} = [];
}
sub end_document {
my $self = shift; my $document = shift;
if (defined $self->{IOHandle}) {
return ();
} else {
my $text = join ('', @{$self->{'_text_array'}});
undef $self->{'_text_array'};
return $text;
}
}
sub start_element {
my $self = shift; my $element = shift;
$self->_print('<' . $element->{Name});
my $key;
my $attrs = $element->{Attributes};
foreach $key (sort keys %$attrs) {
$self->_print(" $key=\"" . $self->_escape($attrs->{$key}) . '"');
}
$self->_print('>');
}
sub end_element {
my $self = shift; my $element = shift;
$self->_print('' . $element->{Name} . '>');
}
sub characters {
my $self = shift; my $characters = shift;
$self->_print($self->_escape($characters->{Data}));
}
sub ignorable_whitespace {
my $self = shift; my $characters = shift;
$self->_print($self->_escape($characters->{Data}));
}
sub processing_instruction {
my $self = shift; my $pi = shift;
$self->_print('' . $pi->{Target} . ' ' . $pi->{Data} . '?>');
}
sub entity {
# entities don't occur in text
return ();
}
sub comment {
my $self = shift; my $comment = shift;
if ($self->{PrintComments}) {
$self->_print('');
} else {
return ();
}
}
sub _print {
my $self = shift; my $string = shift;
if (defined $self->{IOHandle}) {
$self->{IOHandle}->print($string);
return ();
} else {
push @{$self->{'_text_array'}}, $string;
}
}
sub _escape {
my $self = shift; my $string = shift;
$string =~ s/([\x09\x0a\x0d&<>"])/$char_entities{$1}/ge;
return $string;
}
1;
__END__
=head1 NAME
XML::Handler::CanonXMLWriter - output XML in canonical XML format
=head1 SYNOPSIS
use XML::Handler::CanonXMLWriter;
$writer = XML::Handler::CanonXMLWriter OPTIONS;
$parser->parse(Handler => $writer);
=head1 DESCRIPTION
C