package HTML::Entities;
=head1 NAME
HTML::Entities - Encode or decode strings with HTML entities
=head1 SYNOPSIS
use HTML::Entities;
$a = "Våre norske tegn bør æres";
decode_entities($a);
encode_entities($a, "\200-\377");
For example, this:
$input = "vis-à-vis Beyoncé's naïve\npapier-mâché résumé";
print encode_entities($in), "\n"
Prints this out:
vis-à-vis Beyoncé's naïve
papier-mâché résumé
=head1 DESCRIPTION
This module deals with encoding and decoding of strings with HTML
character entities. The module provides the following functions:
=over 4
=item decode_entities( $string )
This routine replaces HTML entities found in the $string with the
corresponding ISO-8859-1 character, and if possible (under perl 5.8
or later) will replace to Unicode characters. Unrecognized
entities are left alone.
This routine is exported by default.
=item encode_entities( $string )
=item encode_entities( $string, $unsafe_chars )
This routine replaces unsafe characters in $string with their entity
representation. A second argument can be given to specify which
characters to consider unsafe (i.e., which to escape). The default set
of characters to encode are control chars, high-bit chars, and the
C<< < >>, C<< & >>, C<< > >>, and C<< " >>
characters. But this, for example, would encode I<just> the
C<< < >>, C<< & >>, C<< > >>, and C<< " >> characters:
$escaped = encode_entities($input, '<>&"');
This routine is exported by default.
=item encode_entities_numeric( $string )
=item encode_entities_numeric( $string, $unsafe_chars )
This routine works just like encode_entities, except that the replacement
entities are always C<&#xI<hexnum>;> and never C<&I<entname>;>. For
example, C<escape_entities("r\xF4le")> returns "rôle", but
C<escape_entities_numeric("r\xF4le")> returns "rôle".
This routine is I<not> exported by default. But you can always
export it with C<use HTML::Entities qw(encode_entities_numeric);>
or even C<use HTML::Entities qw(:DEFAULT encode_entities_numeric);>
=back
All these routines modify the string passed as the first argument, if
called in a void context. In scalar and array contexts, the encoded or
decoded string is returned (without changing the input string).
If you prefer not to import these routines into your namespace, you can
call them as:
use HTML::Entities ();
$decoded = HTML::Entities::decode($a);
$encoded = HTML::Entities::encode($a);
$encoded = HTML::Entities::encode_numeric($a);
The module can also export the %char2entity and the %entity2char
hashes, which contain the mapping from all characters to the
corresponding entities (and vice versa, respectively).
=head1 COPYRIGHT
Copyright 1995-2003 Gisle Aas. All rights reserved.
This library is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.
=cut
use strict;
use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
use vars qw(%entity2char %char2entity);
require 5.004;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(encode_entities decode_entities _decode_entities);
@EXPORT_OK = qw(%entity2char %char2entity encode_entities_numeric);
$VERSION = sprintf("%d.%02d", q$Revision: 1.1 $ =~ /(\d+)\.(\d+)/);
sub Version { $VERSION; }
require HTML::Parser;
%entity2char = (
amp => '&', 'gt' => '>', 'lt' => '<', quot => '"', apos => "'",
AElig => 'Æ', Aacute => 'Á', Acirc => 'Â', Agrave => 'À', Aring => 'Å', Atilde => 'Ã', Auml => 'Ä', Ccedil => 'Ç', ETH => 'Ð', Eacute => 'É', Ecirc => 'Ê', Egrave => 'È', Euml => 'Ë', Iacute => 'Í', Icirc => 'Î', Igrave => 'Ì', Iuml => 'Ï', Ntilde => 'Ñ', Oacute => 'Ó', Ocirc => 'Ô', Ograve => 'Ò', Oslash => 'Ø', Otilde => 'Õ', Ouml => 'Ö', THORN => 'Þ', Uacute => 'Ú', Ucirc => 'Û', Ugrave => 'Ù', Uuml => 'Ü', Yacute => 'Ý', aacute => 'á', acirc => 'â', aelig => 'æ', agrave => 'à', aring => 'å', atilde => 'ã', auml => 'ä', ccedil => 'ç', eacute => 'é', ecirc => 'ê', egrave => 'è', eth => 'ð', euml => 'ë', iacute => 'í', icirc => 'î', igrave => 'ì', iuml => 'ï', ntilde => 'ñ', oacute => 'ó', ocirc => 'ô', ograve => 'ò', oslash => 'ø', otilde => 'õ', ouml => 'ö', szlig => 'ß', thorn => 'þ', uacute => 'ú', ucirc => 'û', ugrave => 'ù', uuml => 'ü', yacute => 'ý', yuml => 'ÿ',
copy => '©', reg => '®', nbsp => "\240",
iexcl => '¡',
cent => '¢',
pound => '£',
curren => '¤',
yen => '¥',
brvbar => '¦',
sect => '§',
uml => '¨',
ordf => 'ª',
laquo => '«',
'not' => '¬', shy => '',
macr => '¯',
deg => '°',
plusmn => '±',
sup1 => '¹',
sup2 => '²',
sup3 => '³',
acute => '´',
micro => 'µ',
para => '¶',
middot => '·',
cedil => '¸',
ordm => 'º',
raquo => '»',
frac14 => '¼',
frac12 => '½',
frac34 => '¾',
iquest => '¿',
'times' => '×', divide => '÷',
( $] > 5.007 ? (
OElig => chr(338),
oelig => chr(339),
Scaron => chr(352),
scaron => chr(353),
Yuml => chr(376),
fnof => chr(402),
circ => chr(710),
tilde => chr(732),
Alpha => chr(913),
Beta => chr(914),
Gamma => chr(915),
Delta => chr(916),
Epsilon => chr(917),
Zeta => chr(918),
Eta => chr(919),
Theta => chr(920),
Iota => chr(921),
Kappa => chr(922),
Lambda => chr(923),
Mu => chr(924),
Nu => chr(925),
Xi => chr(926),
Omicron => chr(927),
Pi => chr(928),
Rho => chr(929),
Sigma => chr(931),
Tau => chr(932),
Upsilon => chr(933),
Phi => chr(934),
Chi => chr(935),
Psi => chr(936),
Omega => chr(937),
alpha => chr(945),
beta => chr(946),
gamma => chr(947),
delta => chr(948),
epsilon => chr(949),
zeta => chr(950),
eta => chr(951),
theta => chr(952),
iota => chr(953),
kappa => chr(954),
lambda => chr(955),
mu => chr(956),
nu => chr(957),
xi => chr(958),
omicron => chr(959),
pi => chr(960),
rho => chr(961),
sigmaf => chr(962),
sigma => chr(963),
tau => chr(964),
upsilon => chr(965),
phi => chr(966),
chi => chr(967),
psi => chr(968),
omega => chr(969),
thetasym => chr(977),
upsih => chr(978),
piv => chr(982),
ensp => chr(8194),
emsp => chr(8195),
thinsp => chr(8201),
zwnj => chr(8204),
zwj => chr(8205),
lrm => chr(8206),
rlm => chr(8207),
ndash => chr(8211),
mdash => chr(8212),
lsquo => chr(8216),
rsquo => chr(8217),
sbquo => chr(8218),
ldquo => chr(8220),
rdquo => chr(8221),
bdquo => chr(8222),
dagger => chr(8224),
Dagger => chr(8225),
bull => chr(8226),
hellip => chr(8230),
permil => chr(8240),
prime => chr(8242),
Prime => chr(8243),
lsaquo => chr(8249),
rsaquo => chr(8250),
oline => chr(8254),
frasl => chr(8260),
euro => chr(8364),
image => chr(8465),
weierp => chr(8472),
real => chr(8476),
trade => chr(8482),
alefsym => chr(8501),
larr => chr(8592),
uarr => chr(8593),
rarr => chr(8594),
darr => chr(8595),
harr => chr(8596),
crarr => chr(8629),
lArr => chr(8656),
uArr => chr(8657),
rArr => chr(8658),
dArr => chr(8659),
hArr => chr(8660),
forall => chr(8704),
part => chr(8706),
exist => chr(8707),
empty => chr(8709),
nabla => chr(8711),
isin => chr(8712),
notin => chr(8713),
ni => chr(8715),
prod => chr(8719),
sum => chr(8721),
minus => chr(8722),
lowast => chr(8727),
radic => chr(8730),
prop => chr(8733),
infin => chr(8734),
ang => chr(8736),
'and' => chr(8743),
'or' => chr(8744),
cap => chr(8745),
cup => chr(8746),
'int' => chr(8747),
there4 => chr(8756),
sim => chr(8764),
cong => chr(8773),
asymp => chr(8776),
'ne' => chr(8800),
equiv => chr(8801),
'le' => chr(8804),
'ge' => chr(8805),
'sub' => chr(8834),
sup => chr(8835),
nsub => chr(8836),
sube => chr(8838),
supe => chr(8839),
oplus => chr(8853),
otimes => chr(8855),
perp => chr(8869),
sdot => chr(8901),
lceil => chr(8968),
rceil => chr(8969),
lfloor => chr(8970),
rfloor => chr(8971),
lang => chr(9001),
rang => chr(9002),
loz => chr(9674),
spades => chr(9824),
clubs => chr(9827),
hearts => chr(9829),
diams => chr(9830),
) : ())
);
while (my($entity, $char) = each(%entity2char)) {
$char2entity{$char} = "&$entity;";
}
delete $char2entity{"'"};
for (0 .. 255) {
next if exists $char2entity{chr($_)};
$char2entity{chr($_)} = "&#$_;";
}
my %subst;
sub decode_entities_old
{
my $array;
if (defined wantarray) {
$array = [@_]; } else {
$array = \@_; }
my $c;
for (@$array) {
s/(&\ s/(&\ s/(&(\w+);?)/$entity2char{$2} || $1/eg;
}
wantarray ? @$array : $array->[0];
}
sub encode_entities
{
my $ref;
if (defined wantarray) {
my $x = $_[0];
$ref = \$x; } else {
$ref = \$_[0]; }
if (defined $_[1] and length $_[1]) {
unless (exists $subst{$_[1]}) {
my $code = "sub {\$_[0] =~ s/([$_[1]])/\$char2entity{\$1} || num_entity(\$1)/ge; }";
$subst{$_[1]} = eval $code;
die( $@ . " while trying to turn range: \"$_[1]\"\n "
. "into code: $code\n "
) if $@;
}
&{$subst{$_[1]}}($$ref);
} else {
$$ref =~ s/([^\n\r\t !\ }
$$ref;
}
sub encode_entities_numeric {
local %char2entity;
return &encode_entities; }
sub num_entity {
sprintf "&#x%X;", ord($_[0]);
}
*encode = \&encode_entities;
*encode_numeric = \&encode_entities_numeric;
*encode_numerically = \&encode_entities_numeric;
*decode = \&decode_entities;
1;