File Coverage

blib/lib/Toader/Render/Entry.pm
Criterion Covered Total %
statement 27 314 8.6
branch 0 106 0.0
condition n/a
subroutine 9 16 56.2
pod 7 7 100.0
total 43 443 9.7


line stmt bran cond sub pod time code
1             package Toader::Render::Entry;
2              
3 3     3   17 use warnings;
  3         4  
  3         78  
4 3     3   16 use strict;
  3         6  
  3         81  
5 3     3   16 use base 'Error::Helper';
  3         7  
  3         202  
6 3     3   17 use Toader::Render::General;
  3         7  
  3         73  
7 3     3   15 use Toader::Templates;
  3         7  
  3         84  
8 3     3   2843 use Date::Parse;
  3         26839  
  3         409  
9 3     3   23 use Toader::pathHelper;
  3         6  
  3         68  
10 3     3   15 use File::Path qw(make_path);
  3         5  
  3         132  
11 3     3   1948 use Toader::Render::Entry::Cleanup;
  3         10  
  3         9118  
12              
13             =head1 NAME
14              
15             Toader::Render::Entry - This renders a Toader::Entry object.
16              
17             =head1 VERSION
18              
19             Version 0.1.1
20              
21             =cut
22              
23             our $VERSION = '0.1.1';
24              
25             =head1 SYNOPSIS
26              
27             =head1 METHODS
28              
29             =head2 new
30              
31             This initiates the object.
32              
33             =head3 args hash ref
34              
35             =head4 obj
36              
37             This is the L object to render.
38              
39             =head4 toader
40              
41             This is the L object to use.
42              
43             =head2 toDir
44              
45             This is the value used to get from the directory it is being
46             rendered in back to directory storing stuff for that directory. By
47             default this is '../../' as it needs to get from '.entries/'.$entryID
48             back to the directory. Or we are creating a listing of the last
49             several in the '.entries/' directory, it should be set it to '../'.
50              
51              
52             my $foo=Toader::Render::Entry->new(\%args);
53             if($foo->error){
54             warn('error: '.$foo->error.":".$foo->errorString);
55             }
56              
57             =cut
58              
59             sub new{
60 0     0 1   my %args;
61 0 0         if(defined($_[1])){
62 0           %args= %{$_[1]};
  0            
63             };
64              
65 0           my $self={
66             error=>undef,
67             errorString=>'',
68             perror=>undef,
69             toDir=>'../../',
70             errorExtra=>{
71             flags=>{
72             1=>'noObj',
73             2=>'noToaderObj',
74             3=>'objPerror',
75             4=>'toaderObjPerror',
76             5=>'noDirSet',
77             6=>'cleanupInitErrored',
78             7=>'cleanupErrored',
79             8=>'backendInitErrored',
80             9=>'pathhelperInitErrored',
81             11=>'noOutputDirSet',
82             12=>'outputDirDoesNotExist',
83             13=>'outputEntryDirCreationFailed',
84             14=>'outputFileDirCreationFailed',
85             15=>'generalInitErrored',
86             },
87             },
88             };
89 0           bless $self;
90              
91 0 0         if ( defined( $args{toDir} ) ){
92 0           $self->{toDir}=$args{toDir};
93             }
94              
95             #make sure we have a Toader::Entry object.
96 0 0         if ( ! defined( $args{obj} ) ){
97 0           $self->{perror}=1;
98 0           $self->{error}=1;
99 0           $self->{errorString}='Nothing defined for the Toader::Entry object';
100 0           $self->warn;
101 0           return $self;
102             }
103 0 0         if ( ref( $args{obj} ) ne 'Toader::Entry' ){
104 0           $self->{perror}=1;
105 0           $self->{error}=1;
106 0           $self->{errorString}='The specified object is not a Toader::Entry object, but a "'.
107             ref( $args{obj} ).'"';
108 0           $self->warn;
109 0           return $self;
110             }
111 0           $self->{obj}=$args{obj};
112              
113             #make sure the object does not have a permanent error set
114 0 0         if( ! $self->{obj}->errorblank ){
115 0           $self->{perror}=1;
116 0           $self->{error}=3;
117 0           $self->{errorString}='The Toader::Entry object has a permanent error set';
118 0           $self->warn;
119 0           return $self;
120             }
121              
122             #make sure a Toader object is given
123 0 0         if ( ! defined( $args{toader} ) ){
124 0           $self->{perror}=1;
125 0           $self->{error}=2;
126 0           $self->{errorString}='Nothing defined for the Toader object';
127 0           $self->warn;
128 0           return $self;
129             }
130 0 0         if ( ref( $args{toader} ) ne 'Toader' ){
131 0           $self->{perror}=1;
132 0           $self->{error}=2;
133 0           $self->{errorString}='The specified object is not a Toader object, but a "'.
134             ref( $args{toader} ).'"';
135 0           $self->warn;
136 0           return $self;
137             }
138 0           $self->{toader}=$args{toader};
139              
140             #make sure the object does not have a permanent error set
141 0 0         if( ! $self->{toader}->errorblank ){
142 0           $self->{perror}=1;
143 0           $self->{error}=4;
144 0           $self->{errorString}='The Toader object has a permanent error set';
145 0           $self->warn;
146 0           return $self;
147             }
148              
149             #make sure a directory is set
150 0 0         if( ! defined( $self->{obj}->dirGet ) ){
151 0           $self->{perror}=1;
152 0           $self->{error}=5;
153 0           $self->{errorString}='The Toader::Entry object does not have a directory set';
154 0           $self->warn;
155 0           return $self;
156             }
157 0           $self->{dir}=$self->{obj}->dirGet;
158              
159             #initialize this here for simplicity
160 0           $self->{t}=Toader::Templates->new({
161             dir=>$self->{obj}->dirGet,
162             toader=>$args{toader},
163             });
164              
165             #initialize the general object here for simplicity
166 0           $self->{g}=Toader::Render::General->new(
167             {
168             toader=>$self->{toader},
169             self=>\$self,
170             obj=>$self->{obj},
171             toDir=>$self->{toDir},
172             }
173             );
174 0 0         if ( $self->{g}->error ){
175 0           $self->{perror}=1;
176 0           $self->{error}=15;
177 0           $self->{errorString}='Failed to initialize Toader::Render::General. error="'
178             .$self->{g}->error.'" errorString="'.$self->{g}->errorString.'"';
179 0           $self->warn;
180 0           return $self;
181             }
182              
183             #initialize the Toader::pathHelper
184 0           $self->{ph}=Toader::pathHelper->new( $self->{dir} );
185 0 0         if ( $self->{ph}->error ){
186 0           $self->{perror}=1;
187 0           $self->{error}=6;
188 0           $self->{errorString}='Failed to initiate pathHelper. error="'.
189             $self->{ph}->error.'" errorString="'.$self->{ph}->errorString.'"';
190 0           $self->warn;
191 0           return $self;
192             }
193              
194             #gets the r2r for the object
195 0           $self->{r2r}=$self->{ph}->relative2root( $self->{dir} );
196 0 0         if ( $self->{ph}->error ){
197 0           $self->{perror}=1;
198 0           $self->{error}=19;
199 0           $self->{errorString}='pathHelper failed to find the relative2root path for "'.
200             $self->{odir}.'"';
201 0           $self->warn;
202 0           return $self;
203             }
204              
205 0           return $self;
206             }
207              
208             =head2 content
209              
210             This renders the content to be included in a static
211             entry page.
212              
213             my $content=$foo->content;
214              
215             =cut
216              
217             sub content{
218 0     0 1   my $self=$_[0];
219              
220 0 0         if ( ! $self->errorblank ){
221 0           return undef;
222             }
223              
224             #puts together the date stuff
225 0           my $date=$self->{obj}->{mime}->header("Date");
226 0           my ($sec,$min,$hour,$day,$month,$year,$zone) = strptime($date);
227 0           $year=1900+$year;
228              
229 0 0         if( $day < 10 ){
230 0           $day='0'.$day;
231             }
232 0           $month++;
233 0 0         if( $month < 10 ){
234 0           $month='0'.$month;
235             }
236              
237 0           my $body=$self->{t}->fill_in_string( $self->{obj}->bodyGet,
238             {
239             title=>$self->{obj}->titleGet,
240             from=>$self->{obj}->fromGet,
241             date=>$self->{obj}->entryNameGet,
242             g=>\$self->{g},
243             toader=>\$self->{toader},
244             sec=>$sec,
245             min=>$min,
246             hour=>$hour,
247             day=>$day,
248             month=>$month,
249             year=>$year,
250             zone=>$zone,
251             obj=>\$self->{obj},
252             self=>\$self,
253             c=>\$self->{toader}->getConfig,
254             });
255 0 0         if ( $self->{t}->error ){
256 0           $self->{error}=8;
257 0           $self->{errorString}='Filling in the template failed. error="'.
258             $self->{t}->error.'" errorString="'.$self->{t}->errorString.'"';
259 0           $self->warn;
260 0           return undef;
261             }
262              
263             #this prepares to run it through the specified renderer
264 0           my $renderer;
265 0           my $torun='use Toader::Render::Entry::backends::'.$self->{obj}->rendererGet.'; '.
266             '$renderer=Toader::Render::Entry::backends::'.$self->{obj}->rendererGet.'->new({'.
267             'obj=>$self->{obj}, toader=>$self->{toader}, });';
268 0           eval( $torun );
269 0 0         if ( ! defined( $renderer ) ){
270 0           $self->{error}=8;
271 0           $self->{errorString}='Failed to initialize the backend. It returned undef. '.
272             'renderer="'.$self->{obj}->rendererGet.'"';
273 0           $self->warn;
274 0           return undef;
275             }
276 0 0         if ( $renderer->error ){
277 0           $self->{error}=8;
278 0           $self->{errorString}='Failed to initialize the backend. It returned with an error. '.
279             'error="'.$renderer->error.'" errorString="'.$renderer->errorString.'"';
280 0           $self->warn;
281 0           return undef;
282             }
283              
284             #render it
285 0           my $content=$renderer->render( $body );
286 0 0         if ( $renderer->error ){
287 0           $self->{error}=9;
288 0           $self->{errorString}='Failed to render the content. It returned an error. '.
289             'error="'.$renderer->error.'" errorString="'.$renderer->errorString.'"';
290 0           $self->warn;
291 0           return undef;
292             }
293              
294 0           $content=$self->{t}->fill_in( 'entryContent',
295             {
296             body=>$content,
297             title=>$self->{obj}->titleGet,
298             from=>$self->{obj}->fromGet,
299             date=>$self->{obj}->entryNameGet,
300             g=>\$self->{g},
301             toader=>\$self->{toader},
302             sec=>$sec,
303             min=>$min,
304             hour=>$hour,
305             day=>$day,
306             month=>$month,
307             year=>$year,
308             zone=>$zone,
309             self=>\$self,
310             obj=>\$self->{obj},
311             c=>\$self->{toader}->getConfig,
312             });
313 0 0         if ( $self->{t}->error ){
314 0           $self->{error}=8;
315 0           $self->{errorString}='Filling in the template failed. error="'.
316             $self->{t}->error.'" errorString="'.$self->{t}->errorString.'"';
317 0           $self->warn;
318 0           return undef;
319             }
320              
321 0           return $content;
322             }
323              
324             =head2 archive
325              
326             This renders the '.entries/archive.html' file.
327              
328             =cut
329              
330             sub archive{
331 0     0 1   my $self=$_[0];
332            
333 0 0         if ( ! $self->errorblank ){
334 0           return undef;
335             }
336              
337             #makes sure we have a output directory set...
338             #while we don't care about this for rendering the content, we do need to
339             #know this for actually fully rendering it
340 0           my $output=$self->{toader}->getOutputDir;
341 0 0         if ( ! defined( $output ) ){
342 0           $self->{error}=11;
343 0           $self->{errorString}='No output directory has been set for the Toader object';
344 0           $self->warn;
345 0           return undef;
346             }
347              
348             #makes sure the output directory exists
349 0 0         if ( ! -d $output ){
350 0           $self->{error}=12;
351 0           $self->{errorString}='The output directory, "'.$output.'", does not exist';
352 0           $self->warn;
353 0           return undef;
354             }
355              
356             #this renders the content of it
357 0           my $content=$self->archiveContent;
358 0 0         if ( $self->error ){
359 0           $self->warnString('Failed to render the content to include');
360 0           return undef;
361             }
362              
363 0           my $page=$self->{t}->fill_in( 'page',
364             {
365             toader=>\$self->{toader},
366             g=>\$self->{g},
367             self=>\$self,
368             obj=>\$self->{obj},
369             c=>\$self->{toader}->getConfig,
370             locationID=>'Entries Archive',
371             content=>$content,
372             });
373 0 0         if ( $self->{t}->error ){
374 0           $self->{error}=8;
375 0           $self->{errorString}='Filling in the template failed. error="'.
376             $self->{t}->error.'" errorString="'.$self->{t}->errorString.'"';
377 0           $self->warn;
378 0           return undef;
379             }
380              
381             #the paths that will be used
382 0           my $dir=$output.'/'.$self->{r2r}.'/.entries/';
383 0           my $index=$dir.'archive.html';
384              
385             #make sure the files and entry directory exist
386 0 0         if ( ! -d $dir ){
387 0 0         if ( ! make_path( $dir ) ){
388 0           $self->{error}=13;
389 0           $self->{errorString}='The output entry directry, "'.$dir.'", could not be created';
390 0           $self->warn;
391 0           return undef;
392             }
393             }
394              
395             #write the index out
396 0           my $fh;
397 0 0         if ( ! open( $fh, '>', $index ) ){
398 0           $self->{error}=15;
399 0           $self->{errorString}='Failed to open the index, "'.$index.'", for writing';
400 0           $self->warn;
401 0           return undef;
402             }
403 0           print $fh $page;
404 0           close( $fh );
405              
406 0           return 1;
407             }
408              
409             =head2 archiveContent
410              
411             This renders the content for the index.html page for the entries.
412              
413             =cut
414              
415             sub archiveContent{
416 0     0 1   my $self=$_[0];
417            
418 0 0         if ( ! $self->errorblank ){
419 0           return undef;
420             }
421              
422 0           my $content=$self->{t}->fill_in( 'entryArchive',
423             {
424             toader=>\$self->{toader},
425             g=>\$self->{g},
426             self=>\$self,
427             obj=>\$self->{obj},
428             c=>\$self->{toader}->getConfig,
429             });
430 0 0         if ( $self->{t}->error ){
431 0           $self->{error}=8;
432 0           $self->{errorString}='Filling in the template failed. error="'.
433             $self->{t}->error.'" errorString="'.$self->{t}->errorString.'"';
434 0           $self->warn;
435 0           return undef;
436             }
437              
438 0           return $content;
439             }
440              
441             =head2 index
442              
443             This renders the '.entries/index.html' file.
444              
445             =cut
446              
447             sub index{
448 0     0 1   my $self=$_[0];
449            
450 0 0         if ( ! $self->errorblank ){
451 0           return undef;
452             }
453              
454             #makes sure we have a output directory set...
455             #while we don't care about this for rendering the content, we do need to
456             #know this for actually fully rendering it
457 0           my $output=$self->{toader}->getOutputDir;
458 0 0         if ( ! defined( $output ) ){
459 0           $self->{error}=11;
460 0           $self->{errorString}='No output directory has been set for the Toader object';
461 0           $self->warn;
462 0           return undef;
463             }
464              
465             #makes sure the output directory exists
466 0 0         if ( ! -d $output ){
467 0           $self->{error}=12;
468 0           $self->{errorString}='The output directory, "'.$output.'", does not exist';
469 0           $self->warn;
470 0           return undef;
471             }
472              
473             #this renders the content of it
474 0           my $content=$self->indexContent;
475 0 0         if ( $self->error ){
476 0           $self->warnString('Failed to render the content to include');
477 0           return undef;
478             }
479              
480 0           my $page=$self->{t}->fill_in( 'page',
481             {
482             toader=>\$self->{toader},
483             g=>\$self->{g},
484             self=>\$self,
485             obj=>\$self->{obj},
486             c=>\$self->{toader}->getConfig,
487             locationID=>'Latest Entries',
488             content=>$content,
489             });
490 0 0         if ( $self->{t}->error ){
491 0           $self->{error}=8;
492 0           $self->{errorString}='Filling in the template failed. error="'.
493             $self->{t}->error.'" errorString="'.$self->{t}->errorString.'"';
494 0           $self->warn;
495 0           return undef;
496             }
497              
498             #the paths that will be used
499 0           my $dir=$output.'/'.$self->{r2r}.'/.entries/';
500 0           my $index=$dir.'index.html';
501              
502             #make sure the files and entry directory exist
503 0 0         if ( ! -d $dir ){
504 0 0         if ( ! make_path( $dir ) ){
505 0           $self->{error}=13;
506 0           $self->{errorString}='The output entry directry, "'.$dir.'", could not be created';
507 0           $self->warn;
508 0           return undef;
509             }
510             }
511              
512             #write the index out
513 0           my $fh;
514 0 0         if ( ! open( $fh, '>', $index ) ){
515 0           $self->{error}=15;
516 0           $self->{errorString}='Failed to open the index, "'.$index.'", for writing';
517 0           $self->warn;
518 0           return undef;
519             }
520 0           print $fh $page;
521 0           close( $fh );
522              
523 0           return 1;
524             }
525              
526             =head2 indexContent
527              
528             This renders the content for the index.html page for the entries.
529              
530             =cut
531              
532             sub indexContent{
533 0     0 1   my $self=$_[0];
534            
535 0 0         if ( ! $self->errorblank ){
536 0           return undef;
537             }
538              
539 0           my $content=$self->{t}->fill_in( 'entryIndex',
540             {
541             toader=>\$self->{toader},
542             g=>\$self->{g},
543             self=>\$self,
544             obj=>\$self->{obj},
545             c=>\$self->{toader}->getConfig,
546             });
547 0 0         if ( $self->{t}->error ){
548 0           $self->{error}=8;
549 0           $self->{errorString}='Filling in the template failed. error="'.
550             $self->{t}->error.'" errorString="'.$self->{t}->errorString.'"';
551 0           $self->warn;
552 0           return undef;
553             }
554              
555 0           return $content;
556             }
557              
558             =head2 render
559              
560             This renders the object.
561              
562             No arguments are taken.
563              
564             =cut
565              
566             sub render{
567 0     0 1   my $self=$_[0];
568            
569 0 0         if ( ! $self->errorblank ){
570 0           return undef;
571             }
572              
573             #makes sure we have a output directory set...
574             #while we don't care about this for rendering the content, we do need to
575             #know this for actually fully rendering it
576 0           my $output=$self->{toader}->getOutputDir;
577 0 0         if ( ! defined( $output ) ){
578 0           $self->{error}=11;
579 0           $self->{errorString}='No output directory has been set for the Toader object';
580 0           $self->warn;
581 0           return undef;
582             }
583              
584             #makes sure the output directory exists
585 0 0         if ( ! -d $output ){
586 0           $self->{error}=12;
587 0           $self->{errorString}='The output directory, "'.$output.'", does not exist';
588 0           $self->warn;
589 0           return undef;
590             }
591              
592             #clean up the old entry
593 0           my $cleanup=Toader::Render::Entry::Cleanup->new( $self->{toader} );
594 0 0         if ( $cleanup->error ){
595 0           $self->{error}=6;
596 0           $self->{errorString}='Initialing the cleanup module failed. error="'.
597             $cleanup->error.'" errorString="'.$cleanup->errorString.'"';
598 0           $self->warn;
599 0           return undef;
600             }
601 0           $cleanup->cleanup( $self->{obj} );
602 0 0         if ( $cleanup->error ){
603 0           $self->{error}=7;
604 0           $self->{errorString}='Cleanup failed. error="'.$cleanup->error.
605             '" errorString="'.$cleanup->errorString.'"';
606 0           $self->warn;
607 0           return undef;
608             }
609              
610             #this renders the content of it
611 0           my $content=$self->content;
612 0 0         if ( $self->error ){
613 0           $self->warnString('Failed to render the content to include');
614 0           return undef;
615             }
616              
617 0           my $page=$self->{t}->fill_in( 'page',
618             {
619             toader=>\$self->{toader},
620             g=>\$self->{g},
621             self=>\$self,
622             obj=>\$self->{obj},
623             c=>\$self->{toader}->getConfig,
624             content=>$content,
625             });
626 0 0         if ( $self->{t}->error ){
627 0           $self->{error}=8;
628 0           $self->{errorString}='Filling in the template failed. error="'.
629             $self->{t}->error.'" errorString="'.$self->{t}->errorString.'"';
630 0           $self->warn;
631 0           return undef;
632             }
633              
634             #put together some paths for later use
635 0           my $entryDir=$output.'/'.$self->{r2r}.'/.entries/'.$self->{obj}->entryNameGet;
636 0           my $index=$entryDir.'/index.html';
637 0           my $fileDir=$entryDir.'/.files';
638              
639             #make sure the files and entry directory exist
640 0 0         if ( ! -d $entryDir ){
641 0 0         if ( ! make_path( $entryDir ) ){
642 0           $self->{error}=13;
643 0           $self->{errorString}='The output entry directry, "'.$entryDir.'", could not be created';
644 0           $self->warn;
645 0           return undef;
646             }
647             }
648 0 0         if ( ! -d $fileDir ){
649 0 0         if ( ! make_path( $fileDir ) ){
650 0           $self->{error}=14;
651 0           $self->{errorString}='The output file directry, "'.$fileDir.'", could not be created';
652 0           $self->warn;
653 0           return undef;
654             }
655             }
656              
657             #write the index out
658 0           my $fh;
659 0 0         if ( ! open( $fh, '>', $index ) ){
660 0           $self->{error}=15;
661 0           $self->{errorString}='Failed to open the index, "'.$index.'", for writing';
662 0           $self->warn;
663 0           return undef;
664             }
665 0           print $fh $page;
666 0           close( $fh );
667              
668             #extract the files
669 0           $self->{obj}->subpartsExtract( $fileDir );
670 0 0         if ( $self->{obj}->error ){
671 0           $self->{error}=16;
672 0           $self->{errorString}='Failed to extract the subparts. error="'.
673             $self->{obj}->error.'" errorString="'.$self->{obj}->errorString.'"';
674 0           $self->warn;
675 0           return undef;
676             }
677              
678 0           return 1;
679             }
680              
681             =head1 ERROR CODES
682              
683             =head2 1, noObj
684              
685             No L object specified.
686              
687             =head2 2, noToaderObj
688              
689             No L object specified.
690              
691             =head2 3, objPerror
692              
693             The L object has a permanent error set.
694              
695             =head2 4, toaderObjPerror
696              
697             The L object has a permanent error set.
698              
699             =head2 5, noDirSet
700              
701             The L object does not have a directory set
702              
703             =head2 6, cleanupInitErrored
704              
705             Failed to initialize the cleanup module.
706              
707             =head2 7, cleanupErrored
708              
709             Failed to cleanup.
710              
711             =head2 8, backendInitErrored
712              
713             Failed to initialize the backend.
714              
715             =head2 9, pathhelperInitErrored
716              
717             Failed to initialize the path helper.
718              
719             =head2 11, noOutputDirSet
720              
721             The L object does not have a output directory set.
722              
723             =head2 12, outputDirDoesNotExist
724              
725             The output directory does not exist.
726              
727             =head2 13, outputEntryDirCreationFailed
728              
729             The output entry directory could not be created.
730              
731             =head2 14, outputFileDirCreationFailed
732              
733             The output file directory could not be created.
734              
735             =head2 15, generalInitErrored
736              
737             Failed to initialize the L object.
738              
739             =head1 AUTHOR
740              
741             Zane C. Bowers-Hadley, C<< >>
742              
743             =head1 BUGS
744              
745             Please report any bugs or feature requests to C, or through
746             the web interface at L. I will be notified, and then you'll
747             automatically be notified of progress on your bug as I make changes.
748              
749              
750              
751              
752             =head1 SUPPORT
753              
754             You can find documentation for this module with the perldoc command.
755              
756             perldoc Toader::Render
757              
758              
759             You can also look for information at:
760              
761             =over 4
762              
763             =item * RT: CPAN's request tracker
764              
765             L
766              
767             =item * AnnoCPAN: Annotated CPAN documentation
768              
769             L
770              
771             =item * CPAN Ratings
772              
773             L
774              
775             =item * Search CPAN
776              
777             L
778              
779             =back
780              
781              
782             =head1 ACKNOWLEDGEMENTS
783              
784              
785             =head1 LICENSE AND COPYRIGHT
786              
787             Copyright 2011. Zane C. Bowers-Hadley.
788              
789             This program is free software; you can redistribute it and/or modify it
790             under the terms of either: the GNU General Public License as published
791             by the Free Software Foundation; or the Artistic License.
792              
793             See http://dev.perl.org/licenses/ for more information.
794              
795              
796             =cut
797              
798             1; # End of Toader::Render::Entry