Bivio::HTML
# Copyright (c) 2000-2009 bivio Software, Inc. All rights reserved.
# $Id$
package Bivio::HTML;
use strict;
use base 'Bivio::UNIVERSAL';
use HTML::Entities ();
use URI::Escape ();
sub escape {
my(undef, $text) = @_;
my($res) = scalar(HTML::Entities::encode($text));
$res =~ s/'/'/sg;
return $res;
}
sub escape_attr_value {
my($proto, $text) = @_;
return $proto->escape($text);
}
sub escape_query {
my($proto, $text) = @_;
# Same as escape_uri except escapes '+' and '?' as well.
$text = $proto->escape_uri($text);
$text =~ s/\+/\%2B/g;
$text =~ s/\?/\%3F/g; #don't let this fall through the cracks
return $text;
}
sub escape_uri {
my(undef, $value) = @_;
return _extra_escape_uri(URI::Escape::uri_escape($value));
}
sub escape_xml {
return shift->escape(@_);
}
sub parse_www_form_urlencoded {
my($proto, $value) = @_;
return {map({
my(@x);
if (defined($_) && length($_)) {
@x = map($proto->unescape_query($_), split(/=/, $_));
Bivio::Die->throw(CORRUPT_FORM => {
message => 'too many equal signs(=) in value',
entity => $_,
full_entity => $value,
}) if @x > 2;
Bivio::Die->throw(CORRUPT_FORM => {
message => 'missing key value (nothing before =)',
entity => $_,
full_entity => $value,
}) unless defined($x[0]) && length($x[0]);
}
@x == 1 ? (@x, undef) : @x;
} split(/[\&\;]/, defined($value) ? $value : ''),
)};
}
sub unescape_uri {
my(undef, $value) = @_;
return URI::Escape::uri_unescape($value);
}
sub unescape {
my(undef, $text) = @_;
return defined($text) ? scalar(HTML::Entities::decode($text)) : '';
}
sub unescape_query {
my($proto, $value) = @_;
$value =~ s/\+/ /g;
return $proto->unescape_uri($value);
}
sub _extra_escape_uri {
my($v) = @_;
# Escapes & and = in URIs, because browsers don't do the right thing
# in quoted strings. Unescape '/'s because they shouldn't be escaped.
$v =~ s/\=/%3D/g;
$v =~ s/\&/%26/g;
$v =~ s/%2F/\//g;
return $v;
}
1;