aboutsummaryrefslogtreecommitdiff
path: root/lib/WebCoso/TT.pm
blob: a45b78790cf29f134d60b76e51881bdcef3989ec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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}{$fieldcmp lc $hash->{$b}{$field} } (keys %$hash )];
    }
    else {
        return [ sort { lc $hash->{$acmp 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->{$fieldcmp 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;