package Pod::HtmlPsPdf::Config;
use strict;
use Carp;
# META: probably move FindBin here
use File::Basename ();
# passed only once and then cached
use vars qw($config_file);
# called in BEGIN block before the rest of the code
####################
sub set_config_file{
$config_file = shift || '';
croak "Configuration file $config_file is not readable: $!"
unless -r $config_file;
} # end of sub set_config_file
########
sub new{
my ($class) = shift;
my $self = bless {}, ref($class)||$class;
$self->_init(@_);
return $self;
} # end of sub new
##########
sub _init{
my $self = shift;
my $new_config_file = shift || '';
set_config_file($new_config_file) if $new_config_file;
croak "Configuration file is not specified"
unless $config_file;
# The root directory of the project
my $root = File::Basename::dirname $config_file;
$self->{root} = $root;
# do all the work from the base directory
chdir $root;
# process user's configuration file
require $config_file;
use vars qw(%c);
local *c = \%Pod::HtmlPsPdf::Config::Local::c;
# dirs (will be mostly created dynamically
$self->{src_root} = $c{dir}{src} || cnf_err('$c{dir}{src}');
$self->{ps_root} = $c{dir}{rel_ps} || cnf_err('$c{dir}{rel_ps}');
$self->{rel_root} = $c{dir}{rel_html} || cnf_err('$c{dir}{rel_html}');
$self->{split_root} = $c{dir}{split_html} || cnf_err('$c{dir}{split_html}');
$self->{out_dir} = $c{dir}{out} || cnf_err('$c{dir}{out}');
# setting the filenames to process and checking their existance
$self->{pod_files} = $c{ordered_pod_files} || cnf_err('$c{ordered_pod_files}');
$self->{nonpod_files} = $c{non_pod_files} || cnf_err('$c{non_pod_files}');
for (@{$self->{pod_files}}, @{$self->{nonpod_files}}) {
croak "Can't find @{[$self->{src_root}]}/$_: $!"
unless -r $self->{src_root}."/$_";
}
# set and check that we can read the template files
my @tmpl_files = qw(index_html index_ps page_html page_ps page_split_html);
for (@tmpl_files) {
$self->{'tmpl_'.$_} = $c{tmpl}{$_} || cnf_err('$c{tmpl}{'.$_.'}');
croak "Can't find @{[$self->{'tmpl_'.$_}]}: $!"
unless -r $self->{'tmpl_'.$_};
}
$self->{out_name} = $c{out_name} || cnf_err('$c{out_name}');
$self->{toc_file} = $c{file}{toc_file} || cnf_err('$c{file}{toc_file}');
$self->{version_file} = $c{file}{version_file} || cnf_err('$c{file}{version_file}');
$self->{package_name} = $c{package_name} || cnf_err('$c{package_name}');
$self->{html2ps_conf} = $c{file}{html2ps_conf} || cnf_err('$c{file}{html2ps_conf}');
$self->{dir_mode} = $c{mode}{dir} || cnf_err('$c{mode}{dir}');
$self->{html2ps_exec} = which( 'html2ps' );
chomp $self->{html2ps_exec};
return $self;
} # end of sub _init
# user configuration parsing errors reporter
############
sub cnf_err{
croak "$_[0] from package Pod::HtmlPsPdf::Config::Local is not
defined\n";
}# end of sub cnf_err
# you can only retrieve data from this class, you cannot modify it.
##############
sub get_param{
my $self = shift;
return () unless @_;
return unless defined wantarray;
my @values = map {defined $self->{$_} ? $self->{$_} : ''} @_;
return wantarray ? @values : $values[0];
} # end of sub get_param
sub which {
my $cmd = shift;
foreach my $dir (split( ':', $ENV{PATH})) {
return "$dir/$cmd" if -x "$dir/$cmd";
}
return;
}
1;
__END__