NAME
Text::Xslate::Syntax::Kolon - The default template syntax
SYNOPSIS
use Text::Xslate;
my $tx = Text::Xslate->new(
syntax => 'Kolon', # This is the default
string => 'Hello, <: $dialect :> world!',
);
print $tx->render({ dialect => 'Kolon' });
DESCRIPTION
Kolon is the default syntax, using <: ... :>
tags and : ...
line code.
EXAMPLES
Variable access
<: $var :>
<: $var.0 :>
<: $var.field :>
<: $var.accessor :>
<: $var["field"] :>
<: $var[0] :>
Variables may be HASH references, ARRAY references, or objects.
If $var is an object instance, you can call its methods.
<: $var.foo() :>
<: $var.foo(1, 2, 3) :>
Loops
There are for
and while
loops.
: # $data must be an ARRAY reference
: for $data -> $item {
[<: $item.field :>]
: }
: # $obj must be an iteratable object
: while $obj.fetch -> $item {
[<: $item.field :>]
: }
Conditional statements
if-then-else statement:
: if $var == nil {
$var is nil.
: }
: else if $var != "foo" {
$var is not nil nor "foo".
: }
: else {
$var is "foo".
: }
: if( $var >= 1 && $var <= 10 ) {
$var is 1 .. 10
: }
: $var.value == nil ? "nil" : $var.value
switch statement (not yet implemented):
: given $var -> $it {
: when "foo" {
it is foo.
: }
: when $it == "bar" or $it == "baz" {
it is bar or baz.
: }
: default {
it is not foo nor bar.
}
:
Expressions
Relational operators (== != < <= > >=
):
: $var == 10 ? "10" : "not 10"
: $var != 10 ? "not 10" : "10"
Note that ==
and !=
are similar to Perl's eq
and ne
except that $var == nil
is true iff $var is uninitialized, while other relational operators are numerical operators.
Arithmetic operators (+ - * / % min max>>):
: $var * 10_000
: ($var % 10) == 0
: 10 min 20 min 30 # 10
: 10 max 20 max 30 # 30
Logical operators (! && || // not and or>>)
: $var >= 0 && $var <= 10 ? "ok" : "too smaller or too larger"
: $var // "foo" # as a default value
String operators (~
)
: "[" ~ $var ~ "]" # concatination
Operator precedence is the same as Perl's:
. () []
* / %
+ - ~
< <= > >=
== !=
|
&&
|| // min max
?:
not
and
or
Functions and filters
Once you have registered functions, you can call them with ()
or |
.
: f() # without args
: f(1, 2, 3) # with args
: 42 | f # the same as f(42)
Dynamic functions/filters:
# code
sub mk_indent {
my($prefix) = @_;
return sub {
my($str) = @_;
$str =~ s/^/$prefix/xmsg;
return $str;
}
}
my $tx = Text::Xslate->new(
function => {
indent => \&mk_indent,
},
);
:# template
: $value | indent("> ")
: indent("> ")($value)
Template inclusion
: include "foo.tx"
Xslate templates may be recursively included, but including depth is limited to 100.
Template cascading
You can extend templates with block modifiers.
Base templates mytmpl/base.tx:
: block title -> { # with default
[My Template!]
: }
: block body -> {;} # without default
Another derived template mytmpl/foo.tx:
: # cascade "mytmpl/base.tx" is also okey
: cascade mytmpl::base
: # use default title
: around body -> {
My template body!
: }
Yet another derived template mytmpl/bar.tx:
: cascade mytmpl::foo
: around title -> {
--------------
: super
--------------
: }
: before body -> {
Before body!
: }
: after body -> {
After body!
: }
Then, Perl code:
my $tx = Text::Xslate->new( file => 'mytmpl/bar.tx' );
$tx->render({});
Output:
--------------
[My Template!]
--------------
Before body!
My template tody!
After body!
This is also called as template inheritance.
Macro blocks
: macro add ->($x, $y) {
: $x + $y;
: }
: add(10, 20)
: macro signeture -> {
This is foo version <: $VERSION :>
: }
: signeture()
Note that return values of macros are values that their routines renders. That is, macros themselves output nothing.
SEE ALSO
2 POD Errors
The following errors were encountered while parsing the POD:
- Around line 108:
Unterminated C< ... > sequence
- Around line 115:
Unterminated C< ... > sequence