package WebCoso::TT;
use strict;
use warnings;
use WebCoso::Common;
use Path::Class;
use Template;
use Template::Stash;
use Log::Log4perl ':easy';
$Template::Stash::HASH_OPS->{sortf}=sub {
my ($hash,$field)=@_;
if ($field) {
return [ sort { lc $hash->{$a}{$field} cmp lc $hash->{$b}{$field} } (keys %$hash )];
}
else {
return [ sort { lc $hash->{$a} cmp lc $hash->{$b} } (keys %$hash )];
}
};
$Template::Stash::HASH_OPS->{nsortf}=sub {
my ($hash,$field)=@_;
if ($field) {
return [ sort { $hash->{$a}{$field} <=> $hash->{$b}{$field} } (keys %$hash )];
}
else {
return [ sort { $hash->{$a} <=> $hash->{$b} } (keys %$hash )];
}
};
sub new {
my ($class,%opts)=@_;
my $self={%opts};
bless $self,$class;
$self->{stash}||={
dstUriFor => \&WebCoso::Common::dstUriFor,
isLang => \&WebCoso::Common::isLang,
atomIdFor => sub{WebCoso::Common::getAtomIdFor($self->{fc},@_)},
typedAs => \&WebCoso::Common::typedAs,
};
$self->{template_provider}=Template::Provider->new({
INCLUDE_PATH=> $self->{TMPLPATH},
ABSOLUTE=>1,
RELATIVE=>1,
});
$self->{template}=Template->new({
LOAD_TEMPLATES=>[$self->{template_provider}],
});
$self->{fc}->add_parser(
qr{\.tt2?$} =>
sub {
$self->{template}->context->template($_[0]);
});
$self->{expander}=sub {
my ($maker,$target,$deps,$matches)=@_;
DEBUG("expandTT($target,@$deps,@$matches)");
my $tmpl=$self->{fc}->get($deps->[-1]);
my $vars={ path=> $matches->[0],
language => $matches->[1],
filename => $deps->[-1],
%{$self->{stash}},
};
if (@$deps>1) {
INFO("tags from $deps->[0]");
$vars->{tagged}=$self->{fc}->get($deps->[0]);
}
if (@$deps>2) {
INFO("changes from $deps->[1]");
$vars->{changed}=$self->{fc}->get($deps->[1]);
}
push @{$self->{template_provider}->include_path},
file($deps->[-1])->parent;
$self->{fc}->put($target,
$self->{template}->context->process($tmpl,
$vars));
pop @{$self->{template_provider}->include_path};
};
return $self;
}
sub expandTT {
my ($self)=@_;
return $self->{expander}
}
1;