[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 package CGI::Pretty; 2 3 # See the bottom of this file for the POD documentation. Search for the 4 # string '=head'. 5 6 # You can run this file through either pod2man or pod2html to produce pretty 7 # documentation in manual or html file format (these utilities are part of the 8 # Perl 5 distribution). 9 10 use strict; 11 use CGI (); 12 13 $CGI::Pretty::VERSION = '1.08'; 14 $CGI::DefaultClass = __PACKAGE__; 15 $CGI::Pretty::AutoloadClass = 'CGI'; 16 @CGI::Pretty::ISA = qw( CGI ); 17 18 initialize_globals(); 19 20 sub _prettyPrint { 21 my $input = shift; 22 return if !$$input; 23 return if !$CGI::Pretty::LINEBREAK || !$CGI::Pretty::INDENT; 24 25 # print STDERR "'", $$input, "'\n"; 26 27 foreach my $i ( @CGI::Pretty::AS_IS ) { 28 if ( $$input =~ m{</$i>}si ) { 29 my ( $a, $b, $c ) = $$input =~ m{(.*)(<$i[\s/>].*?</$i>)(.*)}si; 30 next if !$b; 31 $a ||= ""; 32 $c ||= ""; 33 34 _prettyPrint( \$a ) if $a; 35 _prettyPrint( \$c ) if $c; 36 37 $b ||= ""; 38 $$input = "$a$b$c"; 39 return; 40 } 41 } 42 $$input =~ s/$CGI::Pretty::LINEBREAK/$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT/g; 43 } 44 45 sub comment { 46 my($self,@p) = CGI::self_or_CGI(@_); 47 48 my $s = "@p"; 49 $s =~ s/$CGI::Pretty::LINEBREAK/$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT/g if $CGI::Pretty::LINEBREAK; 50 51 return $self->SUPER::comment( "$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT$s$CGI::Pretty::LINEBREAK" ) . $CGI::Pretty::LINEBREAK; 52 } 53 54 sub _make_tag_func { 55 my ($self,$tagname) = @_; 56 57 # As Lincoln as noted, the last else clause is VERY hairy, and it 58 # took me a while to figure out what I was trying to do. 59 # What it does is look for tags that shouldn't be indented (e.g. PRE) 60 # and makes sure that when we nest tags, those tags don't get 61 # indented. 62 # For an example, try print td( pre( "hello\nworld" ) ); 63 # If we didn't care about stuff like that, the code would be 64 # MUCH simpler. BTW: I won't claim to be a regular expression 65 # guru, so if anybody wants to contribute something that would 66 # be quicker, easier to read, etc, I would be more than 67 # willing to put it in - Brian 68 69 my $func = qq" 70 sub $tagname {"; 71 72 $func .= q' 73 shift if $_[0] && 74 (ref($_[0]) && 75 (substr(ref($_[0]),0,3) eq "CGI" || 76 UNIVERSAL::isa($_[0],"CGI"))); 77 my($attr) = ""; 78 if (ref($_[0]) && ref($_[0]) eq "HASH") { 79 my(@attr) = make_attributes(shift()||undef,1); 80 $attr = " @attr" if @attr; 81 }'; 82 83 if ($tagname=~/start_(\w+)/i) { 84 $func .= qq! 85 return "<\L$1\E\$attr>\$CGI::Pretty::LINEBREAK";} !; 86 } elsif ($tagname=~/end_(\w+)/i) { 87 $func .= qq! 88 return "<\L/$1\E>\$CGI::Pretty::LINEBREAK"; } !; 89 } else { 90 $func .= qq# 91 return ( \$CGI::XHTML ? "<\L$tagname\E\$attr />" : "<\L$tagname\E\$attr>" ) . 92 \$CGI::Pretty::LINEBREAK unless \@_; 93 my(\$tag,\$untag) = ("<\L$tagname\E\$attr>","</\L$tagname>\E"); 94 95 my \%ASIS = map { lc("\$_") => 1 } \@CGI::Pretty::AS_IS; 96 my \@args; 97 if ( \$CGI::Pretty::LINEBREAK || \$CGI::Pretty::INDENT ) { 98 if(ref(\$_[0]) eq 'ARRAY') { 99 \@args = \@{\$_[0]} 100 } else { 101 foreach (\@_) { 102 \$args[0] .= \$_; 103 \$args[0] .= \$CGI::Pretty::LINEBREAK if \$args[0] !~ /\$CGI::Pretty::LINEBREAK\$/ && 0; 104 chomp \$args[0] if exists \$ASIS{ "\L$tagname\E" }; 105 106 \$args[0] .= \$" if \$args[0] !~ /\$CGI::Pretty::LINEBREAK\$/ && 1; 107 } 108 chop \$args[0]; 109 } 110 } 111 else { 112 \@args = ref(\$_[0]) eq 'ARRAY' ? \@{\$_[0]} : "\@_"; 113 } 114 115 my \@result; 116 if ( exists \$ASIS{ "\L$tagname\E" } ) { 117 \@result = map { "\$tag\$_\$untag\$CGI::Pretty::LINEBREAK" } 118 \@args; 119 } 120 else { 121 \@result = map { 122 chomp; 123 my \$tmp = \$_; 124 CGI::Pretty::_prettyPrint( \\\$tmp ); 125 \$tag . \$CGI::Pretty::LINEBREAK . 126 \$CGI::Pretty::INDENT . \$tmp . \$CGI::Pretty::LINEBREAK . 127 \$untag . \$CGI::Pretty::LINEBREAK 128 } \@args; 129 } 130 local \$" = "" if \$CGI::Pretty::LINEBREAK || \$CGI::Pretty::INDENT; 131 return "\@result"; 132 }#; 133 } 134 135 return $func; 136 } 137 138 sub start_html { 139 return CGI::start_html( @_ ) . $CGI::Pretty::LINEBREAK; 140 } 141 142 sub end_html { 143 return CGI::end_html( @_ ) . $CGI::Pretty::LINEBREAK; 144 } 145 146 sub new { 147 my $class = shift; 148 my $this = $class->SUPER::new( @_ ); 149 150 if ($CGI::MOD_PERL) { 151 if ($CGI::MOD_PERL == 1) { 152 my $r = Apache->request; 153 $r->register_cleanup(\&CGI::Pretty::_reset_globals); 154 } 155 else { 156 my $r = Apache2::RequestUtil->request; 157 $r->pool->cleanup_register(\&CGI::Pretty::_reset_globals); 158 } 159 } 160 $class->_reset_globals if $CGI::PERLEX; 161 162 return bless $this, $class; 163 } 164 165 sub initialize_globals { 166 # This is the string used for indentation of tags 167 $CGI::Pretty::INDENT = "\t"; 168 169 # This is the string used for seperation between tags 170 $CGI::Pretty::LINEBREAK = $/; 171 172 # These tags are not prettify'd. 173 @CGI::Pretty::AS_IS = qw( a pre code script textarea td ); 174 175 1; 176 } 177 sub _reset_globals { initialize_globals(); } 178 179 1; 180 181 =head1 NAME 182 183 CGI::Pretty - module to produce nicely formatted HTML code 184 185 =head1 SYNOPSIS 186 187 use CGI::Pretty qw( :html3 ); 188 189 # Print a table with a single data element 190 print table( TR( td( "foo" ) ) ); 191 192 =head1 DESCRIPTION 193 194 CGI::Pretty is a module that derives from CGI. It's sole function is to 195 allow users of CGI to output nicely formatted HTML code. 196 197 When using the CGI module, the following code: 198 print table( TR( td( "foo" ) ) ); 199 200 produces the following output: 201 <TABLE><TR><TD>foo</TD></TR></TABLE> 202 203 If a user were to create a table consisting of many rows and many columns, 204 the resultant HTML code would be quite difficult to read since it has no 205 carriage returns or indentation. 206 207 CGI::Pretty fixes this problem. What it does is add a carriage 208 return and indentation to the HTML code so that one can easily read 209 it. 210 211 print table( TR( td( "foo" ) ) ); 212 213 now produces the following output: 214 <TABLE> 215 <TR> 216 <TD> 217 foo 218 </TD> 219 </TR> 220 </TABLE> 221 222 223 =head2 Tags that won't be formatted 224 225 The <A> and <PRE> tags are not formatted. If these tags were formatted, the 226 user would see the extra indentation on the web browser causing the page to 227 look different than what would be expected. If you wish to add more tags to 228 the list of tags that are not to be touched, push them onto the C<@AS_IS> array: 229 230 push @CGI::Pretty::AS_IS,qw(CODE XMP); 231 232 =head2 Customizing the Indenting 233 234 If you wish to have your own personal style of indenting, you can change the 235 C<$INDENT> variable: 236 237 $CGI::Pretty::INDENT = "\t\t"; 238 239 would cause the indents to be two tabs. 240 241 Similarly, if you wish to have more space between lines, you may change the 242 C<$LINEBREAK> variable: 243 244 $CGI::Pretty::LINEBREAK = "\n\n"; 245 246 would create two carriage returns between lines. 247 248 If you decide you want to use the regular CGI indenting, you can easily do 249 the following: 250 251 $CGI::Pretty::INDENT = $CGI::Pretty::LINEBREAK = ""; 252 253 =head1 BUGS 254 255 This section intentionally left blank. 256 257 =head1 AUTHOR 258 259 Brian Paulsen <Brian@ThePaulsens.com>, with minor modifications by 260 Lincoln Stein <lstein@cshl.org> for incorporation into the CGI.pm 261 distribution. 262 263 Copyright 1999, Brian Paulsen. All rights reserved. 264 265 This library is free software; you can redistribute it and/or modify 266 it under the same terms as Perl itself. 267 268 Bug reports and comments to Brian@ThePaulsens.com. You can also write 269 to lstein@cshl.org, but this code looks pretty hairy to me and I'm not 270 sure I understand it! 271 272 =head1 SEE ALSO 273 274 L<CGI> 275 276 =cut
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Tue Mar 17 22:47:18 2015 | Cross-referenced by PHPXref 0.7.1 |