1CGI::Ex::Fill(3) User Contributed Perl Documentation CGI::Ex::Fill(3)
2
3
4
6 CGI::Ex::Fill - Fast but compliant regex based form filler
7
9 use CGI::Ex::Fill qw(form_fill fill);
10
11 my $text = my_own_template_from_somewhere();
12
13 my $form = CGI->new;
14 # OR
15 # my $form = {key => 'value'}
16 # OR
17 # my $form = [CGI->new, CGI->new, {key1 => 'val1'}, CGI->new];
18
19
20 form_fill(\$text, $form); # modifies $text
21
22 # OR
23 # my $copy = form_fill($text, $form); # copies $text
24
25 # OR
26 fill({
27 text => \$text,
28 form => $form,
29 });
30
31
32 # ALSO
33
34 my $formname = 'formname'; # form to parse (undef = anytable)
35 my $fp = 0; # fill_passwords ? default is true
36 my $ignore = ['key1', 'key2']; # OR {key1 => 1, key2 => 1};
37
38 form_fill(\$text, $form, $formname, $fp, $ignore);
39
40 # OR
41 fill({
42 text => \$text,
43 form => $form,
44 target => 'my_formname',
45 fill_password => $fp,
46 ignore_fields => $ignore,
47 });
48
49 # ALSO
50
51 ### delay getting the value until we find an element that needs it
52 my $form = {key => sub {my $key = shift; # get and return value}};
53
55 form_fill is directly comparable to HTML::FillInForm. It will pass the
56 same suite of tests (actually - it is a little bit kinder on the parse
57 as it won't change case, reorder your attributes, or alter
58 miscellaneous spaces and it won't require the HTML to be well formed).
59
60 HTML::FillInForm is based upon HTML::Parser while CGI::Ex::Fill is
61 purely regex driven. The performance of CGI::Ex::Fill will be better
62 on HTML with many markup tags because HTML::Parser will parse each tag
63 while CGI::Ex::Fill will search only for those tags it knows how to
64 handle. And CGI::Ex::Fill generally won't break on malformed html.
65
66 On tiny forms (< 1 k) form_fill was ~ 13% slower than FillInForm. If
67 the html document incorporated very many entities at all, the
68 performance of FillInForm goes down (adding 360 <br> tags pushed
69 form_fill to ~ 350% faster). However, if you are only filling in one
70 form every so often, then it shouldn't matter which you use - but
71 form_fill will be nicer on the tags and won't balk at ugly html and
72 will decrease performance only at a slow rate as the size of the html
73 increases. See the benchmarks in the t/samples/bench_cgix_hfif.pl file
74 for more information (ALL BENCHMARKS SHOULD BE TAKEN WITH A GRAIN OF
75 SALT).
76
77 There are two functions, fill and form_fill. The function fill takes a
78 hashref of named arguments. The function form_fill takes a list of
79 positional parameters.
80
82 The following are the arguments to the main function "fill".
83
84 text
85 A reference to an html string that includes one or more forms.
86
87 form
88 A form hash, CGI object, or an array of hashrefs and objects.
89
90 target
91 The name of the form to swap. Default is undef which means to swap
92 all form entities in all forms.
93
94 fill_password
95 Default true. If set to false, fields of type password will not be
96 refilled.
97
98 ignore_fields
99 Hashref of fields to be ignored from swapping.
100
101 remove_script
102 Defaults to the package global $REMOVE_SCRIPT which defaults to
103 true. Removes anything in <script></script> tags which often cause
104 problems for parsers.
105
106 remove_comment
107 Defaults to the package global $REMOVE_COMMENT which defaults to
108 true. Removes anything in <!-- --> tags which can sometimes cause
109 problems for parsers.
110
111 object_method
112 The method to call on objects passed to the form argument. Default
113 value is the package global $OBJECT_METHOD which defaults to
114 'param'. If a CGI object is passed, it would call param on that
115 object passing the desired keyname as an argument.
116
118 The following are the arguments to the legacy function "form_fill".
119
120 "\$html"
121 A reference to an html string that includes one or more forms or
122 form entities.
123
124 "\%FORM"
125 A form hash, or CGI query object, or an arrayref of multiple hash
126 refs and/or CGI query objects that will supply values for the form.
127
128 $form_name
129 The name of the form to fill in values for. The default is undef
130 which indicates that all forms are to be filled in.
131
132 $swap_pass
133 Default true. Indicates that "<lt"input type="password"<gt>>
134 fields are to be swapped as well. Set to false to disable this
135 behavior.
136
137 "\%IGNORE_FIELDS" OR "\@IGNORE_FIELDS"
138 A hash ref of key names or an array ref of key names that will be
139 ignored during the fill in of the form.
140
142 fill and form_fill will attempt to DWYM when filling in values. The
143 following behaviors are used on the following types of form elements.
144
145 "<input type="text">"
146 The following rules are used when matching this type:
147
148 1) Get the value from the form that matches the input's "name".
149 2) If the value is defined - it adds or replaces the existing value.
150 3) If the value is not defined and the existing value is not defined,
151 a value of "" is added.
152
153 For example:
154
155 my $form = {foo => "FOO", bar => "BAR", baz => "BAZ"};
156
157 my $html = '
158 <input type=text name=foo>
159 <input type=text name=foo>
160 <input type=text name=bar value="">
161 <input type=text name=baz value="Something else">
162 <input type=text name=hem value="Another thing">
163 <input type=text name=haw>
164 ';
165
166 form_fill(\$html, $form);
167
168 $html eq '
169 <input type=text name=foo value="FOO">
170 <input type=text name=foo value="FOO">
171 <input type=text name=bar value="BAR">
172 <input type=text name=baz value="BAZ">
173 <input type=text name=hem value="Another thing">
174 <input type=text name=haw value="">
175 ';
176
177 If the value returned from the form is an array ref, the values of
178 the array ref will be sequentially used for each input found by
179 that name until the values run out. If the value is not an array
180 ref - it will be used to fill in any values by that name. For
181 example:
182
183 $form = {foo => ['aaaa', 'bbbb', 'cccc']};
184
185 $html = '
186 <input type=text name=foo>
187 <input type=text name=foo>
188 <input type=text name=foo>
189 <input type=text name=foo>
190 <input type=text name=foo>
191 ';
192
193 form_fill(\$html, $form);
194
195 $html eq '
196 <input type=text name=foo value="aaaa">
197 <input type=text name=foo value="bbbb">
198 <input type=text name=foo value="cccc">
199 <input type=text name=foo value="">
200 <input type=text name=foo value="">
201 ';
202
203 "<input type="hidden">"
204 Same as "<input type="text">".
205
206 "<input type="password">"
207 Same as "<input type="text">".
208
209 "<input type="file">"
210 Same as "<input type="text">". (Note - this is subject to browser
211 support for pre-population)
212
213 "<input type="checkbox">"
214 As each checkbox is found the following rules are applied:
215
216 1) Get the values from the form (do nothing if no values found)
217 2) Remove any existing "checked=checked" or "checked" markup from the tag.
218 3) Compare the "value" field to the values and mark with checked="checked"
219 if there is a match.
220
221 If no "value" field is found in the html, a default value of "on"
222 will be used (which is what most browsers will send as the default
223 value for checked boxes without "value" fields).
224
225 $form = {foo => 'FOO', bar => ['aaaa', 'bbbb', 'cccc'], baz => 'on'};
226
227 $html = '
228 <input type=checkbox name=foo value="123">
229 <input type=checkbox name=foo value="FOO">
230 <input type=checkbox name=bar value="aaaa">
231 <input type=checkbox name=bar value="cccc">
232 <input type=checkbox name=bar value="dddd" checked="checked">
233 <input type=checkbox name=baz>
234 ';
235
236 form_fill(\$html, $form);
237
238 $html eq '
239 <input type=checkbox name=foo value="123">
240 <input type=checkbox name=foo value="FOO" checked="checked">
241 <input type=checkbox name=bar value="aaaa" checked="checked">
242 <input type=checkbox name=bar value="cccc" checked="checked">
243 <input type=checkbox name=bar value="dddd">
244 <input type=checkbox name=baz checked="checked">
245 ';
246
247 "<input type="radio">"
248 Same as "<input type="checkbox">".
249
250 "<select>"
251 As each select box is found the following rules are applied (these
252 rules are applied regardless of if the box is a select-one or a
253 select-multi - if multiple values are selected on a select-one it
254 is up to the browser to choose which one to highlight):
255
256 1) Get the values from the form (do nothing if no values found)
257 2) Remove any existing "selected=selected" or "selected" markup from the tag.
258 3) Compare the "value" field to the values and mark with selected="selected"
259 if there is a match.
260 4) If there is no "value" field - use the text in between the "option" tags.
261
262 (Note: There does not need to be a closing "select" tag or closing "option" tag)
263
264
265 $form = {foo => 'FOO', bar => ['aaaa', 'bbbb', 'cccc']};
266
267 $html = '
268 <select name=foo><option>FOO<option>123<br>
269
270 <select name=bar>
271 <option>aaaa</option>
272 <option value="cccc">cccc</option>
273 <option value="dddd" selected="selected">dddd</option>
274 </select>
275 ';
276
277 form_fill(\$html, $form);
278
279 ok(
280 $html eq '
281 <select name=foo><option selected="selected">FOO<option>123<br>
282
283 <select name=bar>
284 <option selected="selected">aaaa</option>
285 <option value="cccc" selected="selected">cccc</option>
286 <option value="dddd">dddd</option>
287 </select>
288 ', "Perldoc example 4 passed");
289
290 "<textarea>"
291 The rules for swapping textarea are as follows:
292
293 1) Get the value from the form that matches the textarea's "name".
294 2) If the value is defined - it adds or replaces the existing value.
295 3) If the value is not defined, the text area is left alone.
296
297 (Note - there does not need to be a closing textarea tag. In the case of
298 a missing close textarea tag, the contents of the text area will be
299 assumed to be the start of the next textarea of the end of the document -
300 which ever comes sooner)
301
302 If the form returned an array ref of values, then these values will
303 be used sequentially each time a textarea by that name is found.
304 If a single value (not array ref) is found, that value will be used
305 for each textarea by that name.
306
307 For example.
308
309 $form = {foo => 'FOO', bar => ['aaaa', 'bbbb']};
310
311 $html = '
312 <textarea name=foo></textarea>
313 <textarea name=foo></textarea>
314
315 <textarea name=bar>
316 <textarea name=bar></textarea><br>
317 <textarea name=bar>dddd</textarea><br>
318 <textarea name=bar><br><br>
319 ';
320
321 form_fill(\$html, $form);
322
323 $html eq '
324 <textarea name=foo>FOO</textarea>
325 <textarea name=foo>FOO</textarea>
326
327 <textarea name=bar>aaaa<textarea name=bar>bbbb</textarea><br>
328 <textarea name=bar></textarea><br>
329 <textarea name=bar>';
330
331 "<input type="submit">"
332 Does nothing. The value for submit should typically be set by the
333 templating system or application system.
334
335 "<input type="button">"
336 Same as submit.
337
339 Because there are too many problems that could occur with html comments
340 and javascript, form_fill temporarily removes them during the fill.
341 You may disable this behavior by setting $REMOVE_COMMENT and
342 $REMOVE_SCRIPT to 0 before calling form_fill. The main reason for
343 doing this would be if you wanted to have form elements inside the
344 javascript and comments get filled. Disabling the removal only results
345 in a speed increase of 5%. The function uses \0COMMENT\0 and \0SCRIPT\0
346 as placeholders so it would be good to avoid these in your text
347 (Actually they may be reset to whatever you'd like via $MARKER_COMMENT
348 and $MARKER_SCRIPT).
349
351 "html_escape"
352 Very minimal entity escaper for filled in values.
353
354 my $escaped = html_escape($unescaped);
355
356 html_escape(\$text_to_escape);
357
358 "get_tagval_by_key"
359 Get a named value for from an html tag (key="value" pairs).
360
361 my $val = get_tagval_by_key(\$tag, $key);
362 my $valsref = get_tagval_by_key(\$tag, $key, 'all'); # get all values
363
364 "swap_tagval_by_key"
365 Swap out values in an html tag (key="value" pairs).
366
367 my $count = swap_tagval_by_key(\$tag, $key, $val); # modify ref
368 my $newtag = swap_tagval_by_key($tag, $key, $val); # copies tag
369
371 This module may distributed under the same terms as Perl itself.
372
374 Paul Seamons <perl at seamons dot com>
375
376
377
378perl v5.30.1 2020-01-29 CGI::Ex::Fill(3)