HTML-Form-6.11/ 0000775 0001750 0001750 00000000000 14371700302 013607 5 ustar simbabque simbabque HTML-Form-6.11/lib/ 0000775 0001750 0001750 00000000000 14371700302 014355 5 ustar simbabque simbabque HTML-Form-6.11/lib/HTML/ 0000775 0001750 0001750 00000000000 14371700302 015121 5 ustar simbabque simbabque HTML-Form-6.11/lib/HTML/Form/ 0000775 0001750 0001750 00000000000 14371700302 016024 5 ustar simbabque simbabque HTML-Form-6.11/lib/HTML/Form/ImageInput.pm 0000644 0001750 0001750 00000001663 14371700302 020430 0 ustar simbabque simbabque package HTML::Form::ImageInput;
use strict;
use parent 'HTML::Form::SubmitInput';
our $VERSION = '6.11';
# ABSTRACT: An HTML form image input element for use with HTML::Form
sub form_name_value {
my $self = shift;
my $clicked = $self->{clicked};
return unless $clicked;
return if $self->{disabled};
my $name = $self->{name};
$name = ( defined($name) && length($name) ) ? "$name." : "";
return (
"${name}x" => $clicked->[0],
"${name}y" => $clicked->[1]
);
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
HTML::Form::ImageInput - An HTML form image input element for use with HTML::Form
=head1 VERSION
version 6.11
=head1 AUTHOR
Gisle Aas
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 1998 by Gisle Aas.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
HTML-Form-6.11/lib/HTML/Form/IgnoreInput.pm 0000644 0001750 0001750 00000001405 14371700302 020623 0 ustar simbabque simbabque package HTML::Form::IgnoreInput;
use strict;
use parent 'HTML::Form::Input';
our $VERSION = '6.11';
# ABSTRACT: An HTML form ignored input element for use with HTML::Form
# This represents buttons and resets whose values shouldn't matter
# but should buttons not be like submits?!
#input/button
#input/reset
sub value { return }
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
HTML::Form::IgnoreInput - An HTML form ignored input element for use with HTML::Form
=head1 VERSION
version 6.11
=head1 AUTHOR
Gisle Aas
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 1998 by Gisle Aas.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
HTML-Form-6.11/lib/HTML/Form/Input.pm 0000644 0001750 0001750 00000006702 14371700302 017464 0 ustar simbabque simbabque package HTML::Form::Input;
use strict;
our $VERSION = '6.11';
# ABSTRACT: A generic HTML form input element for use with HTML::Form
sub new {
my $class = shift;
my $self = bless {@_}, $class;
$self;
}
sub add_to_form {
my ( $self, $form ) = @_;
push( @{ $form->{'inputs'} }, $self );
$self;
}
sub strict {
my $self = shift;
my $old = $self->{strict};
if (@_) {
$self->{strict} = shift;
}
$old;
}
sub fixup { }
sub type {
shift->{type};
}
sub name {
my $self = shift;
my $old = $self->{name};
$self->{name} = shift if @_;
$old;
}
sub id {
my $self = shift;
my $old = $self->{id};
$self->{id} = shift if @_;
$old;
}
sub class {
my $self = shift;
my $old = $self->{class};
$self->{class} = shift if @_;
$old;
}
sub selected {
my ( $self, $sel ) = @_;
return undef unless defined $sel;
my $attr
= $sel =~ s/^\^// ? "name"
: $sel =~ s/^#// ? "id"
: $sel =~ s/^\.// ? "class"
: "name";
return 0 unless defined $self->{$attr};
return $self->{$attr} eq $sel;
}
sub value {
my $self = shift;
my $old = $self->{value};
$self->{value} = shift if @_;
$old;
}
sub autocomplete {
my $self = shift;
my $old = $self->{autocomplete};
$self->{autocomplete} = shift if @_;
$old;
}
sub possible_values {
return;
}
sub other_possible_values {
return;
}
sub value_names {
return;
}
sub readonly {
my $self = shift;
my $old = $self->{readonly};
$self->{readonly} = shift if @_;
$old;
}
sub disabled {
my $self = shift;
my $old = $self->{disabled};
$self->{disabled} = shift if @_;
$old;
}
sub form_name_value {
my $self = shift;
my $name = $self->{'name'};
return unless defined $name;
return if $self->disabled;
my $value = $self->value;
return unless defined $value;
return ( $name => $value );
}
sub dump {
my $self = shift;
my $name = $self->name;
$name = "" unless defined $name;
my $value = $self->value;
$value = "" unless defined $value;
my $dump = "$name=$value";
my $type = $self->type;
$type .= " disabled" if $self->disabled;
$type .= " readonly" if $self->readonly;
return sprintf "%-30s %s", $dump, "($type)" unless $self->{menu};
my @menu;
my $i = 0;
for ( @{ $self->{menu} } ) {
my $opt = $_->{value};
$opt = "" unless defined $opt;
$opt .= "/$_->{name}"
if defined $_->{name} && length $_->{name} && $_->{name} ne $opt;
substr( $opt, 0, 0 ) = "-" if $_->{disabled};
if ( exists $self->{current} && $self->{current} == $i ) {
substr( $opt, 0, 0 ) = "!" unless $_->{seen};
substr( $opt, 0, 0 ) = "*";
}
else {
substr( $opt, 0, 0 ) = ":" if $_->{seen};
}
push( @menu, $opt );
$i++;
}
return sprintf "%-30s %-10s %s", $dump, "($type)",
"[" . join( "|", @menu ) . "]";
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
HTML::Form::Input - A generic HTML form input element for use with HTML::Form
=head1 VERSION
version 6.11
=head1 AUTHOR
Gisle Aas
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 1998 by Gisle Aas.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
HTML-Form-6.11/lib/HTML/Form/FileInput.pm 0000644 0001750 0001750 00000004060 14371700302 020257 0 ustar simbabque simbabque package HTML::Form::FileInput;
use strict;
use parent 'HTML::Form::TextInput';
our $VERSION = '6.11';
# ABSTRACT: An HTML form file input element for use with HTML::Form
sub file {
my $self = shift;
$self->value(@_);
}
sub filename {
my $self = shift;
my $old = $self->{filename};
$self->{filename} = shift if @_;
$old = $self->file unless defined $old;
$old;
}
sub content {
my $self = shift;
my $old = $self->{content};
$self->{content} = shift if @_;
$old;
}
sub headers {
my $self = shift;
my $old = $self->{headers} || [];
$self->{headers} = [@_] if @_;
@$old;
}
sub form_name_value {
my ( $self, $form ) = @_;
return $self->SUPER::form_name_value($form)
if $form->method ne "POST"
|| $form->enctype ne "multipart/form-data";
my $name = $self->name;
return unless defined $name;
return if $self->{disabled};
my $file = $self->file;
my $filename = $self->filename;
my @headers = $self->headers;
my $content = $self->content;
my %headers = @headers;
if ( defined $content || grep m/^Content$/i, keys %headers ) {
$filename = $file unless defined $filename;
$file = undef;
unshift( @headers, "Content" => $content );
}
elsif ( !defined($file) || length($file) == 0 ) {
return;
}
# legacy (this used to be the way to do it)
if ( ref($file) eq "ARRAY" ) {
my $f = shift @$file;
my $fn = shift @$file;
push( @headers, @$file );
$file = $f;
$filename = $fn;
}
return ( $name => [ $file, $filename, @headers ] );
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
HTML::Form::FileInput - An HTML form file input element for use with HTML::Form
=head1 VERSION
version 6.11
=head1 AUTHOR
Gisle Aas
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 1998 by Gisle Aas.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
HTML-Form-6.11/lib/HTML/Form/KeygenInput.pm 0000644 0001750 0001750 00000001375 14371700302 020630 0 ustar simbabque simbabque package HTML::Form::KeygenInput;
use strict;
use parent 'HTML::Form::Input';
our $VERSION = '6.11';
# ABSTRACT: An HTML form keygen input element for use with HTML::Form
sub challenge {
my $self = shift;
return $self->{challenge};
}
sub keytype {
my $self = shift;
return lc( $self->{keytype} || 'rsa' );
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
HTML::Form::KeygenInput - An HTML form keygen input element for use with HTML::Form
=head1 VERSION
version 6.11
=head1 AUTHOR
Gisle Aas
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 1998 by Gisle Aas.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
HTML-Form-6.11/lib/HTML/Form/TextInput.pm 0000644 0001750 0001750 00000002275 14371700302 020332 0 ustar simbabque simbabque package HTML::Form::TextInput;
use strict;
use parent 'HTML::Form::Input';
our $VERSION = '6.11';
# ABSTRACT: An HTML form text input element for use with HTML::Form
#input/text
#input/password
#input/hidden
#textarea
sub value {
my $self = shift;
my $old = $self->{value};
$old = "" unless defined $old;
if (@_) {
Carp::croak("Input '$self->{name}' is readonly")
if $self->{strict} && $self->{readonly};
my $new = shift;
my $n = exists $self->{maxlength} ? $self->{maxlength} : undef;
Carp::croak("Input '$self->{name}' has maxlength '$n'")
if $self->{strict}
&& defined($n)
&& defined($new)
&& length($new) > $n;
$self->{value} = $new;
}
$old;
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
HTML::Form::TextInput - An HTML form text input element for use with HTML::Form
=head1 VERSION
version 6.11
=head1 AUTHOR
Gisle Aas
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 1998 by Gisle Aas.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
HTML-Form-6.11/lib/HTML/Form/SubmitInput.pm 0000644 0001750 0001750 00000001760 14371700302 020647 0 ustar simbabque simbabque package HTML::Form::SubmitInput;
use strict;
use parent 'HTML::Form::Input';
our $VERSION = '6.11';
# ABSTRACT: An HTML form submit input element for use with HTML::Form
#input/image
#input/submit
sub click {
my ( $self, $form, $x, $y ) = @_;
for ( $x, $y ) { $_ = 1 unless defined; }
local ( $self->{clicked} ) = [ $x, $y ];
local ( $self->{value} ) = "" unless defined $self->value;
return $form->make_request;
}
sub form_name_value {
my $self = shift;
return unless $self->{clicked};
return $self->SUPER::form_name_value(@_);
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
HTML::Form::SubmitInput - An HTML form submit input element for use with HTML::Form
=head1 VERSION
version 6.11
=head1 AUTHOR
Gisle Aas
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 1998 by Gisle Aas.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
HTML-Form-6.11/lib/HTML/Form/ListInput.pm 0000644 0001750 0001750 00000014705 14371700302 020322 0 ustar simbabque simbabque package HTML::Form::ListInput;
use strict;
use parent 'HTML::Form::Input';
use Carp 'croak';
our $VERSION = '6.11';
# ABSTRACT: An HTML form list input element for use with HTML::Form
#select/option (val1, val2, ....)
#input/radio (undef, val1, val2,...)
#input/checkbox (undef, value)
#select-multiple/option (undef, value)
sub new {
my $class = shift;
my $self = $class->SUPER::new(@_);
my $value = delete $self->{value};
my $value_name = delete $self->{value_name};
my $type = $self->{type};
if ( $type eq "checkbox" ) {
$value = "on" unless defined $value;
$self->{menu} = [
{ value => undef, name => "off", },
{ value => $value, name => $value_name, },
];
$self->{current} = ( delete $self->{checked} ) ? 1 : 0;
}
else {
$self->{option_disabled}++
if $type eq "radio" && delete $self->{disabled};
$self->{menu} = [
{ value => $value, name => $value_name },
];
my $checked = $self->{checked} || $self->{option_selected};
delete $self->{checked};
delete $self->{option_selected};
if ( exists $self->{multiple} ) {
unshift( @{ $self->{menu} }, { value => undef, name => "off" } );
$self->{current} = $checked ? 1 : 0;
}
else {
$self->{current} = 0 if $checked;
}
}
$self;
}
sub add_to_form {
my ( $self, $form ) = @_;
my $type = $self->type;
return $self->SUPER::add_to_form($form)
if $type eq "checkbox";
if ( $type eq "option" && exists $self->{multiple} ) {
$self->{disabled} ||= delete $self->{option_disabled};
return $self->SUPER::add_to_form($form);
}
Carp::croak "Assert" if @{ $self->{menu} } != 1;
my $m = $self->{menu}[0];
$m->{disabled}++ if delete $self->{option_disabled};
# if there was no name we have to search for an input that explicitly has
# no name either, because otherwise the name attribute would be ignored
my $prev = $form->find_input(
$self->{name} || \undef, $self->{type},
$self->{idx}
);
return $self->SUPER::add_to_form($form) unless $prev;
# merge menus
$prev->{current} = @{ $prev->{menu} } if exists $self->{current};
push( @{ $prev->{menu} }, $m );
}
sub fixup {
my $self = shift;
if ( $self->{type} eq "option" && !( exists $self->{current} ) ) {
$self->{current} = 0;
}
$self->{menu}[ $self->{current} ]{seen}++ if exists $self->{current};
}
sub disabled {
my $self = shift;
my $type = $self->type;
my $old = $self->{disabled} || _menu_all_disabled( @{ $self->{menu} } );
if (@_) {
my $v = shift;
$self->{disabled} = $v;
for ( @{ $self->{menu} } ) {
$_->{disabled} = $v;
}
}
return $old;
}
sub _menu_all_disabled {
for (@_) {
return 0 unless $_->{disabled};
}
return 1;
}
sub value {
my $self = shift;
my $old;
$old = $self->{menu}[ $self->{current} ]{value}
if exists $self->{current};
$old = $self->{value} if exists $self->{value};
if (@_) {
my $i = 0;
my $val = shift;
my $cur;
my $disabled;
for ( @{ $self->{menu} } ) {
if (
(
defined($val)
&& defined( $_->{value} )
&& $val eq $_->{value}
)
|| ( !defined($val) && !defined( $_->{value} ) )
) {
$cur = $i;
$disabled = $_->{disabled};
last unless $disabled;
}
$i++;
}
if ( !( defined $cur ) || $disabled ) {
if ( defined $val ) {
# try to search among the alternative names as well
my $i = 0;
my $cur_ignorecase;
my $lc_val = lc($val);
for ( @{ $self->{menu} } ) {
if ( defined $_->{name} ) {
if ( $val eq $_->{name} ) {
$disabled = $_->{disabled};
$cur = $i;
last unless $disabled;
}
if ( !defined($cur_ignorecase)
&& $lc_val eq lc( $_->{name} ) ) {
$cur_ignorecase = $i;
}
}
$i++;
}
unless ( defined $cur ) {
$cur = $cur_ignorecase;
if ( defined $cur ) {
$disabled = $self->{menu}[$cur]{disabled};
}
elsif ( $self->{strict} ) {
my $n = $self->name;
Carp::croak("Illegal value '$val' for field '$n'");
}
}
}
elsif ( $self->{strict} ) {
my $n = $self->name;
Carp::croak("The '$n' field can't be unchecked");
}
}
if ( $self->{strict} && $disabled ) {
my $n = $self->name;
Carp::croak("The value '$val' has been disabled for field '$n'");
}
if ( defined $cur ) {
$self->{current} = $cur;
$self->{menu}[$cur]{seen}++;
delete $self->{value};
}
else {
$self->{value} = $val;
delete $self->{current};
}
}
$old;
}
sub check {
my $self = shift;
$self->{current} = 1;
$self->{menu}[1]{seen}++;
}
sub possible_values {
my $self = shift;
map $_->{value}, grep !$_->{disabled}, @{ $self->{menu} };
}
sub other_possible_values {
my $self = shift;
map $_->{value}, grep !$_->{seen} && !$_->{disabled}, @{ $self->{menu} };
}
sub value_names {
my $self = shift;
my @names;
for ( @{ $self->{menu} } ) {
my $n = $_->{name};
$n = $_->{value} unless defined $n;
push( @names, $n );
}
@names;
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
HTML::Form::ListInput - An HTML form list input element for use with HTML::Form
=head1 VERSION
version 6.11
=head1 AUTHOR
Gisle Aas
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 1998 by Gisle Aas.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
HTML-Form-6.11/lib/HTML/Form.pm 0000644 0001750 0001750 00000101155 14371700302 016363 0 ustar simbabque simbabque package HTML::Form;
use strict;
use URI;
use Carp ();
use Encode ();
use HTML::Form::TextInput ();
use HTML::Form::IgnoreInput ();
use HTML::Form::ListInput ();
use HTML::Form::SubmitInput ();
use HTML::Form::ImageInput ();
use HTML::Form::FileInput ();
use HTML::Form::KeygenInput ();
our $VERSION = '6.11';
my %form_tags = map { $_ => 1 } qw(input textarea button select option);
my %type2class = (
text => "TextInput",
password => "TextInput",
hidden => "TextInput",
textarea => "TextInput",
"reset" => "IgnoreInput",
radio => "ListInput",
checkbox => "ListInput",
option => "ListInput",
button => "SubmitInput",
submit => "SubmitInput",
image => "ImageInput",
file => "FileInput",
keygen => "KeygenInput",
);
# The new HTML5 input types
%type2class = (
%type2class,
map { $_ => 'TextInput' } qw(
tel search url email
datetime date month week time datetime-local
number range color
)
);
# ABSTRACT: Class that represents an HTML form element
sub parse {
my $class = shift;
my $html = shift;
unshift( @_, "base" ) if @_ == 1;
my %opt = @_;
require HTML::TokeParser;
my $p = HTML::TokeParser->new(
ref($html) ? $html->decoded_content( ref => 1 ) : \$html );
Carp::croak "Failed to create HTML::TokeParser object" unless $p;
my $base_uri = delete $opt{base};
my $charset = delete $opt{charset};
my $strict = delete $opt{strict};
my $verbose = delete $opt{verbose};
if ($^W) {
Carp::carp("Unrecognized option $_ in HTML::Form->parse")
for sort keys %opt;
}
unless ( defined $base_uri ) {
if ( ref($html) ) {
$base_uri = $html->base;
}
else {
Carp::croak("HTML::Form::parse: No \$base_uri provided");
}
}
unless ( defined $charset ) {
if ( ref($html) and $html->can("content_charset") ) {
$charset = $html->content_charset;
}
unless ($charset) {
$charset = "UTF-8";
}
}
my @forms;
my $f; # current form
my %openselect; # index to the open instance of a select
while ( my $t = $p->get_tag ) {
my ( $tag, $attr ) = @$t;
if ( $tag eq "form" ) {
my $action = delete $attr->{'action'};
$action = "" unless defined $action;
$action = URI->new_abs( $action, $base_uri );
$f = $class->new(
$attr->{'method'},
$action,
$attr->{'enctype'}
);
$f->accept_charset( $attr->{'accept-charset'} )
if $attr->{'accept-charset'};
$f->{default_charset} = $charset;
$f->{attr} = $attr;
$f->strict(1) if $strict;
%openselect = ();
push( @forms, $f );
my ( %labels, $current_label );
while ( my $t = $p->get_tag ) {
my ( $tag, $attr ) = @$t;
last if $tag eq "/form";
if ( $tag ne 'textarea' ) {
# if we are inside a label tag, then keep
# appending any text to the current label
if ( defined $current_label ) {
$current_label = join " ",
grep { defined and length } $current_label,
$p->get_phrase;
}
}
if ( $tag eq "input" ) {
$attr->{value_name}
= exists $attr->{id} && exists $labels{ $attr->{id} }
? $labels{ $attr->{id} }
: defined $current_label ? $current_label
: $p->get_phrase;
}
if ( $tag eq "label" ) {
$current_label = $p->get_phrase;
$labels{ $attr->{for} } = $current_label
if exists $attr->{for};
}
elsif ( $tag eq "/label" ) {
$current_label = undef;
}
elsif ( $tag eq "input" ) {
my $type = delete $attr->{type} || "text";
$f->push_input( $type, $attr, $verbose );
}
elsif ( $tag eq "button" ) {
my $type = delete $attr->{type} || "submit";
$f->push_input( $type, $attr, $verbose );
}
elsif ( $tag eq "textarea" ) {
$attr->{textarea_value} = $attr->{value}
if exists $attr->{value};
my $text = $p->get_text("/textarea");
$attr->{value} = $text;
$f->push_input( "textarea", $attr, $verbose );
}
elsif ( $tag eq "select" ) {
# rename attributes reserved to come for the option tag
for ( "value", "value_name" ) {
$attr->{"select_$_"} = delete $attr->{$_}
if exists $attr->{$_};
}
# count this new select option separately
my $name = $attr->{name};
$name = "" unless defined $name;
$openselect{$name}++;
while ( $t = $p->get_tag ) {
my $tag = shift @$t;
last if $tag eq "/select";
next if $tag =~ m,/?optgroup,;
next if $tag eq "/option";
if ( $tag eq "option" ) {
my %a = %{ $t->[0] };
# rename keys so they don't clash with %attr
for ( keys %a ) {
next if $_ eq "value";
$a{"option_$_"} = delete $a{$_};
}
while ( my ( $k, $v ) = each %$attr ) {
$a{$k} = $v;
}
$a{value_name} = $p->get_trimmed_text;
$a{value} = delete $a{value_name}
unless defined $a{value};
$a{idx} = $openselect{$name};
$f->push_input( "option", \%a, $verbose );
}
else {
warn("Bad