HTML::FillInForm rocks hard, but it neither can accept or return HTML::Tree instances, even though it works with them internally.

Therefore, those of us who operate on HTML as trees (e.g. HTML::Seamstress) have to do all the following to leverage FillinForm:

  1. convert our HTML to a string
  2. pass it fillinform
  3. get back the result and turn it back into a tree to continue processing

Now there is a fillinform method in HTML::Element::Library and here is how it's used:

first the html "template"

<html> <head> </head> <body> <form> <input type="text" id="age" name="age" value="balbalh" /> <input type="text" id="email" name="email" /> <input type="text" id="zipcode" name="zipcode" /> </form> </body> </html>

our Perl program

my %form = ( age => 77, email => 'ben@perlmon.com', zipcode => '29063-2134' ); use form_example; my $tree = form_example->new; # calls my $html = $tree->fillinform(\%form) ; warn $html;

and the html form is filled in ...

<form> <input value="77" name="age" type="text" id="age" /> <input value="ben@perlmon.com" name="email" type="text" id="email" /> <input value="29063-2134" name="zipcode" type="text" id="zipcode" /> </form>

Now the Perl class to treeify our HTML

[tbrannon@devel fillinform]$ spkg.pl --base_pkg=HTMLBase form_example. +html comp_root........ /home/tbrannon/prg/html-element-replacer/HTML-Elemen +t-Replacer/ex/tables/ html_file_path... /home/tbrannon/prg/html-seamstress/samples/fillinfor +m/ html_file........ form_example.html html_file sans... form_example substr outside of string at /usr/bin/spkg.pl line 195. WARNING: the comp_root and html_file_path are not equal for the extent + of comp_root... This may lead to incorrect calculations at /usr/bin/spkg.pl line 197.

DONE!

have a nice day!

Replies are listed 'Best First'.
Re: tree-based HTML::FillInForm with HTML::Seamstress
by Jenda (Abbot) on Jun 05, 2009 at 00:36 UTC

    Why do you think HTML::FillInForm works with HTML::Tree instances internaly??? If it did, it would be trivial to change it to allow you to pass one instead of passing a string from which a tree is built. But the module doesn't build any tree. It processes the HTML using HTML::Parser and callbacks. No tree involved. At least in the 2.00 version on CPAN.

    If you'd want to skip the conversion from tree to string and back, you'd have to reimplement the module. So that the start(), text() and end() methods are called as you traverse the list and inside those methods instead of appending to $self->{output} you'd have to build the result tree or modify the original one. I think you could use a lot of the code with fairly small changes.

    Jenda
    Enoch was right!
    Enjoy the last years of Rome.