CGI-FormBuilder
view release on metacpan or search on metacpan
lib/CGI/FormBuilder/Util.pm view on Meta::CPAN
# minimalist, not 100% correct, URL escaping
my $toencode = shift;
$toencode =~ s!([^a-zA-Z0-9_,.-/])!sprintf("%%%02x",ord($1))!eg;
return $toencode;
}
=head2 escapehtml($string)
Returns an HTML-escaped string suitable for embedding in HTML tags.
=cut
sub escapehtml ($) {
my $toencode = shift;
return '' unless defined $toencode;
# use very basic built-in HTML escaping
$toencode =~ s!&!&!g;
$toencode =~ s!<!<!g;
$toencode =~ s!>!>!g;
$toencode =~ s!"!"!g;
return $toencode;
}
=head2 escapejs($string)
Returns a string suitable for including in JavaScript. Minimal processing.
=cut
sub escapejs ($) {
my $toencode = shift;
$toencode =~ s#'#\\'#g;
return $toencode;
}
=head2 htmltag($name, %attr)
This generates an XHTML-compliant tag for the name C<$name> based on the
C<%attr> specified. For example:
my $table = htmltag('table', cellpadding => 1, border => 0);
No routines are provided to close tags; you must manually print a closing
C<< </table> >> tag.
=cut
sub htmltag ($;@) {
# called as htmltag('tagname', %attr)
# creates an HTML tag on the fly, quick and dirty
my $name = shift || return;
my $attr = htmlattr($name, @_); # ref return faster
# see if we have a special tag name (experimental)
(my $look = $name) =~ s#^(/*)##;
$name = "$1$TAGNAMES{$look}" if $TAGNAMES{$look};
my $htag = join(' ', $name,
map { qq($_=") . escapehtml($attr->{$_}) . '"' } sort keys %$attr);
$htag .= ' /' if $name eq 'input' || $name eq 'link'; # XHTML self-closing
return '<' . $htag . '>';
}
=head2 htmlattr($name, %attr)
This cleans any internal B<FormBuilder> attributes from the specified tag.
It is automatically called by C<htmltag()>.
=cut
sub htmlattr ($;@) {
# called as htmlattr('tagname', %attr)
# returns valid HTML attr for that tag
my $name = shift || return;
my $attr = ref $_[0] ? $_[0] : { @_ };
my %html;
while (my($key,$val) = each %$attr) {
# Anything but normal scalar data gets yanked
next if ref $val || ! defined $val;
# This cleans out all the internal junk kept in each data
# element, returning everything else (for an html tag).
# Crap, I used "text" here and body takes a text attr!!
next if ($OURATTR{$key} || $key =~ /^_/
|| ($key eq 'text' && $name ne 'body')
|| ($key eq 'multiple' && $name ne 'select')
|| ($key eq 'type' && $name eq 'select')
|| ($key eq 'label' && ($name ne 'optgroup' && $name ne 'option'))
|| ($key eq 'title' && $name eq 'form'));
# see if we have a special tag name (experimental)
$key = $TAGNAMES{$key} if $TAGNAMES{$key};
$html{$key} = $val;
}
# "double-name" fields with an id for easier DOM scripting
# do not override explicitly set id attributes
$html{id} = tovar($html{name}) if exists $html{name} and not exists $html{id};
return wantarray ? %html : \%html;
}
=head2 toname($string)
This is responsible for the auto-naming functionality of B<FormBuilder>.
Since you know Perl, it's easiest to just show what it does:
$name =~ s!\.\w+$!!; # lose trailing ".suf"
$name =~ s![^a-zA-Z0-9.-/]+! !g; # strip non-alpha chars
$name =~ s!\b(\w)!\u$1!g; # convert _ to space/upper
This results in something like "cgi_script.pl" becoming "Cgi Script".
=cut
sub toname ($) {
# creates a name from a var/file name (like file2name)
my $name = shift;
$name =~ s!\.\w+$!!; # lose trailing ".suf"
$name =~ s![^a-zA-Z0-9.-/]+! !g; # strip non-alpha chars
$name =~ s!\b(\w)!\u$1!g; # convert _ to space/upper
( run in 0.689 second using v1.01-cache-2.11-cpan-39bf76dae61 )