Projekt

Allgemein

Profil

Herunterladen (2,35 KB) Statistiken
| Zweig: | Markierung: | Revision:
67b21d42 Moritz Bunkus
package SL::LxOfficeConf;

use strict;

1feda885 Moritz Bunkus
use Encode;

424d6ead Moritz Bunkus
my $environment_initialized;

e3ff1eb6 Sven Schöling
sub safe_require {
my ($class, $may_fail);
1feda885 Moritz Bunkus
my $failed = !eval { require Config::Std; };
e3ff1eb6 Sven Schöling
if ($failed) {
if ($may_fail) {
warn $@;
return 0;
} else {
die $@;
}
}

Config::Std->import;

return 1;
}

67b21d42 Moritz Bunkus
sub read {
e3ff1eb6 Sven Schöling
my ($class, $file_name, $may_fail) = @_;
28e11d24 Moritz Bunkus
e3ff1eb6 Sven Schöling
return unless $class->safe_require($may_fail);

read_config('config/lx_office.conf.default' => \%::lx_office_conf);
67b21d42 Moritz Bunkus
_decode_recursively(\%::lx_office_conf);
c599fef2 Moritz Bunkus
28e11d24 Moritz Bunkus
$file_name ||= 'config/lx_office.conf';

if (-f $file_name) {
e3ff1eb6 Sven Schöling
read_config($file_name => \ my %local_conf);
c599fef2 Moritz Bunkus
_decode_recursively(\%local_conf);
_flat_merge(\%::lx_office_conf, \%local_conf);
}
424d6ead Moritz Bunkus
_init_environment();
_determine_application_paths();
e3ff1eb6 Sven Schöling
return 1;
67b21d42 Moritz Bunkus
}

sub _decode_recursively {
my ($obj) = @_;

while (my ($key, $value) = each %{ $obj }) {
if (ref($value) eq 'HASH') {
_decode_recursively($value);
} else {
$obj->{$key} = decode('UTF-8', $value);
}
}
}

c599fef2 Moritz Bunkus
sub _flat_merge {
my ($dst, $src) = @_;

while (my ($key, $value) = each %{ $src }) {
if (!exists $dst->{$key}) {
$dst->{$key} = $value;

} else {
map { $dst->{$key}->{$_} = $value->{$_} } keys %{ $value };
}
}
}

424d6ead Moritz Bunkus
sub _init_environment {
return if $environment_initialized;

my %key_map = ( lib => { name => 'PERL5LIB', append_path => 1 },
path => { name => 'PATH', append_path => 1 },
);
my $cfg = $::lx_office_conf{environment} || {};

while (my ($key, $value) = each %{ $cfg }) {
next unless $value;

my $info = $key_map{$key} || {};
$key = $info->{name} || $key;

if ($info->{append_path}) {
$value = ':' . $value unless $value =~ m/^:/ || !$ENV{$key};
d92c7b01 Sven Schöling
$value = $ENV{$key} . $value if $ENV{$key};
424d6ead Moritz Bunkus
}

$ENV{$key} = $value;
}

$environment_initialized = 1;
}

sub _determine_application_paths {
my @paths = grep { $_ } split m/:/, $ENV{PATH};

foreach my $key (keys %{ $::lx_office_conf{applications} }) {
my ($program) = split m/\s+/, $::lx_office_conf{applications}->{$key};
next if $program =~ m|/|;

foreach my $path (@paths) {
next unless -f "${path}/${program}";
$::lx_office_conf{applications}->{$key} = "${path}/" . $::lx_office_conf{applications}->{$key};
last;
}
}
}

67b21d42 Moritz Bunkus
1;