Astro-App-Satpass2
view release on metacpan or search on metacpan
lib/Astro/App/Satpass2/Format/Template.pm view on Meta::CPAN
package Astro::App::Satpass2::Format::Template;
use strict;
use warnings;
use parent qw{ Astro::App::Satpass2::Format };
use Astro::App::Satpass2::Locale qw{ __localize };
# use Astro::App::Satpass2::FormatValue;
use Astro::App::Satpass2::FormatValue::Formatter;
use Astro::App::Satpass2::Utils qw{
instance
ARRAY_REF
HASH_REF
SCALAR_REF
@CARP_NOT
};
use Astro::App::Satpass2::Wrap::Array;
use Astro::App::Satpass2::Format::Template::Provider;
use Astro::Coord::ECI::TLE 0.059 qw{ :constants };
use Astro::Coord::ECI::Utils 0.059 qw{
deg2rad embodies julianday PI rad2deg TWOPI
};
use Clone qw{ };
use POSIX qw{ floor };
use Template;
use Text::Abbrev;
use Text::Wrap qw{ wrap };
our $VERSION = '0.057';
use constant FORMAT_VALUE => 'Astro::App::Satpass2::FormatValue';
sub new {
my ($class, @args) = @_;
my $self = $class->SUPER::new( @args );
# As of 0.020_002 the template definitions are in the
# locale system. The attribute simply holds modifications.
$self->{canned_template} = {};
$self->_new_tt( $self->permissive() );
$self->{default} = {};
$self->{formatter_method} = {};
return $self;
}
sub _new_tt {
my ( $self, $permissive ) = @_;
$self->{tt} = Template->new(
{
LOAD_TEMPLATES => [
Astro::App::Satpass2::Format::Template::Provider->new(
ABSOLUTE => $permissive,
RELATIVE => $permissive,
),
],
}
) or $self->weep(
"Failed to instantate tt: $Template::ERROR" );
return;
}
sub add_formatter_method {
# TODO I want the arguments to be ( $self, $fmtr ), but for the
# moment I have to live with an unreleased version that passed the
# name as the first argument. I will go to the desired signature as
# soon as I get this version installed on my own machine.
my ( $self, @arg ) = @_;
my $fmtr = HASH_REF eq ref $arg[0] ? $arg[0] : $arg[1];
HASH_REF eq ref $fmtr
or $self->wail(
'Formatter definition must be a HASH reference' );
defined( my $fmtr_name = $fmtr->{name} )
or $self->wail(
'Formatter definition must have {name} defined' );
$self->{formatter_method}{$fmtr_name}
and $self->{warner}->wail(
"Formatter method $fmtr_name already exists" );
FORMAT_VALUE->can( $fmtr_name )
and $self->{warner}->wail(
"Formatter $fmtr_name can not override built-in formatter" );
$self->{formatter_method}{$fmtr_name} =
Astro::App::Satpass2::FormatValue::Formatter->new( $fmtr );
return $self;
}
sub attribute_names {
my ( $self ) = @_;
return ( $self->SUPER::attribute_names(),
qw{ permissive },
);
}
sub config {
lib/Astro/App/Satpass2/Format/Template.pm view on Meta::CPAN
value of the attribute. In this case, the invocant is returned.
The default is false, because that is the C<Template-Toolkit> default.
The reason for this is (in terms of this module)
$fmt->format( template => '/etc/passwd' );
=head2 Formatters
As stated in the
L<Astro::App::Satpass2::Format|Astro::App::Satpass2::Format>
documentation, there is actually only one formatter method:
=head3 format
print $fmtr->format( template => 'location', data => $sta );
This formatter implements the C<format()> method using
L<Template-Toolkit|Template>. The C<template> argument is required, and
selects one of the canned templates provided. The C<data> argument is
required unless your templates are capable of calling
L<Astro::App::Satpass2|Astro::App::Satpass2> methods on their own
account, and must (if provided) be whatever is expected by the template.
See L<Templates|/Templates> below for the details.
This method can also execute an arbitrary template if you pass an
L<Astro::App::Satpass2|Astro::App::Satpass2> object in the C<sp>
argument. These templates can call methods on the C<sp> object to
generate their data. If a method which calls the C<format()> method on
its own behalf (like C<almanac()>) is called on the C<sp> object, the
recursive call is detected, and the data are passed back to the calling
template. If arguments for L<Astro::App::Satpass2|Astro::App::Satpass2>
methods are passed in, it is strongly recommended that they be passed in
the C<arg> argument.
Except for the C<template> argument, all named arguments to C<format()>
are provided to the template. In addition, the following arguments will
be provided:
=over
=item instantiate
You can pass one or more class names as arguments. The argument is a
class name which is loaded by the
L<Astro::App::Satpass2::Utils|Astro::App::Satpass2::Utils>
L<load_package()|Astro::App::Satpass2::Utils/load_package> subroutine.
If the load succeeds, an object is instantiated by calling C<new()> on
the loaded class name, and that object is returned. If no class can be
loaded an exception is thrown.
=item localize
This is a code reference to localization code. It takes two arguments:
the string to localize, and an optional default if the string can not be
localized for some reason. The second argument defaults to the first. A
typical use would be something like
[% localize( 'Location' ) %]
The localization comes from the locale system, specifically from key
C<{"-$template"}{string}{$string}>, where C<$template> is the name of
the main template being used, and C<$string> is the string to localize.
=item provider
This is simply the value returned by
L<provider()|Astro::App::Satpass2::Format/provider>.
=item time
This is the current time wrapped in an
L<Astro::App::Satpass2::FormatValue|Astro::App::Satpass2::FormatValue>
object.
=item title
This is an
L<Astro::App::Satpass2::FormatValue|Astro::App::Satpass2::FormatValue>
configured to produce field titles rather than data.
=item TITLE_GRAVITY_BOTTOM
This manifest constant is defined in
L<Astro::App::Satpass2::FormatValue|Astro::App::Satpass2::FormatValue>.
See the
L<title_gravity()|Astro::App::Satpass2::FormatValue/title_gravity>
documentation for the details.
If the C<title> object has its C<title_gravity()> set to this value
after template processing, and the output of the template has a leading
newline, that newline is removed. See the
L<Astro::App::Satpass2::FormatValue|Astro::App::Satpass2::FormatValue>
L<title_gravity()|Astro::App::Satpass2::FormatValue/title_gravity>
documentation for why this hack was imposed on the output.
=item TITLE_GRAVITY_TOP
This manifest constant is defined in
L<Astro::App::Satpass2::FormatValue|Astro::App::Satpass2::FormatValue>.
See the
L<title_gravity()|Astro::App::Satpass2::FormatValue/title_gravity>
documentation for the details.
=back
In addition to any variables passed in, the following array methods are
defined for C<Template-Toolkit> before it is invoked:
=over
=item bodies
If called on an array of objects, returns a reference to the results of
calling body() on each of the objects. This is good for (e.g.)
recovering a bunch of L<Astro::Coord::ECI::TLE|Astro::Coord::ECI::TLE>
objects from their containing
L<Astro::App::Satpass2::FormatValue|Astro::App::Satpass2::FormatValue>
objects.
=item events
( run in 0.557 second using v1.01-cache-2.11-cpan-ceb78f64989 )