| 1 | 
package Message::DOM::ProcessingInstruction; | 
| 2 | 
use strict; | 
| 3 | 
our $VERSION=do{my @r=(q$Revision: 1.8 $=~/\d+/g);sprintf "%d."."%02d" x $#r,@r}; | 
| 4 | 
push our @ISA, 'Message::DOM::Node', 'Message::IF::ProcessingInstruction'; | 
| 5 | 
require Message::DOM::Node; | 
| 6 | 
 | 
| 7 | 
sub ____new ($$$$) { | 
| 8 | 
  my $self = shift->SUPER::____new (shift); | 
| 9 | 
  ($$self->{target}, $$self->{data}) = @_; | 
| 10 | 
  return $self; | 
| 11 | 
} # ____new | 
| 12 | 
              | 
| 13 | 
sub AUTOLOAD { | 
| 14 | 
  my $method_name = our $AUTOLOAD; | 
| 15 | 
  $method_name =~ s/.*:://; | 
| 16 | 
  return if $method_name eq 'DESTROY'; | 
| 17 | 
 | 
| 18 | 
  if ({ | 
| 19 | 
    ## Read-only attributes (trivial accessors) | 
| 20 | 
    target => 1, | 
| 21 | 
  }->{$method_name}) { | 
| 22 | 
    no strict 'refs'; | 
| 23 | 
    eval qq{ | 
| 24 | 
      sub $method_name (\$) { | 
| 25 | 
        if (\@_ > 1) { | 
| 26 | 
          require Carp; | 
| 27 | 
          Carp::croak (qq<Can't modify read-only attribute>); | 
| 28 | 
        } | 
| 29 | 
        return \${\$_[0]}->{$method_name};  | 
| 30 | 
      } | 
| 31 | 
    }; | 
| 32 | 
    goto &{ $AUTOLOAD }; | 
| 33 | 
  } elsif ({ | 
| 34 | 
    ## Read-write attributes (DOMString, trivial accessors) | 
| 35 | 
    manakai_base_uri => 1, | 
| 36 | 
    data => 1, | 
| 37 | 
  }->{$method_name}) { | 
| 38 | 
    no strict 'refs'; | 
| 39 | 
    eval qq{ | 
| 40 | 
      sub $method_name (\$;\$) { | 
| 41 | 
        if (\@_ > 1) { | 
| 42 | 
          if (\${\${\$_[0]}->{owner_document}}->{strict_error_checking} and | 
| 43 | 
              \${\$_[0]}->{manakai_read_only}) { | 
| 44 | 
            report Message::DOM::DOMException | 
| 45 | 
                -object => \$_[0], | 
| 46 | 
                -type => 'NO_MODIFICATION_ALLOWED_ERR', | 
| 47 | 
                -subtype => 'READ_ONLY_NODE_ERR'; | 
| 48 | 
          } | 
| 49 | 
          if (defined \$_[1]) { | 
| 50 | 
            \${\$_[0]}->{$method_name} = ''.\$_[1]; | 
| 51 | 
          } else { | 
| 52 | 
            delete \${\$_[0]}->{$method_name}; | 
| 53 | 
          } | 
| 54 | 
        } | 
| 55 | 
        return \${\$_[0]}->{$method_name}; | 
| 56 | 
      } | 
| 57 | 
    }; | 
| 58 | 
    goto &{ $AUTOLOAD }; | 
| 59 | 
  } else { | 
| 60 | 
    require Carp; | 
| 61 | 
    Carp::croak (qq<Can't locate method "$AUTOLOAD">); | 
| 62 | 
  } | 
| 63 | 
} # AUTOLOAD | 
| 64 | 
 | 
| 65 | 
## |Node| attributes | 
| 66 | 
 | 
| 67 | 
sub base_uri ($) { | 
| 68 | 
  my $self = $_[0]; | 
| 69 | 
  return $$self->{manakai_base_uri} if defined $$self->{manakai_base_uri}; | 
| 70 | 
   | 
| 71 | 
  local $Error::Depth = $Error::Depth + 1; | 
| 72 | 
  my $node = $$self->{parent_node}; | 
| 73 | 
  while (defined $node) { | 
| 74 | 
    my $nt = $node->node_type; | 
| 75 | 
    if ($nt == 1 or $nt == 6 or $nt == 9 or $nt == 10 or $nt == 11) { | 
| 76 | 
      ## Element, Entity, Document, DocumentType, or DocumentFragment | 
| 77 | 
      return $node->base_uri; | 
| 78 | 
    } elsif ($nt == 5) { | 
| 79 | 
      ## EntityReference | 
| 80 | 
      return $node->manakai_entity_base_uri if $node->manakai_external; | 
| 81 | 
    } | 
| 82 | 
    $node = $$node->{parent_node}; | 
| 83 | 
  } | 
| 84 | 
  return $node->base_uri if $node; | 
| 85 | 
  return $self->owner_document->base_uri; | 
| 86 | 
} # base_uri | 
| 87 | 
 | 
| 88 | 
sub child_nodes ($) { | 
| 89 | 
  require Message::DOM::NodeList; | 
| 90 | 
  return bless \\($_[0]), 'Message::DOM::NodeList::EmptyNodeList'; | 
| 91 | 
} # child_nodes | 
| 92 | 
 | 
| 93 | 
*node_name = \⌖ | 
| 94 | 
 | 
| 95 | 
sub node_type () { 7 } # PROCESSING_INSTRUCTION_NODE | 
| 96 | 
 | 
| 97 | 
*node_value = \&data; | 
| 98 | 
 | 
| 99 | 
*text_content = \&node_value; | 
| 100 | 
 | 
| 101 | 
## |Node| methods | 
| 102 | 
 | 
| 103 | 
sub append_child ($$) { | 
| 104 | 
  report Message::DOM::DOMException | 
| 105 | 
      -object => $_[0], | 
| 106 | 
      -type => 'HIERARCHY_REQUEST_ERR', | 
| 107 | 
      -subtype => 'CHILD_NODE_TYPE_ERR'; | 
| 108 | 
} # append_child | 
| 109 | 
 | 
| 110 | 
sub manakai_append_text ($$) { | 
| 111 | 
  ## NOTE: Same as |CharacterData|'s. | 
| 112 | 
  if (${${$_[0]}->{owner_document}}->{strict_error_checking} and | 
| 113 | 
      ${$_[0]}->{manakai_read_only}) { | 
| 114 | 
    report Message::DOM::DOMException | 
| 115 | 
        -object => $_[0], | 
| 116 | 
        -type => 'NO_MODIFICATION_ALLOWED_ERR', | 
| 117 | 
        -subtype => 'READ_ONLY_NODE_ERR'; | 
| 118 | 
  } | 
| 119 | 
  ${$_[0]}->{data} .= ref $_[1] eq 'SCALAR' ? ${$_[1]} : $_[1]; | 
| 120 | 
} # manakai_append_text | 
| 121 | 
 | 
| 122 | 
sub insert_before ($;$) { | 
| 123 | 
  report Message::DOM::DOMException | 
| 124 | 
      -object => $_[0], | 
| 125 | 
      -type => 'HIERARCHY_REQUEST_ERR', | 
| 126 | 
      -subtype => 'CHILD_NODE_TYPE_ERR'; | 
| 127 | 
} # insert_before | 
| 128 | 
 | 
| 129 | 
sub replace_child ($$) { | 
| 130 | 
  report Message::DOM::DOMException | 
| 131 | 
      -object => $_[0], | 
| 132 | 
      -type => 'HIERARCHY_REQUEST_ERR', | 
| 133 | 
      -subtype => 'CHILD_NODE_TYPE_ERR'; | 
| 134 | 
} # replace_child | 
| 135 | 
 | 
| 136 | 
## |ProcessingInstruction| attributes | 
| 137 | 
 | 
| 138 | 
sub manakai_base_uri ($;$); | 
| 139 | 
 | 
| 140 | 
sub data ($;$); | 
| 141 | 
 | 
| 142 | 
sub target ($); | 
| 143 | 
 | 
| 144 | 
package Message::IF::ProcessingInstruction; | 
| 145 | 
 | 
| 146 | 
package Message::DOM::Document; | 
| 147 | 
 | 
| 148 | 
sub create_processing_instruction ($$$) { | 
| 149 | 
  if (${$_[0]}->{strict_error_checking}) { | 
| 150 | 
    my $xv = $_[0]->xml_version; | 
| 151 | 
    if (defined $xv) { | 
| 152 | 
      if ($xv eq '1.0' and | 
| 153 | 
          $_[1] =~ /\A\p{InXML_NameStartChar10}\p{InXMLNameChar10}*\z/) { | 
| 154 | 
        # | 
| 155 | 
      } elsif ($xv eq '1.1' and | 
| 156 | 
               $_[1] =~ /\A\p{InXMLNameStartChar11}\p{InXMLNameChar11}*\z/) { | 
| 157 | 
        # | 
| 158 | 
      } else { | 
| 159 | 
        report Message::DOM::DOMException | 
| 160 | 
            -object => $_[0], | 
| 161 | 
            -type => 'INVALID_CHARACTER_ERR', | 
| 162 | 
            -subtype => 'MALFORMED_NAME_ERR'; | 
| 163 | 
      } | 
| 164 | 
    } | 
| 165 | 
  } | 
| 166 | 
 | 
| 167 | 
  return Message::DOM::ProcessingInstruction->____new (@_[0, 1, 2]); | 
| 168 | 
} # create_processing_instruction | 
| 169 | 
 | 
| 170 | 
=head1 LICENSE | 
| 171 | 
 | 
| 172 | 
Copyright 2007 Wakaba <w@suika.fam.cx> | 
| 173 | 
 | 
| 174 | 
This program is free software; you can redistribute it and/or | 
| 175 | 
modify it under the same terms as Perl itself. | 
| 176 | 
 | 
| 177 | 
=cut | 
| 178 | 
 | 
| 179 | 
1; | 
| 180 | 
## $Date: 2007/07/08 05:42:37 $ |