#!/usr/bin/perl -w require 5.004; use strict; use CGI; use File::Basename; use HTML::TokeParser; my $doc = shift or &usage; my $basename = basename( $doc ); $basename =~ s/\..*$//; my $p = HTML::TokeParser->new($doc) || die "Can't open: $!"; my $formnum = 1; ####################################################################################### # The following variables should be set by the user to control # # the output of the code generator # # # my $cgi_std = 0; # set this to false to have OO cgi code written out. # my $cgi_obj = 'q'; # if $cgi_std is set to false, use this to specify the variable # # name of the CGI object (e.g. 'q' becomes 'my $q = CGI->new;') # my $shebang = '#!/usr/bin/perl -wT'; # This is the shebang line that will be used. # # If left blank, it will be skipped. # ####################################################################################### my ( %element, %select, @element_order, $select_token ); if ( $HTML::Parser::VERSION < 3.25 ) { warn "\n\tYou have HTML::Parser version $HTML::Parser::VERSION, which is out of date.". "\n\tXHTML may not parse correctly\n\n"; } # walk through document and get each tag while (my $token = $p->get_tag) { my $tag = $token->[0]; if ( my $form_pos = ( $tag eq 'form' .. $tag eq '/form' ) ) { # Oh! We're in a form. Start looking for stuff. if ( $form_pos != 1 and substr( $form_pos, -2 ) ne 'E0' ) { add_input_element( $token ) if $tag eq 'input'; # , so add it to # %select so we knows we've seen it. $select{ $select_token->[1]->{ 'name' } } = ''; } } # end if (select) foreach ( qw/ textarea button / ) { add_generic_element( $token ) if $tag eq $_; } } elsif ( substr( $form_pos, -2 ) eq 'E0' ) { # we've finished the form, so let's write the document, clear the vars, # and start looking for more forms. &write_template; %element = (); @element_order = (); $formnum++; } } # end if (form) } sub add_generic_element { my $token = shift; my $tag = $token->[0]; my $name = $token->[1]->{ 'name' } || ''; my $value = $token->[1]->{ 'value' } || ''; # I don't want to pass 'text' defaults as they can often be huge if ( $tag eq 'textarea' ) { $value = ''; } update_element_hash( $name, $tag, $value, 1 ); } sub add_select_element { my ( $token, $p, $select_token ) = @_; my $name = $select_token->[1]->{ 'name' } || ''; my $value = $token->[1]->{ 'value' } || ''; # The following is because an