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 )]; } }; $Template::Stash::LIST_OPS->{sortf}=sub { my ($array,$field)=@_; return [ sort { lc $a->{$field} cmp lc $b->{$field} } @$array ]; }; $Template::Stash::LIST_OPS->{nsortf}=sub { my ($array,$field)=@_; return [ sort { $a->{$field} <=> $b->{$field} } @$array ]; }; 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, datesFor => sub{WebCoso::Common::getDatesFor($self->{fc},@_)}, }; $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;