Make the File string data source capable of looking for file-based templates in two locations, one specific to the app and one relative to the library. This allows PLIF to ship with default templates for various screens and thus makes it easier to bootstrap a simple app.

This commit is contained in:
ian%hixie.ch 2002-04-05 20:17:34 +00:00
Родитель 1f3b041aaa
Коммит 7c6fe87ed8
1 изменённых файлов: 36 добавлений и 24 удалений

Просмотреть файл

@ -47,43 +47,55 @@ sub provides {
return ($service eq 'dataSource.strings.default' or $class->SUPER::provides($service));
}
sub init {
my $self = shift;
my($app) = @_;
$self->SUPER::init(@_);
require File::Basename; import File::Basename; # DEPENDENCY
}
sub getDefaultString {
my $self = shift;
my($app, $protocol, $string) = @_;
my $filename;
my @filenames = ();
# XXX THIS IS PLATFORM SPECIFIC CODE XXX
if ($^O eq 'linux') {
foreach my $piece ($protocol, $string) {
$piece =~ s/[^a-zA-Z\/0-9.]/_/gos;
}
$filename = "output/$protocol/$string";
# create a path relative to the application
push(@filenames, "output/$protocol/$string");
# and a patch relative to the PLIF library
push(@filenames, dirname(__FILE__)."/../../output/$protocol/$string");
} else {
$self->error(0, "Platform '$^O' not supported yet.");
}
# XXX END OF PLATFORM SPECIFIC CODE XXX
if (-f $filename) {
local *FILE; # ugh
$self->assert(open(FILE, "<$filename"), 1, "Could not open output template file '$filename' for reading: $!");
# get the data type (platform's line delimiter)
local $/ = "\n";
my @data;
my $line;
while (defined($line = <FILE>)) {
chomp($line);
if ($line eq '') {
# stop this when we reach the first blank line
last;
foreach my $filename (@filenames) {
if (-f $filename) {
local *FILE; # ugh
$self->assert(open(FILE, "<$filename"), 1, "Could not open output template file '$filename' for reading: $!");
# get the data type (platform's line delimiter)
local $/ = "\n";
my @data;
my $line;
while (defined($line = <FILE>)) {
chomp($line);
if ($line eq '') {
# stop this when we reach the first blank line
last;
}
push(@data, $line);
}
push(@data, $line);
# and then slurp entire file (no record delimiter)
local $/ = undef;
push(@data, <FILE>);
$self->assert(close(FILE), 3, "Could not close output template file '$filename': $!");
return @data;
}
# and then slurp entire file (no record delimiter)
local $/ = undef;
push(@data, <FILE>);
$self->assert(close(FILE), 3, "Could not close output template file '$filename': $!");
return @data;
} else {
# file does not exist
$self->dump(9, "No file for string '$string' in protocol '$protocol' (looking for '$filename')");
return; # no can do, sir
}
# no file exists
local $" = '\', \'';
$self->dump(9, "No file found for string '$string' in protocol '$protocol' (looking for '@filenames')");
return; # no can do, sir
}