common/tools/raptor/XML/SAX/PurePerl/XMLDecl.pm
changeset 906 5239d4d0bed1
parent 905 9ed73a51c728
child 907 bab81256b297
equal deleted inserted replaced
905:9ed73a51c728 906:5239d4d0bed1
     1 # $Id: XMLDecl.pm,v 1.3 2003/07/30 13:39:22 matt Exp $
       
     2 
       
     3 package XML::SAX::PurePerl;
       
     4 
       
     5 use strict;
       
     6 use XML::SAX::PurePerl::Productions qw($S $VersionNum $EncNameStart $EncNameEnd);
       
     7 
       
     8 sub XMLDecl {
       
     9     my ($self, $reader) = @_;
       
    10     
       
    11     my $data = $reader->data(5);
       
    12     # warn("Looking for xmldecl in: $data");
       
    13     if ($data =~ /^<\?xml$S/o) {
       
    14         $reader->move_along(5);
       
    15         $self->skip_whitespace($reader);
       
    16         
       
    17         # get version attribute
       
    18         $self->VersionInfo($reader) || 
       
    19             $self->parser_error("XML Declaration lacks required version attribute, or version attribute does not match XML specification", $reader);
       
    20         
       
    21         if (!$self->skip_whitespace($reader)) {
       
    22             my $data = $reader->data(2);
       
    23             $data =~ /^\?>/ or $self->parser_error("Syntax error", $reader);
       
    24             $reader->move_along(2);
       
    25             return;
       
    26         }
       
    27         
       
    28         if ($self->EncodingDecl($reader)) {
       
    29             if (!$self->skip_whitespace($reader)) {
       
    30                 my $data = $reader->data(2);
       
    31                 $data =~ /^\?>/ or $self->parser_error("Syntax error", $reader);
       
    32                 $reader->move_along(2);
       
    33                 return;
       
    34             }
       
    35         }
       
    36         
       
    37         $self->SDDecl($reader);
       
    38         
       
    39         $self->skip_whitespace($reader);
       
    40         
       
    41         my $data = $reader->data(2);
       
    42         $data =~ /^\?>/ or $self->parser_error("Syntax error", $reader);
       
    43         $reader->move_along(2);
       
    44     }
       
    45     else {
       
    46         # warn("first 5 bytes: ", join(',', unpack("CCCCC", $data)), "\n");
       
    47         # no xml decl
       
    48         if (!$reader->get_encoding) {
       
    49             $reader->set_encoding("UTF-8");
       
    50         }
       
    51     }
       
    52 }
       
    53 
       
    54 sub VersionInfo {
       
    55     my ($self, $reader) = @_;
       
    56     
       
    57     my $data = $reader->data(11);
       
    58     
       
    59     # warn("Looking for version in $data");
       
    60     
       
    61     $data =~ /^(version$S*=$S*(["'])($VersionNum)\2)/o or return 0;
       
    62     $reader->move_along(length($1));
       
    63     my $vernum = $3;
       
    64     
       
    65     if ($vernum ne "1.0") {
       
    66         $self->parser_error("Only XML version 1.0 supported. Saw: '$vernum'", $reader);
       
    67     }
       
    68 
       
    69     return 1;
       
    70 }
       
    71 
       
    72 sub SDDecl {
       
    73     my ($self, $reader) = @_;
       
    74     
       
    75     my $data = $reader->data(15);
       
    76     
       
    77     $data =~ /^(standalone$S*=$S*(["'])(yes|no)\2)/o or return 0;
       
    78     $reader->move_along(length($1));
       
    79     my $yesno = $3;
       
    80     
       
    81     if ($yesno eq 'yes') {
       
    82         $self->{standalone} = 1;
       
    83     }
       
    84     else {
       
    85         $self->{standalone} = 0;
       
    86     }
       
    87     
       
    88     return 1;
       
    89 }
       
    90 
       
    91 sub EncodingDecl {
       
    92     my ($self, $reader) = @_;
       
    93     
       
    94     my $data = $reader->data(12);
       
    95     
       
    96     $data =~ /^(encoding$S*=$S*(["'])($EncNameStart$EncNameEnd*)\2)/o or return 0;
       
    97     $reader->move_along(length($1));
       
    98     my $encoding = $3;
       
    99     
       
   100     $reader->set_encoding($encoding);
       
   101     
       
   102     return 1;
       
   103 }
       
   104 
       
   105 sub TextDecl {
       
   106     my ($self, $reader) = @_;
       
   107     
       
   108     my $data = $reader->data(6);
       
   109     $data =~ /^<\?xml$S+/ or return;
       
   110     $reader->move_along(5);
       
   111     $self->skip_whitespace($reader);
       
   112     
       
   113     if ($self->VersionInfo($reader)) {
       
   114         $self->skip_whitespace($reader) ||
       
   115                 $self->parser_error("Lack of whitespace after version attribute in text declaration", $reader);
       
   116     }
       
   117     
       
   118     $self->EncodingDecl($reader) ||
       
   119         $self->parser_error("Encoding declaration missing from external entity text declaration", $reader);
       
   120     
       
   121     $self->skip_whitespace($reader);
       
   122     
       
   123     $data = $reader->data(2);
       
   124     $data =~ /^\?>/ or $self->parser_error("Syntax error", $reader);
       
   125     
       
   126     return 1;
       
   127 }
       
   128 
       
   129 1;