NAME

Text::APL - non-blocking and streaming capable template engine

SYNOPSIS

Simple example

$template->render(
    input  => \$input,
    output => \$output,
    vars   => {foo => 'bar'}
);

Streaming example

$template->render(
    input => sub {
        my ($cb) = @_;

        # Call $cb($data) when data is available
        # Call $cb->() on EOF
    },
    output => sub {
        my ($chunk) = @_;

        # Print $chunk to the needed output
        # $chunk is undef when template is fully rendered
    },
    vars => {foo => 'bar'}
);

DESCRIPTION

This is yet another template engine. But compared to others it supports non-blocking (read/write) and streaming output.

Reader/Writer

Reader and writer can be a subroutine references reading from any source and writing output to any destination. Sane default implementations for reading from a string, a file or file handle and writing to the string, a file or a file handle are also available.

Parser

Parser can parse not only full templates but chunk by chunk correctly resolving any ambiguous leftovers. This allows immediate parsing.

This for example works just fine:

$parser->parse('<% $hello');
$parser->parse(' %>');

Compiler

Compiler compiles templates into Perl code but when evaluating does not create a Perl string that accumulates all the template output, but rather provides a special print function that pushes the content as soon as it's available (streaming).

The generated Perl code can looks like this:

Hello, <%= $nickname %>!

# becomes

__print(q{Hello, });
__print_escaped(do {$foo});
__print(q{!});

SYNTAX

Syntax is borrowed from the template standards shared among several web framewoks in different languages:

<% foo() %> # evaluate code
% foo()

<%= $foo %> # insert evaluation result
%= $foo

<%== $foo %> # insert evaluation result without escaping
%== %foo

No new template language is provided, just the old Perl.

METHODS

new

my $template = Text::APL->new;

Create new Text::APL instance.

Accepted options:

render

$template->render(
    input   => \$input,
    output  => \$output,
    vars    => {foo => 'bar'},
    helpers => {
        time => sub {time}
    }
);

input and output can be a filename, a reference to scalar, a file handle and a reference to subroutine. Read more at Text::APL::Reader and Text::APL::Writer.

vars are Perl variables available in the template.

helpers are Perl subroutines. available in the template.

EXAMPLES

For working examples see examples/ directory in distribution.

DEVELOPMENT

Repository

http://github.com/vti/text-apl

AUTHOR

Viacheslav Tykhanovskyi, vti@cpan.org.

COPYRIGHT AND LICENSE

Copyright (C) 2012-2017, Viacheslav Tykhanovskyi

This program is free software, you can redistribute it and/or modify it under the terms of the Artistic License version 2.0.