Astro-App-Satpass2
view release on metacpan or search on metacpan
lib/Astro/App/Satpass2/Format/Template.pm view on Meta::CPAN
#
# Returns true if the format() method is above us on the call
# stack, otherwise returns false.
use constant REPORT_CALLER => __PACKAGE__ . '::format';
sub _is_format {
my $level = 2; # Start with caller's caller.
while ( my @info = caller( $level ) ) {
REPORT_CALLER eq $info[3]
and return $level;
$level++;
}
return;
}
sub _localize {
my ( $report, $source, $default ) = @_;
defined $default
or $default = $source;
defined $report
or return defined $source ? $source : $default;
return scalar __localize(
text => [ "-$report", 'string', $source ],
default => $source,
);
}
sub _process {
my ( $self, $tplt, %arg ) = @_;
ARRAY_REF eq ref $arg{arg}
and $arg{arg} = Astro::App::Satpass2::Wrap::Array->new(
$arg{arg} );
my $output;
my $tt = $self->{tt};
# NOTE that what I really want is to be able to hook into the
# Template-Toolkit loading system. Because that is impossible (or at
# least I can't figure out how to do it) the following code
# special-cases template '%% INCLUDE ( \w+ )' (and reasonable
# equivalents) and loads the template directly. Note that this is
# what Template-Toolkit calls outline-tag syntax, but it works
# independentl;y of whether outline tags are enabled.
unless ( ref $tplt ) {
while ( defined( my $tplt_text = $self->template( $tplt ) ) ) {
if ( $tplt_text =~ m/\A %% \s* include \s+ ( \w+ ) \s* \z /smxi ) {
$tplt = $1;
} else {
$tplt = \$tplt_text;
last;
}
}
}
$tt->process( $tplt, \%arg, \$output )
or $self->wail( $tt->error() );
return $output;
}
# Cribbed shamelessly from List::MoreUtils. The author reserves the
# right to relocate, rename or otherwise mung with this without notice
# to anyone. Caveat user.
sub _uniq {
my %found;
return ( grep { ! $found{$_}++ } @_ );
}
sub _wrap {
my ( $self, %arg ) = @_;
my $data = $arg{data};
my $default = $arg{default};
my $report = $arg{report};
my $title = ! $data;
$data ||= {};
$default ||= $self->__default();
if ( instance( $data, FORMAT_VALUE ) ) {
# Do nothing
} elsif ( ! defined $data || HASH_REF eq ref $data ) {
my $value_formatter = $self->value_formatter();
$data = $value_formatter->new(
data => $data,
default => $default,
date_format => $self->date_format(),
desired_equinox_dynamical =>
$self->desired_equinox_dynamical(),
provider => $self->provider(),
round_time => $self->round_time(),
time_format => $self->time_format(),
time_formatter => $self->time_formatter(),
local_coordinates => sub {
my ( $data, @arg ) = @_;
return $self->_process( $self->local_coord(),
data => $data,
arg => \@arg,
title => $self->_wrap(
default => $default,
report => $report,
),
localize => sub {
return _localize( $report, @_ );
},
);
},
list_formatter => sub {
my ( $data, @arg ) = @_;
my $body = $data->body();
my $list_type = $body ? $body->__list_type() : 'inertial';
return $self->_process( "list_$list_type",
data => $data,
arg => \@arg,
title => $self->_wrap(
default => $default,
report => $report,
),
);
},
report => $report,
title => $title,
( run in 0.969 second using v1.01-cache-2.11-cpan-71847e10f99 )