root/lang/perl/MENTOS/trunk/lib/MENTA/TemplateLoader.pm @ 26396

Revision 26396, 2.2 kB (checked in by mattn, 6 years ago)

merge from MENTA.

Line 
1package MENTA::TemplateLoader;
2use strict;
3use warnings;
4use utf8;
5
6# originaly code from NanoA::TemplateLoader
7
8sub __load {
9    my ($path, @params) = @_;
10    my $out;
11    if (__use_cache($path)) {
12        my $tmplfname = MENTA::mt_cache_dir . "/$path.c";
13        local $@;
14        my $tmplcode = do $tmplfname;
15        die $@ if $@;
16        die "テンプレートキャッシュを読み込めませんでした: ${tmplfname}($!)" unless $tmplcode;
17        $out = $tmplcode->(@params);
18    } else {
19        my $code = __compile($path);
20        local $@;
21        my $tmplcode = eval $code;
22        die $@ if $@;
23        $out = $tmplcode->(@params);
24        __update_cache($path, $code);
25    }
26    $out;
27}
28
29sub __compile {
30    my ($path) = @_;
31    MENTA::Util::require_once('MENTA/Template.pm');
32    my $tmplfname = MENTA::controller_dir() . "/$path";
33    my $src = do {
34        open my $fh, '<:utf8', $tmplfname or die "${tmplfname} を読み込み用に開けません: $!";
35        my $s = do { local $/; join '', <$fh> };
36        close $fh;
37        $s;
38    };
39    my $t = MENTA::Template->new;
40    $t->parse($src);
41    $t->build();
42    my $code = $t->code();
43    $code = << "EOT";
44package MENTA::TemplateLoader::Instance;
45use strict;
46use warnings;
47use utf8;
48$code
49EOT
50;
51    $code;
52}
53
54sub __update_cache {
55    my ($path, $code) = @_;
56    my $cache_path = MENTA::mt_cache_dir;
57    foreach my $p (split '/', $path) {
58        mkdir $cache_path;
59        $cache_path .= "/$p";
60    }
61    $cache_path .= '.c';
62    open my $fh, '>:utf8', $cache_path
63        or die "キャッシュファイルを作れません: $cache_path($!)";
64    print $fh $code;
65    close $fh;
66}
67
68sub __use_cache {
69    my ($path) = @_;
70    return unless MENTA::mt_cache_dir;
71    my @orig = stat $path
72        or return;
73    my @cached = stat MENTA::mt_cache_dir . "/${path}.c"
74        or return;
75    return $orig[9] < $cached[9];
76}
77
78{
79    package MENTA::TemplateLoader::Instance;
80    no strict 'refs';
81    for my $meth (qw/escape_html unescape_html config render param mobile_agent uri_for static_file_path docroot AUTOLOAD redirect current_url/) {
82        *{__PACKAGE__ . '::' . $meth} = *{"MENTA::$meth"};
83    }
84}
85
86"ENDOFMODULE";
87
Note: See TracBrowser for help on using the browser.