home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2004 December / PCpro_2004_12.ISO / files / webserver / xampp / xampp-perl-addon-1.4.9-installer.exe / XMLDecl.pm < prev    next >
Encoding:
Perl POD Document  |  2002-01-21  |  4.4 KB  |  151 lines

  1. # $Id: XMLDecl.pm,v 1.2 2002/01/21 21:23:55 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.     if ($reader->match_string("<?xml") && $reader->match($S)) {
  12.         $self->skip_whitespace($reader);
  13.         
  14.         # get version attribute
  15.         $self->VersionInfo($reader) || 
  16.             $self->parser_error("XML Declaration lacks required version attribute", $reader);
  17.         
  18.         if (!$self->skip_whitespace($reader)) {
  19.             $reader->match_string('?>') || $self->parser_error("Syntax error", $reader);
  20.             return;
  21.         }
  22.         
  23.         if ($self->EncodingDecl($reader)) {
  24.             if (!$self->skip_whitespace($reader)) {
  25.                 $reader->match_string('?>') || $self->parser_error("Syntax error", $reader);
  26.                 return;
  27.             }
  28.         }
  29.         
  30.         $self->SDDecl($reader);
  31.         
  32.         $self->skip_whitespace($reader);
  33.         
  34.         $reader->match_string('?>') || $self->parser_error("Syntax error in XML declaration", $reader);
  35.         # TODO: Call SAX event (xml_decl?)
  36.         # actually, sax has no xml_decl event.
  37.     }
  38.     else {
  39.         # no xml decl
  40.         if (!$reader->get_encoding) {
  41.             $reader->set_encoding("UTF-8");
  42.         }
  43.     }
  44. }
  45.  
  46. sub VersionInfo {
  47.     my ($self, $reader) = @_;
  48.     
  49.     $reader->match_string('version')
  50.         || return 0;
  51.     $self->skip_whitespace($reader);
  52.     $reader->match('=') || 
  53.         $self->parser_error("Invalid token", $reader);
  54.     $self->skip_whitespace($reader);
  55.     
  56.     # set right quote char
  57.     my $quote = $self->quote($reader);
  58.     
  59.     # get version value
  60.     $reader->consume($VersionNum) || 
  61.         $self->parser_error("Version number contains invalid characters", $reader);
  62.     
  63.     my $vernum = $reader->consumed;
  64.     if ($vernum ne "1.0") {
  65.         $self->parser_error("Only XML version 1.0 supported. Saw: '$vernum'", $reader);
  66.     }
  67.  
  68.     $reader->match($quote) || 
  69.         $self->parser_error("Invalid token while looking for quote character", $reader);
  70.     
  71.     return 1;
  72. }
  73.  
  74. sub SDDecl {
  75.     my ($self, $reader) = @_;
  76.     
  77.     $reader->match_string("standalone") || return 0;
  78.     
  79.     $self->skip_whitespace($reader);
  80.     $reader->match('=') || $self->parser_error(
  81.         "No '=' by standalone declaration", $reader);
  82.     $self->skip_whitespace($reader);
  83.     
  84.     my $quote = $self->quote($reader);
  85.     
  86.     if ($reader->match_string('yes')) {
  87.         $self->{standalone} = 1;
  88.     }
  89.     elsif ($reader->match_string('no')) {
  90.         $self->{standalone} = 0;
  91.     }
  92.     else {
  93.         $self->parser_error("standalone declaration must be 'yes' or 'no'", $reader);
  94.     }
  95.     
  96.     $reader->match($quote) ||
  97.         $self->parser_error("Invalid token in XML declaration", $reader);
  98.     
  99.     return 1;
  100. }
  101.  
  102. sub EncodingDecl {
  103.     my ($self, $reader) = @_;
  104.     
  105.     $reader->match_string('encoding') || return 0;
  106.     
  107.     $self->skip_whitespace($reader);
  108.     $reader->match('=') || $self->parser_error(
  109.         "No '=' by encoding declaration", $reader);
  110.     $self->skip_whitespace($reader);
  111.     
  112.     my $quote = $self->quote($reader);
  113.     
  114.     my $encoding = '';
  115.     $reader->match($EncNameStart) ||
  116.         $self->parser_error("Invalid encoding name", $reader);
  117.     $encoding .= $reader->matched;
  118.     $reader->consume($EncNameEnd);
  119.     $encoding .= $reader->consumed;
  120.     $reader->set_encoding($encoding);
  121.     
  122.     $reader->match($quote) ||
  123.         $self->parser_error("Invalid token in XML declaration", $reader);
  124.     
  125.     return 1;
  126. }
  127.  
  128. sub TextDecl {
  129.     my ($self, $reader) = @_;
  130.     
  131.     $reader->match_string('<?xml')
  132.         || return;
  133.     $self->skip_whitespace($reader) || $self->parser_error("No whitespace after text declaration", $reader);
  134.     
  135.     if ($self->VersionInfo($reader)) {
  136.         $self->skip_whitespace($reader) ||
  137.                 $self->parser_error("Lack of whitespace after version attribute in text declaration", $reader);
  138.     }
  139.     
  140.     $self->EncodingDecl($reader) ||
  141.         $self->parser_error("Encoding declaration missing from external entity text declaration", $reader);
  142.     
  143.     $self->skip_whitespace($reader);
  144.     
  145.     $reader->match_string('?>') || $self->parser_error("Syntax error", $reader);
  146.     
  147.     return 1;
  148. }
  149.  
  150. 1;
  151.