File Coverage

blib/lib/HTML/EasyTags.pm
Criterion Covered Total %
statement 136 138 98.5
branch 59 62 95.1
condition 21 23 91.3
subroutine 15 16 93.7
pod 10 10 100.0
total 241 249 96.7


" being
line stmt bran cond sub pod time code
1             =head1 NAME
2              
3             HTML::EasyTags - Make well-formed XHTML or HTML 4 tags, lists
4              
5             =cut
6              
7             ######################################################################
8              
9             package HTML::EasyTags;
10             require 5.004;
11              
12             # Copyright (c) 1999-2003, Darren R. Duncan. All rights reserved. This module
13             # is free software; you can redistribute it and/or modify it under the same terms
14             # as Perl itself. However, I do request that this copyright information and
15             # credits remain attached to the file. If you modify this module and
16             # redistribute a changed version then please attach a note listing the
17             # modifications. This module is available "as-is" and the author can not be held
18             # accountable for any problems resulting from its use.
19              
20 1     1   1937 use strict;
  1         2  
  1         5610  
21 1     1   16 use warnings;
  1         2  
  1         54  
22 1     1   186 use vars qw($VERSION $AUTOLOAD);
  1         8  
  1         3644  
23             $VERSION = '1.071';
24              
25             ######################################################################
26              
27             =head1 DEPENDENCIES
28              
29             =head2 Perl Version
30              
31             5.004
32              
33             =head2 Standard Modules
34              
35             I
36              
37             =head2 Nonstandard Modules
38              
39             I
40              
41             =head1 SYNOPSIS
42              
43             use HTML::EasyTags;
44              
45             my $html = HTML::EasyTags->new();
46             $html->groups_by_default( 1 );
47              
48             print
49             $html->start_html(
50             'This Is My Page',
51             $html->style( { type => 'text/css' },
52             $html->comment_tag( <<__endquote ) ),
53             \nbody {
54             background-color: #ffffff;
55             background-image: none;
56             }
57             __endquote
58             ),
59             $html->h1( 'A Simple Example' ),
60             $html->p(
61             "Click " .
62             $html->a( href => 'http://search.cpan.org', text => 'here' ) .
63             " for more."
64             ),
65             $html->hr,
66             $html->table(
67             $html->tr( [
68             $html->th( [ 'Name', 'Count', 'URL', 'First Access' ] ),
69             $html->td( [ 'Old Page', 33, 'http://www.domain.com',
70             '1999/04/23 13:55:02' ] )
71             ] )
72             ),
73             $html->hr,
74             $html->form_start( method => 'post', action => 'http://localhost' ),
75             $html->p(
76             "What's your name? " .
77             $html->input( type => 'text', name => 'name' )
78             ),
79             $html->p(
80             "What's the combination?" .
81             $html->input_group(
82             -type => 'checkbox',
83             -name => 'words',
84             -value => ['eenie', 'meenie', 'minie', 'moe'],
85             -checked => [1, 0, 1, 0],
86             -text => ['Eenie', 'Meenie', 'Minie', 'Moe'] ),
87             ),
88             $html->p(
89             "What's your favorite colour? " .
90             $html->select_start( -size => 1, -name => 'color' ) .
91             $html->option_group(
92             -value => ['red', 'green', 'blue', 'chartreuse'],
93             -text => ['Red', 'Green', 'Blue', 'Chartreuse'] ) .
94             $html->select_end
95             ),
96             $html->input( type => 'submit' ),
97             $html->form_end,
98             $html->end_html;
99              
100             =head1 DESCRIPTION
101              
102             This Perl 5 object class can be used to generate any well-formed XHTML or HTML
103             tags in a format that is consistent with the W3C XHTML 1.0 or HTML 4.01
104             standards. See B and B
105             for references. There are no restrictions on what tags are named, however; you
106             can ask for any new or unsupported tag that comes along from Netscape or
107             Microsoft, and it will be made. Additionally, you can generate lists of said
108             tags with one method call, or just parts of said tags (but not both at once).
109              
110             This module's purpose is to be lightweight, easy to use, and whose results are
111             well-formed and pretty-printed (should humans wish to read or debug
112             it). At the same time, it is supportive of your existing knowledge of HTML and
113             as such its interface closely mirrors the actual appearance of the resulting
114             tags. This means that methods have the same name as the actual tags, and named
115             parameters that you pass correspond directly to the tag attributes produced.
116             This module saves you having to remember the little details on formatting. For
117             your convenience, a majority of the methods and their arguments are
118             backwards-compatible with those in CGI.pm, but you are saved 200K of code size.
119              
120             As a reference, I strongly recommend that you check out B
121             excellent "The Bare Bones Guide to HTML", which is available at
122             B. I found this document invaluable when making
123             this module, as it provides a comprehensive list of all the HTML tags along with
124             their formatting and extensions.
125              
126             In this implementation, "well formed" means that tags are made as pairs by
127             default, which look like "", unless they are known to be "no pair"
128             tags, in which case they look like "". Tags that I know to be "no pair"
129             are [basefont, img, area, param, br, hr, input, option, tbody, frame, comment,
130             isindex, base, link, meta]. However, you can force any tag to be "pair" or
131             "start only" or "end only" by appropriately modifying your call to the tag making
132             method.
133              
134             Also, "well formed" means that tag attributes are formatted as "key=value". While
135             the HTML standard allowed there to be "no value" attributes, XHTML does not.
136             These were formatted simply as "key" because their very presence indicates
137             positive assertion, while their absense means otherwise. Before release 1-06,
138             attributes that were known to be "no value" attributes were formatted as "key" by
139             default. Modifiers that I know to be "no value" are [ismap, noshade, compact,
140             checked, multiple, selected, nowrap, noresize, param]. As of release 1-06, "no
141             value" attributes are formatted as 'key="1"' when they are true and they are
142             absent when false, to keep backwards compatability. "Well formed" means that
143             attribute values will always become bounded by quotes, which ensures they work
144             with both string and numerical quantities (eg: key="value").
145              
146             Convenience methods start_html() and end_html() are provided to generate the
147             required HTML that appears above and below your content; however, you can still
148             make said HTML one tag at a time if you wish.
149              
150             =head1 HTML CODE FROM SYNOPSIS PROGRAM
151              
152            
153            
154            
155             This Is My Page
156            
163            
164            
165            

A Simple Example

166            

Click

167             here for more.

168            
169            
170            
171             Name
172             Count
173             URL
174             First Access
175            
176             Old Page
177             33
178             http://www.domain.com
179             1999/04/23 13:55:02
180            
181            
182            

What's your name?

183            

184            

What's the combination?

185             Eenie
186             Meenie
187             Minie
188             Moe

189            

What's your favorite colour?

190            
191            
192            
193            
194            
195            

196            
197            
198            
199            
200              
201             =cut
202              
203             ######################################################################
204              
205             # Names of properties for objects of this class are declared here:
206             my $KEY_AUTO_GROUP = 'auto_group'; # do we make tag groups by default?
207             my $KEY_PROLOGUE = 'prologue'; # special prologue starting every html page
208              
209             # These extra tag properties work only with AUTOLOAD:
210             my $PARAM_TEXT = 'text'; #tag pair is wrapped around this
211             my $PARAM_LIST = 'list'; #force tag groups to be returned in ARRAY ref
212              
213             # Constant values used in this class go here:
214              
215             my $TAG_GROUP = 'group'; # values that "what_to_make" can have
216             my $TAG_PAIR = 'pair'; # this one looks like ""
217             my $TAG_START = 'start'; # this one looks like ""
218             my $TAG_END = 'end'; # this one looks like ""
219             my $TAG_MINI = 'mini'; # this one stands for "minimized" or ""
220              
221             my %NO_PAIR_TAGS = ( # comments correspond to Bare Bones sections
222             basefont => 1, # PRESENTATION FORMATTING
223             img => 1, # LINKS, GRAPHICS, AND SOUNDS
224             area => 1, # LINKS, GRAPHICS, AND SOUNDS
225             param => 1, # LINKS, GRAPHICS, AND SOUNDS
226             br => 1, # DIVIDERS
227             hr => 1, # DIVIDERS
228             input => 1, # FORMS
229             option => 1, # FORMS
230             tbody => 1, # TABLES
231             frame => 1, # FRAMES
232             comment => 1, # MISCELLANEOUS
233             isindex => 1, # MISCELLANEOUS
234             base => 1, # MISCELLANEOUS
235             'link' => 1, # MISCELLANEOUS
236             meta => 1, # MISCELLANEOUS
237             );
238              
239             my %NO_VALUE_PARAMS = ( # comments correspond to Bare Bones sections
240             ismap => 1, # LINKS, GRAPHICS, AND SOUNDS
241             noshade => 1, # DIVIDERS
242             compact => 1, # LISTS
243             checked => 1, # FORMS
244             multiple => 1, # FORMS
245             selected => 1, # FORMS
246             nowrap => 1, # TABLES
247             noresize => 1, # FRAMES
248             param => 1, # SCRIPTS AND JAVA
249             );
250              
251             my %PARAMS_PRECEDENCE = ( # larger number means goes first; undef last
252             method => 190,
253             action => 185,
254             type => 180,
255             name => 175,
256             width => 170,
257             height => 165,
258             rows => 160,
259             cols => 155,
260             border => 150,
261             cellspacing => 145,
262             cellpadding => 140,
263             multiple => 135,
264             checked => 130,
265             selected => 125,
266             value => 120,
267             target => 115,
268             rev => 113,
269             rel => 112,
270             href => 110,
271             src => 105,
272             alt => 100,
273             );
274              
275             ######################################################################
276              
277             =head1 SYNTAX
278              
279             This class does not export any functions or methods, so you need to call them
280             using object notation. This means using Bfunction()> for functions
281             and B<$object-Emethod()> for methods. If you are inheriting this class for
282             your own modules, then that often means something like B<$self-Emethod()>.
283              
284             Methods of this class always "return" their results, rather than printing them
285             out to a file or the screen. Not only is this simpler, but it gives the calling
286             code the maximum amount of control over what happens in the program. They may
287             wish to do post-processing with the generated HTML, or want to output it in a
288             different order than it is generated. By default, all results are returned as a
289             scalar, but methods which generate a list of tags can optionally return an ARRAY
290             ref, with each element containing a single tag. This can aid in post-processing
291             and possibly speed up the program because there is less copying done.
292              
293             Through the magic of autoloading, this class can make any html tag by calling a
294             class method with the same name as the tag you want. For examples, use "hr()" to
295             make a "
" tag, or "p('text')" to make "

text

". This also means that if
296             you mis-spell any method name, it will still make a new tag with the mis-spelled
297             name. For autoloaded methods only, the method names are case-insensitive.
298              
299             If you call a class method whose name ends in either of ['_start', '_end',
300             '_pair', '_mini'], this will be interpreted as an instruction to make just part
301             of one tag whose name are the part of the method name preceeding that suffix.
302             For example, calling "p_start( 'text' )" results in "

text" rather than

303             "

text

". Similarly, calling "p_end()" will generate a "

" only. Using
304             the '_pair' suffix will force tags to be made as a pair, whether or not they
305             would do so naturally. For example, calling "br_pair" would produce a
306             "

" rather than the normal "
". Calling "p_mini( 'text' )" results
307             in "

text". When using either of ['_start', '_pair', '_mini'], the arguments

308             you pass the method are exactly the same as the unmodified method would use, and
309             there are no other symantec differences. However, when using the '_end' suffix,
310             any arguments are ignored, as the latter member of a tag pair never carries any
311             attributes anyway.
312              
313             If you call a class method whose name ends in "_group", this will be interpreted
314             as an instruction to make a list of tags whose name are the part of the method
315             name preceeding the "_group". For example, calling "td_group(
316             ['here','we','are'] )" results in "hereweare
317             generated. The arguments that you call this method are exactly the same as for
318             calling a method to make a single tag of the same name, except that the extra
319             optional parameter "list" can be used to force an ARRAY ref of the new tags to be
320             returned instead of a scalar. The symantec difference is that any arguments
321             whose values are ARRAY refs are interpreted as a list of values where each one is
322             used in a separate tag; for a single tag, the literal ARRAY ref itself would be
323             used. The number of tags produced is equal to the length of the longest ARRAY
324             ref passed as an argument. For any other arguments who have fewer than this
325             count, their last value is replicated and appended enough times as necessary to
326             make them the same length. The value of a scalar argument is used for all the
327             tags. For example, calling "input_group( type => checkbox, name => 'letters',
328             value => ['a','b','c'] )" produces '
329             VALUE="a">
330             NAME="letters" VALUE="c">'.
331              
332             All autoloaded methods require their parameters to be in named format. These
333             names and values correspond to attribute names and values for the new tags.
334             Since "no value" attributes are essentially booleans, they can have any true or
335             false value associated with them in the parameter list, which won't be printed.
336             If an autoloaded method is passed exactly one parameter, it will be interpreted
337             as the "text" that goes between the tag pair (text) or after "start
338             tags" (text). The same result can be had explicitely by passing the named
339             parameter "text". The names of any named parameters can upper or lower or
340             mixed case, as is your preference, and optionally start with a "-".
341              
342             All static (non-autoloaded) methods require positional parameters.
343              
344             =cut
345              
346             ######################################################################
347             # All HTML tags have a method of this class associated with them.
348              
349             sub AUTOLOAD {
350 64     64   1626 my $self = shift( @_ );
351 64         686 $AUTOLOAD =~ m/([^:]*)$/; # we don't need fully qualified name
352 64         196 my $called_sub_name = $1;
353              
354             # Autoloaded subroutines are in the form "tagname_part" or "tagname_group"
355             # where "tagname" is the literal html tag to make and "part" says to force
356             # a certain form of the tag; "group" says make several tags in standard form.
357              
358 64         168 my ($tag_name, $what_to_make) = split( '_', lc( $called_sub_name ), 2 );
359 64   100     185 $what_to_make ||= '';
360              
361             # Determine what part of the html tag to make.
362              
363 64 100       412 unless( $what_to_make =~
364             /^($TAG_GROUP|$TAG_PAIR|$TAG_START|$TAG_END|$TAG_MINI)$/ ) {
365 16 100       38 if( $self->{$KEY_AUTO_GROUP} ) {
366 1         2 $what_to_make = $TAG_GROUP;
367             } else {
368 15         24 $what_to_make = '';
369             }
370             }
371              
372             # Fetch our arguments, which may be in a variety of formats, and extract
373             # special ones so that they are treated different than others.
374              
375 64         168 my $rh_params = $self->_params_to_hash( \@_ );
376 64         117 my $ra_text = delete( $rh_params->{$PARAM_TEXT} ); # visible text
377 64         92 my $force_list = delete( $rh_params->{$PARAM_LIST} ); # keep tags separate
378              
379             # Here we make a group of related html tags; the group may have one member
380              
381 64 100       131 if( $what_to_make eq $TAG_GROUP ) {
382 5         13 return( $self->make_html_tag_group(
383             $tag_name, $rh_params, $ra_text, $force_list ) );
384             }
385              
386             # Here we make a single html tag, or parts of one
387              
388 59         126 return( $self->make_html_tag(
389             $tag_name, $rh_params, $ra_text, $what_to_make ) );
390             }
391              
392             # This is provided so AUTOLOAD isn't called instead.
393 0     0   0 sub DESTROY {}
394              
395             ######################################################################
396              
397             =head1 FUNCTIONS AND METHODS
398              
399             Note that all the methods defined below are static, so information specific to
400             autoloaded methods won't likely apply to them. All of these methods take
401             positional arguments.
402              
403             =head2 new()
404              
405             This function creates a new HTML::EasyTags object (or subclass thereof) and
406             returns it.
407              
408             =cut
409              
410             ######################################################################
411              
412             sub new {
413 8     8 1 2020 my $class = shift( @_ );
414 8   33     60 my $self = bless( {}, ref($class) || $class );
415 8         24 $self->initialize( @_ );
416 8         18 return( $self );
417             }
418              
419             ######################################################################
420              
421             =head2 initialize()
422              
423             This method is used by B to set the initial properties of an object,
424             that it creates. All page attributes are wiped clean, resulting in an empty
425             page.
426              
427             =cut
428              
429             ######################################################################
430              
431             sub initialize {
432 8     8 1 13 my $self = shift( @_ );
433 8         28 $self->{$KEY_AUTO_GROUP} = 0;
434 8         23 $self->{$KEY_PROLOGUE} =
435             "\n".'';
436             }
437              
438             ######################################################################
439              
440             =head2 clone([ CLONE ])
441              
442             This method initializes a new object to have all of the same properties of the
443             current object and returns it. This new object can be provided in the optional
444             argument CLONE (if CLONE is an object of the same class as the current object);
445             otherwise, a brand new object of the current class is used. Only object
446             properties recognized by HTML::EasyTags are set in the clone; other properties
447             are not changed.
448              
449             =cut
450              
451             ######################################################################
452              
453             sub clone {
454 1     1 1 156 my ($self, $clone, @args) = @_;
455 1 50       7 ref($clone) eq ref($self) or $clone = bless( {}, ref($self) );
456              
457 1         4 $clone->{$KEY_AUTO_GROUP} = $self->{$KEY_AUTO_GROUP};
458 1         3 $clone->{$KEY_PROLOGUE} = $self->{$KEY_PROLOGUE};
459              
460 1         3 return( $clone );
461             }
462              
463             ######################################################################
464              
465             =head2 groups_by_default([ VALUE ])
466              
467             This method is an accessor for the boolean "automatic grouping" property of this
468             object, which it returns. If VALUE is defined, this property is set to it. In
469             cases where we aren't told explicitely that autoloaded methods are making a
470             single or multiple tags (using ['_start', '_end', '_pair', '_mini'] and '_group'
471             respectively), we look to this property to determine what operation we guess.
472             The default is "single". When this property is true, we can make both single and
473             groups of tags by using a suffix-less method name; however, making single tags
474             this way is slower than when this property is false. Also, be aware that when we
475             are making a "group", arguments that are ARRAY refs are always flattened, and
476             when we are making a "single", ARRAY ref arguments are always used literally.
477              
478             =cut
479              
480             ######################################################################
481              
482             sub groups_by_default {
483 6     6 1 741 my $self = shift( @_ );
484 6 100       17 if( defined( my $new_value = shift( @_ ) ) ) {
485 4         9 $self->{$KEY_AUTO_GROUP} = $new_value;
486             }
487 6         19 return( $self->{$KEY_AUTO_GROUP} );
488             }
489              
490             ######################################################################
491              
492             =head2 prologue_tag([ VALUE ])
493              
494             This method is an accessor for the scalar "prologue tag" property of this object,
495             which it returns. If VALUE is defined, this property is set to it. This property
496             is meant to be used literally and be the very first thing in an XHTML or HTML
497             document. It tells the web browser such things as what version of the HTML
498             standard we are adhering to. Citing backwards compatability with earlier
499             versions of this class, the default prologue tag we make is for HTML version 4.0
500             and looks like ''.
501              
502             =cut
503              
504             ######################################################################
505              
506             sub prologue_tag {
507 11     11 1 478 my $self = shift( @_ );
508 11 100       34 if( defined( my $new_value = shift( @_ ) ) ) {
509 1         3 $self->{$KEY_PROLOGUE} = $new_value;
510             }
511 11         66 return( $self->{$KEY_PROLOGUE} );
512             }
513              
514             ######################################################################
515              
516             =head2 comment_tag( TEXT )
517              
518             This method returns a comment tag, which is only visible to people viewing the
519             HTML source of a document, and not otherwise. It can take either a scalar or a
520             list or an Array ref as its TEXT argument. If a single item of text is passed,
521             then a comment tag that looks like "" is made. If more than one
522             item of text is passed, then a multi-line comment is made, which has each item of
523             text on its own line and indented with a single tab. The latter is suitable for
524             displaying CSS or JavaScript code in an elegant manner.
525              
526             =cut
527              
528             ######################################################################
529              
530             sub comment_tag {
531 3     3 1 326 my $self = shift( @_ );
532 3 100       12 my @text = (ref($_[0]) eq 'ARRAY') ? @{$_[0]} : @_;
  1         3  
533 3 100       7 if( scalar( @text ) <= 1 ) {
534 2         8 return( "\n" );
535             } else {
536 1         6 return( "\n" );
537             }
538             }
539              
540             ######################################################################
541              
542             =head2 make_html_tag( NAME[, PARAMS[, TEXT[, PART]]] )
543              
544             This method is used internally to do the actual construction of single html tags.
545             You can call it directly when you want faster code and/or more control over how
546             tags are made. The first argument, NAME, is a scalar that defines the actual
547             name of the tag we are making (eg: 'br'); it is case-insensitive. The optional
548             second argument, PARAMS, is a HASH ref containing attribute names and values for
549             the new tag; the names (keys) are case-insensitive. The attribute values are all
550             printed literally, so they should be scalars. The optional third argument, TEXT,
551             is a scalar containing the text that goes between the tag pairs; it is not a tag
552             attribute. The optional fourth argument, PART, is a scalar which indicates we
553             should make just a certain part of the tag; acceptable values are ['pair',
554             'start', 'end'], and it is case-insensitive. This method knows which HTML tags
555             are normally paired or not, which tag attributes take specified values or not,
556             and acts accordingly.
557              
558             =cut
559              
560             ######################################################################
561              
562             sub make_html_tag {
563 83     83 1 7442 my $self = shift( @_ );
564              
565             # Fetch our arguments
566              
567 83         293 my $tag_name = lc(shift( @_ )); # lowercase to match our lookup tables
568 83         107 my $rh_params = shift( @_ );
569 83         103 my $text = shift( @_ );
570 83 100       198 defined( $text ) or $text = ''; # avoid warnings
571 83         7164 my $what_to_make = lc(shift( @_ )); # lowercase to match our lookup tables
572              
573             # Make sure our tag params argument is lowercased, to match our lookup tables
574              
575 18         110 my %tag_params = map { ( lc($_) => $rh_params->{$_} ) }
  66         207  
576 83 100       241 (ref($rh_params) eq 'HASH') ? (keys %{$rh_params}) : ();
577              
578             # Determine what part of the html tag to make
579              
580 83 100       782 unless( $what_to_make =~ /^($TAG_PAIR|$TAG_START|$TAG_END|$TAG_MINI)$/ ) {
581 31 100       94 $what_to_make = $NO_PAIR_TAGS{$tag_name} ? $TAG_MINI : $TAG_PAIR;
582             }
583              
584             # Shortcut - if we're making just an end tag, there are no args or text
585              
586 83 100       194 if( $what_to_make eq $TAG_END ) {
587 16         149 return( "\n" );
588             }
589              
590             # Assemble the html tag attributes, ordered with more important on the left
591              
592 67         88 my $param_str = '';
593 67   100     390 foreach my $param ( sort {
  14   100     96  
594             ($PARAMS_PRECEDENCE{$b} || 0) <=> ($PARAMS_PRECEDENCE{$a} || 0)
595             } keys %tag_params ) {
596              
597             # Some tag attributes assert true simply by their names being present.
598             # Therefore, omit these if their values are false.
599              
600 18 100 100     108 next if( $NO_VALUE_PARAMS{$param} and !$tag_params{$param} );
601              
602             # Show names of attributes that display with values or are true
603             # Show values of attributes that display with values, in quotes
604              
605 17         64 $param_str .= " $param=\"$tag_params{$param}\"";
606             }
607              
608             # Here we make just a minimized tag with attributes and text
609              
610 67 100       307 if( $what_to_make eq $TAG_MINI ) {
611 11         82 return( "\n<$tag_name$param_str />$text" );
612             }
613              
614             # Here we make just a start tag with attributes and text
615              
616 56 100       114 if( $what_to_make eq $TAG_START ) {
617 31         294 return( "\n<$tag_name$param_str>$text" );
618             }
619              
620             # Here we make both start and end tags, with attributes and text
621              
622 25         300 return( "\n<$tag_name$param_str>$text" );
623             }
624              
625             ######################################################################
626              
627             =head2 make_html_tag_group( NAME[, PARAMS[, TEXT[, LIST]]] )
628              
629             This method is used internally to do the actual construction of html tag groups.
630             You can call it directly when you want faster code and/or more control over how
631             tags are made. The first argument, NAME, is a scalar that defines the actual
632             name of the tag we are making (eg: 'br'); it is case-insensitive. The optional
633             second argument, PARAMS, is a HASH ref containing attribute names and values for
634             the new tag; the names (keys) are case-insensitive. Any attribute values which
635             are ARRAY refs are flattened, and the number of tags made is determined by the
636             length of the longest one. The optional third argument, TEXT, is a HASH ref (or
637             scalar) containing the text that goes between the tag pairs; it is not a tag
638             attribute, but if its an ARRAY ref then its length will influence the number of
639             tags that are made as the length of tag attribute arrays do. The optional fourth
640             argument, LIST, is a boolean/scalar which indicates whether this method returns
641             the new tags in an ARRAY ref (one tag per element) or as a scalar (tags are
642             concatenated together); a true value forces an ARRAY ref, scalar is the default.
643             This method knows which HTML tags are normally paired or not, which tag
644             attributes take specified values or not, and acts accordingly.
645              
646             =cut
647              
648             ######################################################################
649              
650             sub make_html_tag_group {
651 27     27 1 5574 my $self = shift( @_ );
652              
653             # Fetch our arguments
654              
655 27         155 my $tag_name = lc(shift( @_ )); # lowercase to match our lookup tables
656 27         54 my $rh_params = shift( @_ );
657 27         41 my $text_in = shift( @_ );
658 27         42 my $force_list = shift( @_ );
659              
660             # Make sure our tag params argument is lowercased, to match our lookup tables
661              
662 21         109 my %tag_params = map { ( lc($_) => $rh_params->{$_} ) }
  15         66  
663 27 100       138 (ref($rh_params) eq 'HASH') ? (keys %{$rh_params}) : ();
664              
665             # Prepare to normalize the count of text values with other attributes
666              
667 27         79 $tag_params{$PARAM_TEXT} = $text_in;
668              
669             # Ensure that all tag attribute values are in arrays for consistency.
670             # Also, determine the maximum value count of any attribute.
671             # This count determines the count of html tags that we will make.
672              
673 27         39 my $max_tag_ind = 0;
674 27         76 foreach my $key (keys %tag_params) {
675 48         102 my $ra_values = $tag_params{$key};
676 48 100       156 unless( ref($ra_values) eq 'ARRAY' ) {
677 34         99 $tag_params{$key} = [$ra_values];
678 34         100 next;
679             }
680 14 100       17 if( $#{$ra_values} > $max_tag_ind ) {
  14         103  
681 11         15 $max_tag_ind = $#{$ra_values};
  11         36  
682             }
683             }
684              
685             # Ensure that all tag attribute arrays are the same length by taking any
686             # which are shorter than the longest and extending them; the inserted values
687             # are copies of the value currently in the highest element of that array.
688              
689 27         75 foreach my $ra_values (values %tag_params) {
690 48         80 my $last_value = $ra_values->[-1];
691 48         87 push( @{$ra_values},
  16         46  
692 48         63 map { $last_value } (($#{$ra_values} + 1)..$max_tag_ind) );
  48         155  
693             }
694              
695             # Now put the text back where it belongs; its value count is now normalized
696              
697 27         68 my $ra_text = delete( $tag_params{$PARAM_TEXT} );
698              
699             # Get list of html tag attribute names, ordered with more important on left
700              
701 27   100     97 my @param_seq = sort { ($PARAMS_PRECEDENCE{$b} || 0)
  16   100     148  
702             <=> ($PARAMS_PRECEDENCE{$a} || 0) } keys %tag_params;
703              
704             # Declare the destination variable we will output
705              
706 27         51 my @new_tags = ();
707              
708             # This loop iterates for the count of html tags we will make.
709             # The loop counter, $index, is used to lookup elements in value arrays
710             # that go with each tag attribute and visible text for that tag.
711              
712 27         70 foreach my $index (0..$max_tag_ind) {
713 47         69 my $param_str = '';
714              
715             # This loop iterates over the attributes that each tag would have.
716              
717 47         83 foreach my $param ( @param_seq ) {
718              
719             # Some tag attributes assert true simply by their names being present
720             # Therefore, omit these if their values are false.
721              
722 44 100 100     170 next if( $NO_VALUE_PARAMS{$param} and
723             !$tag_params{$param}->[$index] );
724              
725             # Show names of attributes that display with values or are true
726             # Show values of attributes that display with values, in quotes
727              
728 39         138 $param_str .= " $param=\"$tag_params{$param}->[$index]\"";
729             }
730              
731             # Get the visible text for the tag.
732              
733 47 100       164 my $text = defined( $ra_text->[$index] ) ? $ra_text->[$index] : '';
734              
735             # Here we make just a minimized tag with attributes and text
736              
737 47 100       112 if( $NO_PAIR_TAGS{$tag_name} ) {
738 18         73 push( @new_tags, "\n<$tag_name$param_str />$text" );
739              
740             # Here we make both start and end tags, with attributes and text
741              
742             } else {
743 29         121 push( @new_tags, "\n<$tag_name$param_str>$text" );
744             }
745             }
746              
747             # Return all of the new tags as either a list (array ref) or a single scalar
748              
749 27 100       265 return( $force_list ? \@new_tags : join( '', @new_tags ) );
750             }
751              
752             ######################################################################
753              
754             =head2 start_html([ TITLE[, HEAD[, BODY[, FRAMESET]]] ])
755              
756             This method returns a canned HTML template that is suitable for use as the top of
757             an HTML page. It consists of the prologue tag (
758             tag, the entire 'head' section, and the opening 'body' tag. The prologue tag
759             looks the same as that generated by the class method prologue_tag(). The first
760             optional argument, TITLE, is a scalar which defines the title for the document,
761             and its default value is 'Untitled Document'. The second argument, HEAD, is an
762             Array ref (or scalar) containing anything else you would like to appear in the
763             'head' section; it is flattened and the elements used as-is. The third argument,
764             BODY, is a Hash ref containing attributes and values for the opening 'body' tag.
765             As of release 1.05 this class supports frameset documents as well as normal HTML.
766             If the fourth argument, FRAMESET, is true, then it is assumed we will be making a
767             frameset document, whereby the body section is wrapped in a pair and </td> </tr> <tr> <td class="h" > <a name="768">768</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> there is a <frameset> pair between the head and noframes/body sections. FRAMESET </td> </tr> <tr> <td class="h" > <a name="769">769</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> is a Hash ref that contains the attributes and values that go in the opening </td> </tr> <tr> <td class="h" > <a name="770">770</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> frameset tag (analogous to BODY argument), except that a 'text' attribute will be </td> </tr> <tr> <td class="h" > <a name="771">771</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> resolved into the text that goes inside the frameset pair, as with any autoloaded </td> </tr> <tr> <td class="h" > <a name="772">772</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> tag methods. So the 'text' attribute of FRAMESET is where the "frame" tag html </td> </tr> <tr> <td class="h" > <a name="773">773</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> that you previously rendered goes. If FRAMESET is true but not a hash, it will </td> </tr> <tr> <td class="h" > <a name="774">774</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> be taken literally as 'text' likewise as with autoloaded methods. </td> </tr> <tr> <td class="h" > <a name="775">775</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="776">776</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> =cut </td> </tr> <tr> <td class="h" > <a name="777">777</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="778">778</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> ###################################################################### </td> </tr> <tr> <td class="h" > <a name="779">779</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="780">780</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> sub start_html { </td> </tr> <tr> <td class="h" > <a name="781">781</a> </td> <td class="c3" > 8 </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="c3" > <a href="blib-lib-HTML-EasyTags-pm--subroutine.html#781-1"> 8 </a> </td> <td class="c3" > <a href="blib-lib-HTML-EasyTags-pm--subroutine.html#781-1"> 1 </a> </td> <td > 1954 </td> <td class="s"> my ($self, $title, $ra_head, $rh_body, $rh_frameset) = @_; </td> </tr> <tr> <td class="h" > <a name="782">782</a> </td> <td class="c0" > 0 </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 0 </td> <td class="s"> return( join( '', </td> </tr> <tr> <td class="h" > <a name="783">783</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> $self->prologue_tag(), </td> </tr> <tr> <td class="h" > <a name="784">784</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> $self->html_start(), </td> </tr> <tr> <td class="h" > <a name="785">785</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> $self->head_start(), </td> </tr> <tr> <td class="h" > <a name="786">786</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> $self->title( $title || 'Untitled Document' ), </td> </tr> <tr> <td class="h" > <a name="787">787</a> </td> <td class="c3" > 8 </td> <td class="c0" > <a href="blib-lib-HTML-EasyTags-pm--branch.html#787-1"> 50 </a> </td> <td class="c3" > <a href="blib-lib-HTML-EasyTags-pm--condition.html#787-1"> 100 </a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 25 </td> <td class="s"> ref( $ra_head ) eq 'ARRAY' ? @{$ra_head} : ($ra_head || ''), </td> </tr> <tr> <td class="h" > <a >&nbsp;</a> </td> <td > &nbsp; </td> <td class="c3" > <a href="blib-lib-HTML-EasyTags-pm--branch.html#-2"> 100 </a> </td> <td class="c3" > <a href="blib-lib-HTML-EasyTags-pm--condition.html#-2"> 100 </a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="788">788</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> $self->head_end(), </td> </tr> <tr> <td class="h" > <a name="789">789</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> $rh_frameset ? ( </td> </tr> <tr> <td class="h" > <a name="790">790</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> $self->frameset( $rh_frameset ), </td> </tr> <tr> <td class="h" > <a name="791">791</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> $self->noframes_start(), </td> </tr> <tr> <td class="h" > <a name="792">792</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> ) : (), </td> </tr> <tr> <td class="h" > <a name="793">793</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> $self->body_start( $rh_body ), </td> </tr> <tr> <td class="h" > <a name="794">794</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> ) ); </td> </tr> <tr> <td class="h" > <a name="795">795</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="796">796</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="797">797</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> ###################################################################### </td> </tr> <tr> <td class="h" > <a name="798">798</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="799">799</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> =head2 end_html([ FRAMESET ]) </td> </tr> <tr> <td class="h" > <a name="800">800</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="801">801</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> This method returns a canned HTML template that is suitable for use as the bottom </td> </tr> <tr> <td class="h" > <a name="802">802</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> of an HTML page. It consists of the closing 'body' and 'html' tags. </td> </tr> <tr> <td class="h" > <a name="803">803</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> As of release 1.05 this class supports frameset documents as well as normal HTML. </td> </tr> <tr> <td class="h" > <a name="804">804</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> If the optional argument FRAMESET is true, then there is a closing 'noframes' tag </td> </tr> <tr> <td class="h" > <a name="805">805</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> between the closing 'body' and 'html' tags. </td> </tr> <tr> <td class="h" > <a name="806">806</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="807">807</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> =cut </td> </tr> <tr> <td class="h" > <a name="808">808</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="809">809</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> ###################################################################### </td> </tr> <tr> <td class="h" > <a name="810">810</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="811">811</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> sub end_html { </td> </tr> <tr> <td class="h" > <a name="812">812</a> </td> <td class="c3" > 2 </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="c3" > <a href="blib-lib-HTML-EasyTags-pm--subroutine.html#812-1"> 2 </a> </td> <td class="c3" > <a href="blib-lib-HTML-EasyTags-pm--subroutine.html#812-1"> 1 </a> </td> <td > 269 </td> <td class="s"> my ($self, $is_frameset) = @_; </td> </tr> <tr> <td class="h" > <a name="813">813</a> </td> <td class="c3" > 2 </td> <td class="c3" > <a href="blib-lib-HTML-EasyTags-pm--branch.html#813-1"> 100 </a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 21 </td> <td class="s"> return( join( '', </td> </tr> <tr> <td class="h" > <a name="814">814</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> $self->body_end(), </td> </tr> <tr> <td class="h" > <a name="815">815</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> $is_frameset ? $self->noframes_end() : (), </td> </tr> <tr> <td class="h" > <a name="816">816</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> $self->html_end(), </td> </tr> <tr> <td class="h" > <a name="817">817</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> ) ); </td> </tr> <tr> <td class="h" > <a name="818">818</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="819">819</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="820">820</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> ###################################################################### </td> </tr> <tr> <td class="h" > <a name="821">821</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> # _params_to_hash( ARGS ) </td> </tr> <tr> <td class="h" > <a name="822">822</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> # This private method cleans up the argument lists passed to autoloaded html </td> </tr> <tr> <td class="h" > <a name="823">823</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> # tag making methods and returns the named arguments in a hash. Input arguments, </td> </tr> <tr> <td class="h" > <a name="824">824</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> # provided in ARGS, are usually in named format, and the names can be any case or </td> </tr> <tr> <td class="h" > <a name="825">825</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> # optionally begin with a "-". We know that ARGS is named format if the first </td> </tr> <tr> <td class="h" > <a name="826">826</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> # element is a hash ref or there is more than one element; ARGS is not in named </td> </tr> <tr> <td class="h" > <a name="827">827</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> # format if there is only one element and it is not a hash ref. In the second </td> </tr> <tr> <td class="h" > <a name="828">828</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> # case this single element is implicitely named 'text' and returned that way. </td> </tr> <tr> <td class="h" > <a name="829">829</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> # If the first ARGS element is a hash and there are more elements, then the </td> </tr> <tr> <td class="h" > <a name="830">830</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> # second one is implicitely named 'text' and inserted into the returned hash. </td> </tr> <tr> <td class="h" > <a name="831">831</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="832">832</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> sub _params_to_hash { </td> </tr> <tr> <td class="h" > <a name="833">833</a> </td> <td class="c3" > 64 </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="c3" > <a href="blib-lib-HTML-EasyTags-pm--subroutine.html#833-1"> 64 </a> </td> <td > &nbsp; </td> <td > 76 </td> <td class="s"> my ($self, $ra_params_in) = @_; </td> </tr> <tr> <td class="h" > <a name="834">834</a> </td> <td class="c3" > 64 </td> <td class="c3" > <a href="blib-lib-HTML-EasyTags-pm--branch.html#834-1"> 100 </a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 65 </td> <td class="s"> @{$ra_params_in} or return( {} ); </td> </tr> <tr> <td class="h" > <a >&nbsp;</a> </td> <td class="c3" > 64 </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 173 </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="835">835</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="836">836</a> </td> <td class="c3" > 31 </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 50 </td> <td class="s"> my %params_in = (); </td> </tr> <tr> <td class="h" > <a name="837">837</a> </td> <td class="c3" > 31 </td> <td class="c3" > <a href="blib-lib-HTML-EasyTags-pm--branch.html#837-1"> 100 </a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 66 </td> <td class="s"> if( ref( $ra_params_in->[0] ) eq 'HASH' ) { </td> </tr> <tr> <td class="h" > <a >&nbsp;</a> </td> <td class="c3" > 27 </td> <td class="c3" > <a href="blib-lib-HTML-EasyTags-pm--branch.html#-2"> 100 </a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 52 </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="838">838</a> </td> <td class="c3" > 4 </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 5 </td> <td class="s"> %params_in = %{$ra_params_in->[0]}; </td> </tr> <tr> <td class="h" > <a >&nbsp;</a> </td> <td class="c3" > 4 </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 14 </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="839">839</a> </td> <td class="c3" > 4 </td> <td class="c0" > <a href="blib-lib-HTML-EasyTags-pm--branch.html#839-1"> 50 </a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 6 </td> <td class="s"> @{$ra_params_in} > 1 and </td> </tr> <tr> <td class="h" > <a >&nbsp;</a> </td> <td class="c3" > 4 </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 13 </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="840">840</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> $params_in{$PARAM_TEXT} = $ra_params_in->[1]; </td> </tr> <tr> <td class="h" > <a name="841">841</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> } elsif( @{$ra_params_in} == 1 ) { </td> </tr> <tr> <td class="h" > <a name="842">842</a> </td> <td class="c3" > 22 </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 74 </td> <td class="s"> return( { $PARAM_TEXT => $ra_params_in->[0] } ); </td> </tr> <tr> <td class="h" > <a name="843">843</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> } else { </td> </tr> <tr> <td class="h" > <a name="844">844</a> </td> <td class="c3" > 5 </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 7 </td> <td class="s"> %params_in = @{$ra_params_in}; </td> </tr> <tr> <td class="h" > <a >&nbsp;</a> </td> <td class="c3" > 5 </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 20 </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="845">845</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="846">846</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="847">847</a> </td> <td class="c3" > 9 </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 14 </td> <td class="s"> my %params_out = (); </td> </tr> <tr> <td class="h" > <a name="848">848</a> </td> <td class="c3" > 9 </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 33 </td> <td class="s"> foreach my $key (sort keys %params_in) { </td> </tr> <tr> <td class="h" > <a name="849">849</a> </td> <td class="c3" > 18 </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 24 </td> <td class="s"> my $value = $params_in{$key}; </td> </tr> <tr> <td class="h" > <a name="850">850</a> </td> <td class="c3" > 18 </td> <td class="c3" > <a href="blib-lib-HTML-EasyTags-pm--branch.html#850-1"> 100 </a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 56 </td> <td class="s"> substr( $key, 0, 1 ) eq '-' and $key = substr( $key, 1 ); </td> </tr> <tr> <td class="h" > <a name="851">851</a> </td> <td class="c3" > 18 </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 45 </td> <td class="s"> $params_out{lc( $key )} = $value; </td> </tr> <tr> <td class="h" > <a name="852">852</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="853">853</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="854">854</a> </td> <td class="c3" > 9 </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 19 </td> <td class="s"> delete( $params_out{''} ); </td> </tr> <tr> <td class="h" > <a name="855">855</a> </td> <td class="c3" > 9 </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > 27 </td> <td class="s"> return( \%params_out ); </td> </tr> <tr> <td class="h" > <a name="856">856</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="857">857</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="858">858</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> ###################################################################### </td> </tr> <tr> <td class="h" > <a name="859">859</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> &nbsp; </td> </tr> <tr> <td class="h" > <a name="860">860</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> 1; </td> </tr> <tr> <td class="h" > <a name="861">861</a> </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td > &nbsp; </td> <td class="s"> __END__ </td> </tr> </table> </body> </html>