XML-DTD
view release on metacpan or search on metacpan
lib/XML/DTD/Entity.pm view on Meta::CPAN
return $self;
}
# Return the entity name
sub name {
my $self = shift;
return $self->{'NAME'};
}
# Is the object a parameter entity
sub isparam {
my $self = shift;
return $self->{'PARAM'};
}
# Is the object an external entity
sub isextern {
my $self = shift;
return $self->{'EXTERNAL'};
}
# Return the entity value
sub value {
my $self = shift;
return $self->{'ENTITYDEF'};
}
# Return the URI containing the entity
sub uri {
my $self = shift;
return $self->{'URI'};
}
# Write an XML representation
sub writexml {
my $self = shift;
my $xmlw = shift;
my $name = $self->{'NAME'};
my $type = ($self->isparam)?'param':'gen';
my $tstr = ($self->isparam)?$self->{'WS0'}.'%':undef;
my $ltws = ($self->isparam)?$self->{'WS1'}:$self->{'WS0'};
$xmlw->open('entity', {'name' => $name, 'type' => $type, 'tstr' => $tstr,
'ltws' => $ltws, 'rtws' => $self->{'WSRT'}});
if ($self->isextern) {
$xmlw->open('external', {'ltws' => $self->{'WS2'}});
if (defined $self->{'PUBLIC'}) {
$xmlw->open('public', {'qchar' => $self->{'QCPUB'},
'ltws' => $self->{'WSPUB'}});
$xmlw->pcdata($self->{'PUBLIC'});
$xmlw->close;
}
$xmlw->open('system', {'qchar' => $self->{'QCSYS'},
'ltws' => $self->{'WSSYS'}});
$xmlw->pcdata($self->{'SYSTEM'});
$xmlw->close;
$xmlw->close;
} else {
$xmlw->open('internal', {'qchar' => $self->{'QUOTECHAR'},
'ltws' => $self->{'WS2'}});
$xmlw->pcdata($self->value);
$xmlw->close;
}
$xmlw->close;
}
# Parse the entity declaration
sub _parse {
my $self = shift;
my $entdcl = shift;
if ($entdcl =~ /<\!ENTITY(\s+)(%?)(\s*)([\w\.:\-_]+)(\s+)/) {
# Determine whether the entity is parameter or general
$self->{'WS0'} = $1;
if ($2 eq '%') {
$self->{'PARAM'} = 1;
} else {
$self->{'PARAM'} = 0;
}
$self->{'WS1'} = _lftoce($3);
$self->{'NAME'} = $4;
$self->{'WS2'} = _lftoce($5);
my $entdef = $';
# Determine whether the entity is external or internal
if ($entdef =~ /^(SYSTEM|PUBLIC)(\s+)([\"\'])(.*?)\3(\s*)(?:([\"\'])(.*?)\6)?(\s*)>$/s) {
$self->{'EXTERNAL'} = 1;
if ($1 eq 'PUBLIC') {
$self->{'WSPUB'} = _lftoce($2);
$self->{'QCPUB'} = $3;
$self->{'PUBLIC'} = $4;
$self->{'WSSYS'} = _lftoce($5);
$self->{'QCSYS'} = $6;
$self->{'SYSTEM'} = $7;
} else {
$self->{'WSSYS'} = _lftoce($2);
$self->{'QCSYS'} = $3;
$self->{'SYSTEM'} = $4;
throw XML::DTD::Error("SYSTEM entity has two identifiers in ".
"definition: $entdcl", $self)
if (defined $7);
}
$self->{'WSRT'} = _lftoce($8);
# Need to access external entities here
$self->_getexternal if ($self->{'VALIDATING'} and $self->{'PARAM'});
} elsif ($entdef =~ /^([\"\'])(.*?)\1(\s*)>$/s) {
$self->{'EXTERNAL'} = 0;
$self->{'QUOTECHAR'} = $1; # " -> " ' -> &apo;
$self->{'ENTITYDEF'} = $2;
$self->{'WSRT'} = _lftoce($3);
} else {
throw XML::DTD::Error("Error parsing entity definition: $entdcl",
$self);
}
} else {
throw XML::DTD::Error("Error parsing entity name and type in definition".
": $entdcl",$self);
}
}
( run in 0.965 second using v1.01-cache-2.11-cpan-39bf76dae61 )