package PageOrder; use strict; sub new { my $proto = shift; my $class = ref($proto) || $proto; my $self = {}; my $data = 0; my $line = undef; my $attr = undef; my $val = undef; my $nothing = undef; $self->{NAME} = undef; $self->{PREPENDS} = []; $self->{APPENDS} = []; $self->{PRINTED} = 0; # Load pageorder from stdin while(! ( ($line = ) =~ /}/)) { next if $line =~ /^\#/; # Skip comments next if $line eq "\n"; # Skip emptylines for ($line) { s/^\s+//; s/\s+$//; } ($attr,$val) = split /\s+/, $line, 2; if($attr eq "data") { $data = 1; } for ($attr) { SWITCH: { /^name$/i && do { $self->{NAME} = $val; last SWITCH; }; /^file$/i && do { if(!$data) { push @{$self->{PREPENDS}}, $val; } else { push @{$self->{APPENDS}}, $val; } last SWITCH; }; $nothing = 1; } } } bless ($self, $class); return $self; } sub print { my $self = shift; my $file = undef; if($self->{PRINTED} == 0) { # First make sure prepends and appends have been printed before us foreach $file (@{$self->{PREPENDS}}) { &findAndPrint($self,$file); } foreach $file (@{$self->{APPENDS}}) { &findAndPrint($self,$file); } print " PageOrder {\n"; print " name $self->{NAME}\n"; foreach $file (@{$self->{PREPENDS}}) { print " part $file\n"; } print " data\n"; foreach $file (@{$self->{APPENDS}}) { print " part $file\n"; } print " }\n"; $self->{PRINTED} = 1; } return; } sub findAndPrint { my $self = shift; my ($file) = @_; my $page = undef; my $found = 0; $file =~ s/(=?\\)\"//g; foreach $page (@::pages) { if($page->page_type eq "PAGEORDER") { if($page->name eq $file) { $found = 1; if($page->printed == 0) { $page->print(); } } } } print "Could not find reference to `$file'...\n" if !$found; return; } sub find { my $self = shift; my ($file) = @_; my $page = undef; my $found = 0; $file =~ s/(=?\\)\"//g; foreach $page (@::pages) { if($page->page_type eq "PAGEORDER") { if($page->name eq $file) { return $page->path; } } } return "(not found)"; } sub name { my $self = shift; if (@_) { $self->{NAME} = shift } return $self->{NAME}; } sub prepends { my $self = shift; if (@_) { @{ $self->{PREPENDS} } = @_ } return @{ $self->{PREPENDS} }; } sub appends { my $self = shift; if (@_) { @{ $self->{APPENDS} } = @_ } return @{ $self->{APPENDS} }; } sub printed { my $self = shift; if (@_) { $self->{PRINTED} = shift } return $self->{PRINTED}; } 1; # so the require or use succeeds