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