File Coverage

blib/lib/VLGal/Directory.pm
Criterion Covered Total %
statement 79 305 25.9
branch 19 108 17.5
condition 2 24 8.3
subroutine 16 30 53.3
pod 9 16 56.2
total 125 483 25.8


line stmt bran cond sub pod time code
1             package VLGal::Directory;
2              
3 1     1   7763 use 5.006;
  1         4  
  1         35  
4 1     1   6 use base qw( VLGal::File );
  1         2  
  1         587  
5 1     1   8 use strict;
  1         18  
  1         32  
6 1     1   6 use warnings;
  1         1  
  1         29  
7 1     1   816 use DirHandle;
  1         2021  
  1         100  
8 1     1   5 use Error qw(:try);
  1         2  
  1         6  
9 1     1   139 use File::Basename;
  1         1  
  1         51  
10 1     1   813 use File::Copy;
  1         2166  
  1         48  
11 1     1   5 use File::Spec;
  1         2  
  1         15  
12 1     1   846 use IO::File;
  1         8377  
  1         119  
13 1     1   496 use VLGal::File::Factory;
  1         3  
  1         3233  
14              
15             # Used by _value_is_allowed
16             our %ALLOW_ISA = (
17             'file' => [ 'VLGal::File' ],
18             );
19              
20             # Used by _value_is_allowed
21             our %ALLOW_REF = (
22             '_all_file_' => {
23             'ARRAY' => 1,
24             },
25             );
26              
27             # Used by _value_is_allowed
28             our %ALLOW_RX = (
29             );
30              
31             # Used by _value_is_allowed
32             our %ALLOW_VALUE = (
33             );
34              
35             # Package version
36             our ($VERSION) = '$Revision: 0.01 $' =~ /\$Revision:\s+([^\s]+)/;
37              
38             =head1 NAME
39              
40             VLGal::Directory - Vincenzo's little gallery direcrory
41              
42             =head1 SYNOPSIS
43              
44             TODO
45              
46             =head1 ABSTRACT
47              
48             Vincenzo's little gallery direcrory
49              
50             =head1 DESCRIPTION
51              
52             C describes properties of Vincenzo's little gallery directories.
53              
54             =head1 CONSTRUCTOR
55              
56             =over
57              
58             =item new( [ OPT_HASH_REF ] )
59              
60             Creates a new C object. C is a hash reference used to pass initialization options. On error an exception C is thrown.
61              
62             Options for C may include:
63              
64             =over
65              
66             =item B>
67              
68             Passed to L. Must be an C reference.
69              
70             =back
71              
72             Options for C inherited through package B> may include:
73              
74             =over
75              
76             =item B>
77              
78             Passed to L.
79              
80             =item B>
81              
82             Passed to L.
83              
84             =item B>
85              
86             Passed to L.
87              
88             =back
89              
90             =item new_from_fs(OPT_HASH_REF)
91              
92             Creates a new C object from the specified C and C options in C. C is a hash reference used to pass initialization options for C objects. On error an exception C is thrown.
93              
94             =back
95              
96             =head1 METHODS
97              
98             =over
99              
100             =item add_file( [ VALUE ... ] )
101              
102             Add additional values on the list of files in the directory. Each C is an object out of which the id is obtained through method C. The obtained B is used to store the value and may be used for deletion and to fetch the value. 0 or more values may be supplied. Multiple occurrences of the same key yield in the last occurring key to be inserted and the rest to be ignored. Each key of the specified values is allowed to occur only once. On error an exception C is thrown.
103              
104             =over
105              
106             =item The values in C must be a (sub)class of:
107              
108             =over
109              
110             =item VLGal::File
111              
112             =back
113              
114             =back
115              
116             =item delete_file(ARRAY)
117              
118             Delete elements from the list of files in the directory. Returns the number of deleted elements. On error an exception C is thrown.
119              
120             =item exists_file(ARRAY)
121              
122             Returns the count of items in C that are in the list of files in the directory.
123              
124             =item generate()
125              
126             This method is an implementation from package C. Generates the C files and image files that implement the gallery.
127              
128             The file organisation leaves the original organisation as intact as possible. That is, in each directory one file C and one directory C<.vlgal> are claimed. The file C is the entry point for the gallery. Directory C<.vlgal> contains generated images in lower resolution and quality and C files required by the gallery.
129              
130             =item get_basename()
131              
132             This method is inherited from package C. Returns the file's base name.
133              
134             =item get_dirname()
135              
136             This method is inherited from package C. Returns the file's directory name.
137              
138             =item get_super_dir()
139              
140             This method is inherited from package C. Returns the super directory in the file system.
141              
142             =item keys_file()
143              
144             Returns an C containing the keys of the list of files in the directory.
145              
146             =item mk_fs_name()
147              
148             This method is inherited from package C. Makes the file systemn name of the object usinf C and C.
149              
150             =item mk_vlgal_dir_name()
151              
152             This method is overloaded from package C. Makes the name of the C<.vlgal> directory.
153              
154             =item set_basename(VALUE)
155              
156             This method is inherited from package C. Set the file's base name. C is the value. On error an exception C is thrown.
157              
158             =item set_dirname(VALUE)
159              
160             This method is inherited from package C. Set the file's directory name. C is the value. On error an exception C is thrown.
161              
162             =item set_file( [ VALUE ... ] )
163              
164             Set the list of files in the directory absolutely using values. Each C is an object out of which the id is obtained through method C. The obtained B is used to store the value and may be used for deletion and to fetch the value. 0 or more values may be supplied. Multiple occurrences of the same key yield in the last occurring key to be inserted and the rest to be ignored. Each key of the specified values is allowed to occur only once. On error an exception C is thrown.
165              
166             =over
167              
168             =item The values in C must be a (sub)class of:
169              
170             =over
171              
172             =item VLGal::File
173              
174             =back
175              
176             =back
177              
178             =item set_super_dir(VALUE)
179              
180             This method is inherited from package C. Set the super directory in the file system. C is the value. On error an exception C is thrown.
181              
182             =over
183              
184             =item VALUE must be a (sub)class of:
185              
186             =over
187              
188             =item VLGal::Directory
189              
190             =back
191              
192             =back
193              
194             =item values_file( [ KEY_ARRAY ] )
195              
196             Returns an C containing the values of the list of files in the directory. If C contains one or more Cs the values related to the Cs are returned. If no Cs specified all values are returned.
197              
198             =back
199              
200             =head1 SEE ALSO
201              
202             L,
203             L,
204             L,
205             L,
206             L
207              
208             =head1 BUGS
209              
210             None known (yet.)
211              
212             =head1 HISTORY
213              
214             First development: September 2003
215             Last update: October 2003
216              
217             =head1 AUTHOR
218              
219             Vincenzo Zocca
220              
221             =head1 COPYRIGHT
222              
223             Copyright 2003 by Vincenzo Zocca
224              
225             =head1 LICENSE
226              
227             This file is part of the C module hierarchy for Perl by
228             Vincenzo Zocca.
229              
230             The VLGal module hierarchy is free software; you can redistribute it
231             and/or modify it under the terms of the GNU General Public License
232             as published by the Free Software Foundation; either version 2 of
233             the License, or (at your option) any later version.
234              
235             The VLGal module hierarchy is distributed in the hope that it will
236             be useful, but WITHOUT ANY WARRANTY; without even the implied
237             warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
238             See the GNU General Public License for more details.
239              
240             You should have received a copy of the GNU General Public License
241             along with the VLGal module hierarchy; if not, write to
242             the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
243             Boston, MA 02111-1307 USA
244              
245             =cut
246              
247             sub new_from_fs {
248 2     2 1 3 my $class = shift;
249 2 50       7 my $opt = defined($_[0]) ? shift : {};
250              
251             # Check if file system name is a valid directory name
252 2         20 my $fs_name = File::Spec->catfile( $opt->{dirname}, $opt->{basename} );
253 2 50       28 ( -d $fs_name ) ||
254             throw Error::Simple("ERROR: VLGal::Directory::new_from_fs, specified file system file name '$fs_name' is not a directory.");
255              
256             # Create a VLGal::Directory object and add files to it
257 2         15 my $self = VLGal::Directory->new($opt);
258              
259             # Open directory and use factory to create files
260 2         3 my %opt = %{$opt};
  2         8  
261 2         13 my $dir = DirHandle->new( $fs_name );
262 2         116 while ( my $basename = $dir->read() ) {
263             # Skip this, super and '.vlgal' directory
264 4 100       56 ( $basename eq '.' ) && next;
265 3 100       48 ( $basename eq '..' ) && next;
266 2 50       6 ( lc( $basename ) eq '.vlgal' ) && next;
267              
268             # Make new file
269 2         4 $opt{dirname} = $fs_name;
270 2         3 $opt{basename} = $basename;
271 2         21 my $fs_name = File::Spec->catfile( $opt{dirname}, $opt{basename} );
272 2         5 my $file = undef;
273 2 100       47 if ( -d $fs_name ) {
    50          
274 1         8 $file = VLGal::Directory->new_from_fs( \%opt );
275             }
276             elsif ( -f $fs_name ) {
277             # Use the factory to create VLGal::File objects.
278 1         8 $file = VLGal::File::Factory->instance()->create_file( \%opt );
279             }
280              
281             # Add file to directory
282 1 50       54 defined($file) && $self->add_file($file);
283             }
284              
285             # Return $self
286 1         12 return($self);
287             }
288              
289             sub _initialize {
290 2     2   3 my $self = shift;
291 2 50       10 my $opt = defined($_[0]) ? shift : {};
292              
293             # Check $opt
294 2 50       10 ref($opt) eq 'HASH' || throw Error::Simple("ERROR: VLGal::Directory::_initialize, first argument must be 'HASH' reference.");
295              
296             # _all_file_, SINGLE
297 2 50       6 exists( $opt->{_all_file_} ) && $self->set__all_file_( $opt->{_all_file_} );
298              
299             # file, MULTI
300 2 50       5 if ( exists( $opt->{file} ) ) {
301 0 0       0 ref( $opt->{file} ) eq 'ARRAY' || throw Error::Simple("ERROR: VLGal::Directory::_initialize, specified value for option 'file' must be an 'ARRAY' reference.");
302 0         0 $self->set_file( @{ $opt->{file} } );
  0         0  
303             }
304             else {
305 2         5 $self->set_file();
306             }
307              
308             # Call the superclass' _initialize
309 2         11 $self->SUPER::_initialize($opt);
310              
311             # Return $self
312 2         5 return($self);
313             }
314              
315             sub _mk_vlgal_dir {
316 0     0   0 my $self = shift;
317              
318             # Get the style object
319 0         0 my $style = VLGal::Style->instance();
320              
321             # Make the style basenames
322 0         0 $style->_mk_size_basename();
323              
324             # Make the .vlgal directory
325 0 0       0 ( -d $self->mk_vlgal_dir_name() ) ||
326             mkdir( $self->mk_vlgal_dir_name() );
327              
328             # Make the .vlgal/icon directory
329 0         0 my $icon_dir = File::Spec->catfile( $self->mk_vlgal_dir_name(), 'icon' );
330 0 0       0 ( -d $icon_dir ) ||
331             mkdir( $icon_dir );
332              
333             # Make the .vlgal/orig directory
334 0         0 my $orig_dir = File::Spec->catfile( $self->mk_vlgal_dir_name(), 'orig' );
335 0 0       0 ( -d $orig_dir ) ||
336             mkdir( $orig_dir );
337              
338             # Copy the image_icon_folder to the .vlgal/icon directory
339 0         0 my $img_folder = File::Spec->catfile(
340             $icon_dir, basename( $style->get_image_icon_folder() )
341             );
342 0 0       0 ( -f $img_folder ) ||
343             copy( $style->get_image_icon_folder(), $img_folder );
344              
345             # Copy the image_icon_next_peer to the .vlgal/icon directory
346 0         0 my $img_next_peer = File::Spec->catfile(
347             $icon_dir, basename( $style->get_image_icon_next_peer() )
348             );
349 0 0       0 ( -f $img_next_peer ) ||
350             copy( $style->get_image_icon_next_peer(), $img_next_peer );
351              
352             # Copy the image_icon_next_seq to the .vlgal/icon directory
353 0         0 my $img_next_seq = File::Spec->catfile(
354             $icon_dir, basename( $style->get_image_icon_next_seq() )
355             );
356 0 0       0 ( -f $img_next_seq ) ||
357             copy( $style->get_image_icon_next_seq(), $img_next_seq );
358              
359             # Copy the image_icon_previous_peer to the .vlgal/icon directory
360 0         0 my $img_prev_peer = File::Spec->catfile(
361             $icon_dir, basename( $style->get_image_icon_previous_peer() )
362             );
363 0 0       0 ( -f $img_prev_peer ) ||
364             copy( $style->get_image_icon_previous_peer(), $img_prev_peer );
365              
366             # Copy the image_icon_previous_seq to the .vlgal/icon directory
367 0         0 my $img_prev_seq = File::Spec->catfile(
368             $icon_dir, basename( $style->get_image_icon_previous_seq() )
369             );
370 0 0       0 ( -f $img_prev_seq ) ||
371             copy( $style->get_image_icon_previous_seq(), $img_prev_seq );
372              
373             # Make the size sub-directories
374 0         0 foreach my $size ( $style->get_size() ) {
375 0         0 my $size_sub = File::Spec->catfile(
376             $self->mk_vlgal_dir_name(),
377             $size->get_basename(),
378             );
379 0 0       0 ( -d $size_sub ) ||
380             mkdir( $size_sub );
381             }
382             }
383              
384             sub _value_is_allowed {
385 3     3   5 my $name = shift;
386              
387             # Value is allowed if no ALLOW clauses exist for the named attribute
388 3 0 33     469 if ( ! exists( $ALLOW_ISA{$name} ) && ! exists( $ALLOW_REF{$name} ) && ! exists( $ALLOW_RX{$name} ) && ! exists( $ALLOW_VALUE{$name} ) ) {
      0        
      0        
389 0         0 return(1);
390             }
391              
392             # At this point, all values in @_ must to be allowed
393             CHECK_VALUES:
394 3         7 foreach my $val (@_) {
395             # Check ALLOW_ISA
396 1 50 33     6 if ( ref($val) && exists( $ALLOW_ISA{$name} ) ) {
397 1         1 foreach my $class ( @{ $ALLOW_ISA{$name} } ) {
  1         2  
398 1 50       7 &UNIVERSAL::isa( $val, $class ) && next CHECK_VALUES;
399             }
400             }
401              
402             # Check ALLOW_REF
403 0 0 0     0 if ( ref($val) && exists( $ALLOW_REF{$name} ) ) {
404 0 0       0 exists( $ALLOW_REF{$name}{ ref($val) } ) && next CHECK_VALUES;
405             }
406              
407             # Check ALLOW_RX
408 0 0 0     0 if ( defined($val) && ! ref($val) && exists( $ALLOW_RX{$name} ) ) {
      0        
409 0         0 foreach my $rx ( @{ $ALLOW_RX{$name} } ) {
  0         0  
410 0 0       0 $val =~ /$rx/ && next CHECK_VALUES;
411             }
412             }
413              
414             # Check ALLOW_VALUE
415 0 0 0     0 if ( ! ref($val) && exists( $ALLOW_VALUE{$name} ) ) {
416 0 0       0 exists( $ALLOW_VALUE{$name}{$val} ) && next CHECK_VALUES;
417             }
418              
419             # We caught a not allowed value
420 0         0 return(0);
421             }
422              
423             # OK, all values are allowed
424 3         16 return(1);
425             }
426              
427             sub add_file {
428 1     1 1 2 my $self = shift;
429              
430             # Check if isas/refs/rxs/values are allowed
431 1 50       3 &_value_is_allowed( 'file', @_ ) || throw Error::Simple("ERROR: VLGal::Directory::add_file, one or more specified value(s) '@_' is/are not allowed.");
432              
433             # Add keys/values
434 1         2 foreach my $val (@_) {
435 1         17 $self->{VLGal_Directory}{file}{ $val->get_basename() } = $val;
436 1         14 $val->set_super_dir( $self );
437             }
438             }
439              
440             sub delete_file {
441 0     0 1 0 my $self = shift;
442              
443             # Delete values
444 0         0 my $del = 0;
445 0         0 foreach my $val (@_) {
446 0 0       0 exists( $self->{VLGal_Directory}{file}{$val} ) || next;
447 0         0 delete( $self->{VLGal_Directory}{file}{$val} );
448 0         0 $del ++;
449             }
450 0         0 return($del);
451             }
452              
453             sub exists_file {
454 0     0 1 0 my $self = shift;
455              
456             # Count occurrences
457 0         0 my $count = 0;
458 0         0 foreach my $val (@_) {
459 0         0 $count += exists( $self->{VLGal_Directory}{file}{$val} );
460             }
461 0         0 return($count);
462             }
463              
464             sub generate {
465 0     0 1 0 my $self = shift;
466              
467             # Make the _all_file_ list
468 0 0       0 $self->get_super_dir() ||
469             $self->mk__all_file_();
470              
471             # Make code easier to read with $style
472 0         0 my $style = VLGal::Style->instance();
473              
474             # Make the .vlgal directory
475 0         0 $self->_mk_vlgal_dir();
476              
477             # Make dirname for index-vlgal.html file
478 0         0 my $idx_dir = $self->mk_fs_name();
479              
480             # Make list of lists containing:
481             # 1) Full index-vlgal.html name
482             # 2)
483 0         0 my $size_0 = ( $style->get_size() )[0];
484 0         0 my $size_1 = ( $style->get_size() )[1];
485 0         0 my @idx = ( [
486             File::Spec->catfile(
487             $self->mk_fs_name(),
488             'index-vlgal.html'
489             ),
490             '.vlgal/icon',
491             '.vlgal/' . $size_0->get_basename(),
492             '..',
493             '.vlgal/' . $size_1->get_basename() . '/__BASENAME__',
494             '__BASENAME__/index-vlgal.html',
495             '',
496             '.vlgal',
497             $size_1
498             ] );
499 0         0 my $i = -1;
500 0         0 foreach my $size ( $style->get_size() ) {
501             # Increment $i
502 0         0 $i++;
503              
504             # Skip the thumbnail (0) and the default (1) size
505 0 0       0 $i < 1 &&
506             next;
507              
508             # Make the absolute index-vlgal.html file name
509 0         0 my $idx_fn = File::Spec->catfile(
510             $self->mk_fs_name(),
511             '.vlgal',
512             $size->get_basename(),
513             'index-vlgal.html'
514             );
515              
516             # Make the gp icon html directory
517 0         0 my $gp_icon_html_dir = '../icon';
518              
519             # Make the img icon html directory
520 0         0 my $img_icon_html_dir = '../' . $size_0->get_basename();
521              
522             # Make the super html directory
523 0         0 my $super_html_dir = '../../../.vlgal/' . $size->get_basename();
524              
525             # Make the image html directory
526 0         0 my $img_href_tmpl = '__BASENAME__';
527              
528             # Make the sub-directory html directory template
529 0         0 my $sub_href_tmpl = '../../__BASENAME__/.vlgal/' .
530             $size->get_basename() . '/index-vlgal.html';
531              
532             # Make the default size-switch html directory prefix
533 0         0 my $size_switch_def_html_dir = '../..';
534              
535             # Make the size-switch html directory prefix
536 0         0 my $size_switch_html_dir = '..';
537              
538             # Push an entry on @idx
539 0         0 push( @idx, [
540             $idx_fn,
541             $gp_icon_html_dir,
542             $img_icon_html_dir,
543             $super_html_dir,
544             $img_href_tmpl,
545             $sub_href_tmpl,
546             $size_switch_def_html_dir,
547             $size_switch_html_dir,
548             $size
549             ] );
550             }
551              
552             # Make @dir and @file array
553 0         0 my @dir = ();
554 0         0 my @file = ();
555 0         0 foreach my $key ( sort( $self->keys_file() ) ) {
556 0         0 my $file = ( $self->values_file( $key ) )[0];
557 0 0       0 if ( $file->isa('VLGal::Directory') ) {
558 0         0 push( @dir, $file );
559             }
560             else {
561 0         0 push( @file, $file );
562             }
563             }
564              
565             # Generate the html indexes
566 0         0 foreach my $idx (@idx) {
567 0         0 $self->generate_index_html( @{$idx}, \@dir, \@file );
  0         0  
568             }
569              
570             # Generate all sub-dirs
571 0         0 foreach my $dir (@dir) {
572 0         0 $dir->generate();
573             }
574              
575             # Generate all files
576 0         0 for ( my $i = 0; $i < scalar(@file); $i++ ) {
577 0         0 my $file = $file[$i];
578 0         0 my $prev = undef;
579 0         0 my $next = undef;
580 0 0       0 $prev = $file[$i - 1] if ($i);
581 0 0       0 $next = $file[$i + 1] if ($i < ( scalar(@file) - 1) );
582 0         0 $file->generate( $prev, $next );
583             }
584             }
585              
586             sub generate_index_html {
587 0     0 0 0 my $self = shift;
588 0         0 my $fn = shift;
589 0         0 my $gp_icon_html_dir = shift;
590 0         0 my $img_icon_html_dir = shift;
591 0         0 my $super_html_dir = shift;
592 0         0 my $img_href_tmpl = shift;
593 0         0 my $sub_href_tmpl = shift;
594 0         0 my $size_switch_def_html_dir = shift;
595 0         0 my $size_switch_html_dir = shift;
596 0         0 my $size = shift;
597 0         0 my $dir = shift;
598 0         0 my $file = shift;
599              
600             # Make code easier to read with $style
601 0         0 my $style = VLGal::Style->instance();
602              
603             # Print verbose message
604 0 0       0 $style->is_verbose() &&
605             print STDERR "Making file '$fn'.\n";
606              
607             # Open the index-vlgal.html file
608 0         0 my $fh = IO::File->new( $fn, 'w' );
609 0 0       0 defined($fh) ||
610             throw Error::Simple("ERROR: VLGal::Directory::generate_index_html, failed to open file '$fn' for writing.");
611              
612             # Write the first part of the html header
613 0         0 my $basename = $self->get_basename();
614 0         0 $fh->print(<
615            
616            
617            
618            
630             Gallery of $basename
631            
632            
633             EOF
634              
635             # Write super directory access line
636 0         0 my @super = ();
637 0         0 my $runner = $self;
638 0         0 while ( my $super = $runner->get_super_dir() ) {
639 0         0 push( @super, $super );
640 0         0 $runner = $super;
641             }
642 0         0 $fh->print(<
643             Path:
644             EOF
645 0         0 for ( my $i = scalar( @super ) - 1; $i >= 0; $i-- ) {
646 0         0 my $super_base = $super[$i]->get_basename();
647 0         0 my $super_dir = '../' x $i;
648 0         0 $fh->print(<
649             $super_base /
650             EOF
651             }
652 0         0 $fh->print(<
653             $basename
654             EOF
655              
656             # Generate table directories
657 0         0 $self->generate_table(
658             $fh,
659             'Directories',
660             $style->get_table_order_dir(),
661             'directory',
662             $style->get_max_columns_dir(),
663             $gp_icon_html_dir,
664             $sub_href_tmpl,
665             $dir
666             );
667              
668             # Generate table directories
669 0         0 my $size_0 = ( $style->get_size() )[0];
670 0         0 my $size_1 = ( $style->get_size() )[1];
671 0         0 $self->generate_table(
672             $fh,
673             'Files',
674             $style->get_table_order_image(),
675             'file',
676             $style->get_max_columns_image(),
677             $img_icon_html_dir,
678             $img_href_tmpl,
679             $file
680             );
681              
682             # Close html file
683 0         0 $fh->print(<
684            
685            
686             EOF
687              
688             # Generate sizes
689 0         0 $self->generate_size(
690             $fh,
691             $size,
692             $size_switch_def_html_dir,
693             $size_switch_html_dir
694             );
695             }
696              
697             sub generate_size {
698 0     0 0 0 my $self = shift;
699 0         0 my $fh = shift;
700 0         0 my $skip_size = shift;
701 0         0 my $size_switch_def_html_dir = shift;
702 0         0 my $size_switch_html_dir = shift;
703              
704 0         0 $fh->print(<
705            
706             Size:
707             EOF
708 0         0 my $i = -1;
709 0         0 my $size_nr = scalar( VLGal::Style->instance()->get_size() );
710 0         0 foreach my $size ( VLGal::Style->instance()->get_size() ) {
711 0         0 $i++;
712 0 0       0 $i > 0 ||
713             next;
714              
715 0         0 my $label = $size->get_label();
716 0         0 my $size_base = $size->get_basename();
717 0         0 my $html_dir;
718 0 0       0 if ( $i == 1 ) {
719 0         0 $html_dir = $size_switch_def_html_dir;
720 0         0 $label = "(default) $label";
721             }
722             else {
723 0         0 $html_dir = "$size_switch_html_dir/$size_base";
724             }
725              
726 0         0 my $slash;
727 0 0       0 if ( $i == $size_nr - 1 ) {
728 0         0 $slash = '';
729             }
730             else {
731 0         0 $slash = ' /';
732             }
733              
734 0 0       0 if ( $skip_size == $size ) {
735 0         0 $fh->print(<
736             $label${slash}
737             EOF
738             }
739             else {
740 0         0 $fh->print(<
741             $label ${slash}
742             EOF
743             }
744             }
745             }
746              
747             sub generate_table {
748 0     0 0 0 my $self = shift;
749 0         0 my $fh = shift;
750 0         0 my $title = shift;
751 0         0 my $order = shift;
752 0         0 my $class = shift;
753 0         0 my $max_col = shift;
754 0         0 my $icon_dir = shift;
755 0         0 my $sub_href_tmpl = shift;
756 0         0 my $file = shift;
757              
758             # Do nothing if no files
759 0 0       0 scalar( @{$file} ) ||
  0         0  
760             return();
761              
762             # Start table and make table header
763 0         0 $fh->print(<
764            
765            
766            
767            
768            
769             $title
770            
771            
772            
773             EOF
774              
775             # Start table row
776 0         0 $fh->print(<
777            
778             EOF
779              
780             # Calculate the amount of rows
781 0         0 my $rows = int( scalar( @{$file} ) / $max_col );
  0         0  
782 0 0       0 $rows++ if ( scalar( @{$file} ) % $max_col );
  0         0  
783              
784             # Generate each row
785 0         0 for ( my $i = 0; $i < $rows; $i++ ) {
786              
787             # Generate each column
788 0         0 for ( my $j = 0; $j < $max_col; $j++ ) {
789              
790             # The number of the file
791 0         0 my $file_nr;
792 0 0       0 if ( $order eq 'z' ) {
793 0         0 $file_nr += $i * $max_col + $j;
794             }
795             else {
796 0         0 $file_nr += $i + $j * $rows;
797             }
798              
799             # Get the file
800 0         0 my $file = $file->[$file_nr];
801              
802             # Generate table data
803 0 0       0 $file &&
804             $file->generate_table_td($fh, $icon_dir, $sub_href_tmpl);
805             }
806              
807             # New table row
808 0 0       0 $i < scalar( @{$file} ) - 1 &&
  0         0  
809             $fh->print(<
810            
811            
812             EOF
813             }
814              
815             # Finish table row
816 0         0 $fh->print(<
817            
818             EOF
819              
820             # Finish table
821 0         0 $fh->print(<
822            
823             EOF
824             }
825              
826             sub generate_table_td {
827 0     0 0 0 my $self = shift;
828 0         0 my $fh = shift;
829 0         0 my $icon_dir = shift;
830 0         0 my $sub_href_tmpl = shift;
831              
832             # Start table data
833 0         0 $fh->print(<
834            
835             EOF
836              
837             # Start anchor
838 0         0 my $basename = $self->get_basename();
839 0         0 $sub_href_tmpl =~ s/__BASENAME__/$basename/g;
840 0         0 $fh->print(<
841            
842             EOF
843              
844             # Icon and text in anchor
845 0         0 my $src = join( '/',
846             $icon_dir,
847             basename( VLGal::Style->instance()->get_image_icon_folder() )
848             );
849 0         0 $fh->print(<
850            
851             $basename
852             EOF
853              
854             # Print basename
855              
856             # End anchor
857 0         0 $fh->print(<
858            
859             EOF
860              
861             # End table data
862 0         0 $fh->print(<
863            
864             EOF
865             }
866              
867             sub get__all_file_ {
868 0     0 0 0 my $self = shift;
869              
870 0         0 return( $self->{VLGal_Directory}{_all_file_} );
871             }
872              
873             sub keys_file {
874 0     0 1 0 my $self = shift;
875              
876             # Return all keys
877 0         0 return( keys( %{ $self->{VLGal_Directory}{file} } ) );
  0         0  
878             }
879              
880             sub mk__all_file_ {
881 0     0 0 0 my $self = shift;
882              
883             # Make a list of files
884 0         0 my @file = ();
885 0         0 foreach my $basename ( sort( $self->keys_file() ) ) {
886 0         0 my $file = ( $self->values_file( $basename ) )[0];
887 0         0 push(@file, $file);
888 0 0       0 $file->isa('VLGal::Directory') ||
889             next;
890 0         0 $file->mk__all_file_();
891 0         0 my $sub_file = $file->get__all_file_();
892 0         0 push( @file, @{ $sub_file->[0] } );
  0         0  
893             }
894              
895             # Make an index of the list
896 0         0 my %file = ();
897 0         0 for ( my $i = 0; $i < scalar(@file); $i++ ) {
898 0         0 $file{ $file[$i] } = $i;
899             }
900              
901             # Store the list and the index
902 0         0 $self->set__all_file_( [
903             \@file, \%file
904             ] );
905             }
906              
907             sub mk_vlgal_dir_name {
908 0     0 1 0 my $self = shift;
909              
910 0         0 return( File::Spec->catfile( $self->get_dirname(), $self->get_basename(), '.vlgal' ) );
911             }
912              
913             sub set__all_file_ {
914 0     0 0 0 my $self = shift;
915 0         0 my $val = shift;
916              
917             # Check if isa/ref/rx/value is allowed
918 0 0       0 &_value_is_allowed( '_all_file_', $val ) || throw Error::Simple("ERROR: VLGal::Directory::set__all_file_, the specified value '$val' is not allowed.");
919              
920             # Assignment
921 0         0 $self->{VLGal_Directory}{_all_file_} = $val;
922             }
923              
924             sub set_file {
925 2     2 1 2 my $self = shift;
926              
927             # Check if isas/refs/rxs/values are allowed
928 2 50       6 &_value_is_allowed( 'file', @_ ) || throw Error::Simple("ERROR: VLGal::Directory::set_file, one or more specified value(s) '@_' is/are not allowed.");
929              
930             # Empty list
931 2         15 $self->{VLGal_Directory}{file} = {};
932              
933             # Add keys/values
934 2         5 foreach my $val (@_) {
935 0           $self->{VLGal_Directory}{file}{ $val->get_basename() } = $val;
936 0           $val->set_super_dir( $self );
937             }
938             }
939              
940             sub values_file {
941 0     0 1   my $self = shift;
942              
943 0 0         if ( scalar(@_) ) {
944 0           my @ret = ();
945 0           foreach my $key (@_) {
946 0 0         exists( $self->{VLGal_Directory}{file}{$key} ) && push( @ret, $self->{VLGal_Directory}{file}{$key} );
947             }
948 0           return(@ret);
949             }
950             else {
951             # Return all values
952 0           return( values( %{ $self->{VLGal_Directory}{file} } ) );
  0            
953             }
954             }
955              
956             1;