1package Toader::Render::Directory; 2 3use warnings; 4use strict; 5use base 'Error::Helper'; 6use Toader::Templates; 7use Date::Parse; 8use File::Path qw(make_path); 9use Toader::Render::Directory::Cleanup; 10use Toader::Render::General; 11 12=head1 NAME 13 14Toader::Render::Directory - Renders a Toader::Directory object. 15 16=head1 VERSION 17 18Version 0.1.1 19 20=cut 21 22our $VERSION = '0.1.1'; 23 24=head1 SYNOPSIS 25 26=head1 METHODS 27 28=head2 new 29 30This initiates the object. 31 32=head3 args hash ref 33 34=head4 obj 35 36This is the L<Toader::Directory> object to render. 37 38=head4 toader 39 40This is the L<Toader> object to use. 41 42=head2 toDir 43 44This is the value used to get from the directory it is being 45rendered in back to directory storing stuff for that directory. By 46default this is './'. 47 48 my $foo=Toader::Render::Directory->new(\%args); 49 if($foo->error){ 50 warn('error: '.$foo->error.":".$foo->errorString); 51 } 52 53=cut 54 55sub new{ 56 my %args; 57 if(defined($_[1])){ 58 %args= %{$_[1]}; 59 }; 60 61 my $self={ 62 error=>undef, 63 errorString=>'', 64 perror=>undef, 65 toDir=>'./', 66 errorExtra=>{ 67 flags=>{ 68 1=>'noObj', 69 2=>'noToaderObj', 70 3=>'objPerror', 71 4=>'toaderObjPerror', 72 5=>'noDirSet', 73 6=>'cleanupErrored', 74 7=>'generalInitErrored', 75 }, 76 }, 77 }; 78 bless $self; 79 80 if ( defined( $args{toDir} ) ){ 81 $self->{toDir}=$args{toDir}; 82 } 83 84 #make sure we have a Toader::Directory object. 85 if ( ! defined( $args{obj} ) ){ 86 $self->{perror}=1; 87 $self->{error}=1; 88 $self->{errorString}='Nothing defined for the Toader::Directory object'; 89 $self->warn; 90 return $self; 91 } 92 if ( ref( $args{obj} ) ne 'Toader::Directory' ){ 93 $self->{perror}=1; 94 $self->{error}=1; 95 $self->{errorString}='The specified object is not a Toader::Directory object, but a "'. 96 ref( $args{obj} ).'"'; 97 $self->warn; 98 return $self; 99 } 100 $self->{obj}=$args{obj}; 101 102 #make sure the object does not have a permanent error set 103 if( ! $self->{obj}->errorblank ){ 104 $self->{perror}=1; 105 $self->{error}=3; 106 $self->{errorString}='The Toader::Directory object has a permanent error set'; 107 $self->warn; 108 return $self; 109 } 110 111 #make sure a Toader object is given 112 if ( ! defined( $args{toader} ) ){ 113 $self->{perror}=1; 114 $self->{error}=2; 115 $self->{errorString}='Nothing defined for the Toader object'; 116 $self->warn; 117 return $self; 118 } 119 if ( ref( $args{toader} ) ne 'Toader' ){ 120 $self->{perror}=1; 121 $self->{error}=2; 122 $self->{errorString}='The specified object is not a Toader object, but a "'. 123 ref( $args{toader} ).'"'; 124 $self->warn; 125 return $self; 126 } 127 $self->{toader}=$args{toader}; 128 129 #make sure the Toader object does not have a permanent error set 130 if( ! $self->{toader}->errorblank ){ 131 $self->{perror}=1; 132 $self->{error}=4; 133 $self->{errorString}='The Toader object has an permanent error set'; 134 $self->warn; 135 return $self; 136 } 137 138 #initialize this here for simplicity 139 $self->{t}=Toader::Templates->new({ 140 dir=>$self->{obj}->dirGet, 141 toader=>$args{toader}, 142 }); 143 144 #make sure a directory is set 145 if( ! defined( $self->{obj}->dirGet ) ){ 146 $self->{perror}=1; 147 $self->{error}=5; 148 $self->{errorString}='The Toader::Directory object does not have a directory set'; 149 $self->warn; 150 return $self; 151 } 152 $self->{dir}=$self->{obj}->dirGet; 153 154 #initialize the Toader::pathHelper 155 $self->{ph}=Toader::pathHelper->new( $self->{dir} ); 156 if ( $self->{ph}->error ){ 157 $self->{perror}=1; 158 $self->{error}=6; 159 $self->{errorString}='Failed to initiate pathHelper. error="'. 160 $self->{ph}->error.'" errorString="'.$self->{ph}->errorString.'"'; 161 $self->warn; 162 return $self; 163 } 164 165 #gets the r2r for the object 166 $self->{r2r}=$self->{ph}->relative2root( $self->{dir} ); 167 if ( $self->{ph}->error ){ 168 $self->{perror}=1; 169 $self->{error}=19; 170 $self->{errorString}='pathHelper failed to find the relative2root path for "'. 171 $self->{odir}.'"'; 172 $self->warn; 173 return $self; 174 } 175 176 #initialize the general object here for simplicity 177 $self->{g}=Toader::Render::General->new( 178 { 179 toader=>$self->{toader}, 180 self=>\$self, 181 obj=>$self->{obj}, 182 toDir=>$self->{toDir}, 183 } 184 ); 185 if ( $self->{g}->error ){ 186 $self->{perror}=1; 187 $self->{error}=15; 188 $self->{errorString}='Failed to initialize Toader::Render::General. error="' 189 .$self->{g}->error.'" errorString="'.$self->{g}->errorString.'"'; 190 $self->warn; 191 return $self; 192 } 193 194 return $self; 195} 196 197=head2 content 198 199This renders the content to be included in a static 200entry page. 201 202 my $content=$foo->content; 203 204=cut 205 206sub content{ 207 my $self=$_[0]; 208 209 if ( ! $self->errorblank ){ 210 return undef; 211 } 212 213 #puts together the date stuff 214 my $date=$self->{obj}->{mime}->header("Date"); 215 my ($sec,$min,$hour,$day,$month,$year,$zone) = strptime($date); 216 $year=1900+$year; 217 218 #make sure everything is double digits 219 if( $sec < 10 ){ 220 $sec='0'.$sec; 221 } 222 if( $min < 10 ){ 223 $min='0'.$min; 224 } 225 if( $hour < 10 ){ 226 $hour='0'.$hour; 227 } 228 if( $day < 10 ){ 229 $day='0'.$day; 230 } 231 if( $month < 10 ){ 232 $month='0'.$month; 233 } 234 235 my $body=$self->{t}->fill_in_string( $self->{obj}->bodyGet, 236 { 237 g=>\$self->{g}, 238 toader=>\$self->{toader}, 239 sec=>$sec, 240 min=>$min, 241 hour=>$hour, 242 day=>$day, 243 month=>$month, 244 year=>$year, 245 zone=>$zone, 246 obj=>\$self->{obj}, 247 self=>\$self, 248 c=>\$self->{toader}->getConfig, 249 }); 250 if ( $self->{t}->error ){ 251 $self->{error}=8; 252 $self->{errorString}='Filling in the template failed. error="'. 253 $self->{t}->error.'" errorString="'.$self->{t}->errorString.'"'; 254 $self->warn; 255 return undef; 256 } 257 258 my $content=$self->{t}->fill_in( 'dirContent', 259 { 260 body=>$body, 261 g=>\$self->{g}, 262 toader=>\$self->{toader}, 263 sec=>$sec, 264 min=>$min, 265 hour=>$hour, 266 day=>$day, 267 month=>$month, 268 year=>$year, 269 zone=>$zone, 270 self=>\$self, 271 obj=>\$self->{obj}, 272 c=>\$self->{toader}->getConfig, 273 }); 274 if ( $self->{t}->error ){ 275 $self->{error}=8; 276 $self->{errorString}='Filling in the template failed. error="'. 277 $self->{t}->error.'" errorString="'.$self->{t}->errorString.'"'; 278 $self->warn; 279 return undef; 280 } 281 282 #this prepares to run it through the specified renderer 283 my $renderer; 284 my $torun='use Toader::Render::Directory::backends::'.$self->{obj}->rendererGet.'; '. 285 '$renderer=Toader::Render::Directory::backends::'.$self->{obj}->rendererGet.'->new({'. 286 'obj=>$self->{obj}, toader=>$self->{toader}, });'; 287 eval( $torun ); 288 if ( ! defined( $renderer ) ){ 289 $self->{error}=8; 290 $self->{errorString}='Failed to initialize the backend. It returned undef. '. 291 'renderer="'.$self->{obj}->rendererGet.'"'; 292 $self->warn; 293 return undef; 294 } 295 if ( $renderer->error ){ 296 $self->{error}=8; 297 $self->{errorString}='Failed to initialize the backend. It returned with an error. '. 298 'error="'.$renderer->error.'" errorString="'.$renderer->errorString.'"'; 299 $self->warn; 300 return undef; 301 } 302 303 #render it 304 $content=$renderer->render( $content ); 305 if ( $renderer->error ){ 306 $self->{error}=9; 307 $self->{errorString}='Failed to render the content. It returned an error. '. 308 'error="'.$renderer->error.'" errorString="'.$renderer->errorString.'"'; 309 $self->warn; 310 return undef; 311 } 312 313 return $content; 314} 315 316=head2 render 317 318This renders the object. 319 320No arguments are taken. 321 322=cut 323 324sub render{ 325 my $self=$_[0]; 326 327 if ( ! $self->errorblank ){ 328 return undef; 329 } 330 331 #makes sure we have a output directory set... 332 #while we don't care about this for rendering the content, we do need to 333 #know this for actually fully rendering it 334 my $output=$self->{toader}->getOutputDir; 335 if ( ! defined( $output ) ){ 336 $self->{error}=11; 337 $self->{errorString}='No output directory has been set for the Toader object'; 338 $self->warn; 339 return undef; 340 } 341 342 #makes sure the output directory exists 343 if ( ! -d $output ){ 344 $self->{error}=12; 345 $self->{errorString}='The output directory, "'.$output.'", does not exist'; 346 $self->warn; 347 return undef; 348 } 349 350 #clean up the old entry 351 my $cleanup=Toader::Render::Directory::Cleanup->new( $self->{toader} ); 352 if ( $cleanup->error ){ 353 $self->{error}=6; 354 $self->{errorString}='Initialing the cleanup module failed. error="'. 355 $cleanup->error.'" errorString="'.$cleanup->errorString.'"'; 356 $self->warn; 357 return undef; 358 } 359 $cleanup->cleanup( $self->{obj} ); 360 if ( $cleanup->error ){ 361 $self->{error}=7; 362 $self->{errorString}='Cleanup failed. error="'.$cleanup->error. 363 '" errorString="'.$cleanup->errorString.'"'; 364 $self->warn; 365 return undef; 366 } 367 368 #this renders the content of it 369 my $content=$self->content; 370 if ( $self->error ){ 371 $self->warnString('Failed to render the content to include'); 372 return undef; 373 } 374 375 my $page=$self->{t}->fill_in( 'page', 376 { 377 toader=>\$self->{toader}, 378 g=>\$self->{g}, 379 self=>\$self, 380 obj=>\$self->{obj}, 381 c=>\$self->{toader}->getConfig, 382 content=>$content, 383 locationID=>'', 384 }); 385 if ( $self->{t}->error ){ 386 $self->{error}=8; 387 $self->{errorString}='Filling in the template failed. error="'. 388 $self->{t}->error.'" errorString="'.$self->{t}->errorString.'"'; 389 $self->warn; 390 return undef; 391 } 392 393 #put together some paths for later use 394 my $dir=$output.'/'.$self->{r2r}.'/'; 395 my $index=$dir.'/index.html'; 396 my $fileDir=$dir.'/.files'; 397 398 #make sure the files and entry directory exist 399 if ( ! -d $dir ){ 400 if ( ! make_path( $dir ) ){ 401 $self->{error}=13; 402 $self->{errorString}='The output directry, "'.$dir.'", could not be created'; 403 $self->warn; 404 return undef; 405 } 406 } 407 if ( ! -d $fileDir ){ 408 if ( ! make_path( $fileDir ) ){ 409 $self->{error}=14; 410 $self->{errorString}='The output file directry, "'.$fileDir.'", could not be created'; 411 $self->warn; 412 return undef; 413 } 414 } 415 416 #write the index out 417 my $fh; 418 if ( ! open( $fh, '>', $index ) ){ 419 $self->{error}=15; 420 $self->{errorString}='Failed to open the index, "'.$index.'", for writing'; 421 $self->warn; 422 return undef; 423 } 424 print $fh $page; 425 close( $fh ); 426 427 #extract the files 428 $self->{obj}->subpartsExtract( $fileDir ); 429 if ( $self->{obj}->error ){ 430 $self->{error}=16; 431 $self->{errorString}='Failed to extract the subparts. error="'. 432 $self->{obj}->error.'" errorString="'.$self->{obj}->errorString.'"'; 433 $self->warn; 434 return undef; 435 } 436 437 return 1; 438} 439 440=head1 ERROR CODES 441 442=head2 1, noObj 443 444No L<Toader::Directory> object specified. 445 446=head2 2, noToaderObj 447 448No L<Toader> object specified. 449 450=head2 3, objPerror 451 452The L<Toader::Directory> object has a permanent error set. 453 454=head2 4, toaderObjPerror 455 456The L<Toader> object has a permanent error set. 457 458=head2 5, noDirSet 459 460The L<Toader::Directory> object does not have a directory set. 461 462=head2 6, cleanupErrored 463 464Initializing L<Toader::Render::Directory::Cleanup> failed. 465 466=head2 7, generalInitErrored 467 468Failed to initialize L<Toader::Render::General>. 469 470=head1 AUTHOR 471 472Zane C. Bowers-Hadley, C<< <vvelox at vvelox.net> >> 473 474=head1 BUGS 475 476Please report any bugs or feature requests to C<bug-toader at rt.cpan.org>, or through 477the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Toader>. I will be notified, and then you'll 478automatically be notified of progress on your bug as I make changes. 479 480=head1 SUPPORT 481 482You can find documentation for this module with the perldoc command. 483 484 perldoc Toader::Render 485 486 487You can also look for information at: 488 489=over 4 490 491=item * RT: CPAN's request tracker 492 493L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Toader> 494 495=item * AnnoCPAN: Annotated CPAN documentation 496 497L<http://annocpan.org/dist/Toader> 498 499=item * CPAN Ratings 500 501L<http://cpanratings.perl.org/d/Toader> 502 503=item * Search CPAN 504 505L<http://search.cpan.org/dist/Toader/> 506 507=back 508 509 510=head1 ACKNOWLEDGEMENTS 511 512 513=head1 LICENSE AND COPYRIGHT 514 515Copyright 2013. Zane C. Bowers-Hadley. 516 517This program is free software; you can redistribute it and/or modify it 518under the terms of either: the GNU General Public License as published 519by the Free Software Foundation; or the Artistic License. 520 521See http://dev.perl.org/licenses/ for more information. 522 523 524=cut 525 5261; # End of Toader::Render::Directory 527