Add built local::lib
[catagits/Gitalist.git] / local-lib5 / lib / perl5 / XML / SAX / PurePerl / XMLDecl.pm
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;