root/lang/perl/chalow/branches/perlnews/lib/App/Chalow/Template.pm @ 12535

Revision 12535, 10.4 kB (checked in by yappo, 6 years ago)

permalink も tt化

Line 
1package App::Chalow::Template;
2use strict;
3use warnings;
4
5use Template;
6
7# 超適当
8use FindBin;
9my $assets_dir = $FindBin::Bin . 'assets';
10my $template = Template->new({ INCLUDE_PATH => "$assets_dir/template" });
11
12### インデックスページ(index.html)を作る
13sub index {
14    my($class, $cl, $opt_topn, $month_page, $changelog_name, $changelog_description, $css_file, $what_time_is_it_now, $signature, $month_page_list, $latest_item_list, $category_list, $rss_filename, $outputdir, $replace_once, $update_by_size, $utf8_mode, $quiet_mode,
15     $calendar_style,
16     $index_page_template
17    ) = @_;
18
19#index_page_template
20
21    ### 最近の何日かだけインデックスページに載せるための処理
22    my @recent = (reverse sort keys %{$cl->{all}})[0..$opt_topn];
23
24    my @top_n_entries;
25
26    for (my $i = 0; $i < $opt_topn and $recent[$i]; $i++) {
27        my $ymd = $recent[$i];
28        my ($ym, $d) = ($ymd =~ /^(\d{4}-\d\d)-(\d\d)$/);
29#       $top_n_str .= $month_page->{$ym}{$ymd}{str};
30        push @top_n_entries, {content => $month_page->{$ym}{$ymd}{str}};
31    }
32    my ($ymd, $ym, $d) = ($recent[0] =~ /^((\d{4}-\d\d)-(\d\d))$/);
33
34    # 日付リンク一覧
35    my $day_list = make_day_list_str($ym, $calendar_style, $cl);
36
37    ### ページの組み上げ
38    my $ostr;
39    $template->process('index.tt', {
40        cl_name               => $changelog_name,
41        changelog_description => $changelog_description,
42        css_file              => $css_file,
43        lastupdate            => $what_time_is_it_now,
44        signature             => $signature,
45        ymd                   => $ymd,
46        ym                    => $ym,
47        ndays                 => $opt_topn,
48        day_list              => $day_list,
49        month_page_list       => $month_page_list,
50        latest_item_list      => $latest_item_list,
51        category_list         => $category_list,
52        rss_file              => $rss_filename,
53        entries               => \@top_n_entries,
54    }, \$ostr);
55
56=pod
57
58    my $t = HTML::Template->new(scalarref => \$index_page_template,
59                                loop_context_vars => 1,
60                                die_on_bad_params => 0);
61    $t->param(cl_name => $changelog_name);
62    $t->param(changelog_description => $changelog_description);
63    $t->param(css_file => $css_file);
64    $t->param(lastupdate => $what_time_is_it_now);
65    $t->param(signature => $signature);
66
67    $t->param(ymd => $ymd);     # 最新エントリの日付
68    $t->param(ym => $ym);       # 最新エントリの月
69    $t->param(ndays => $opt_topn);
70    $t->param(day_list => $day_list);
71    $t->param(month_page_list => $month_page_list);
72    $t->param(latest_item_list => $latest_item_list);
73    $t->param(category_list => $category_list);
74    $t->param(rss_file => $rss_filename); # 050821
75    $t->param(entries => \@top_n_entries);
76
77    my $ostr = $t->output();
78
79=cut
80
81    $ostr ||= '';
82    output_to_file("$outputdir/index.html", \$ostr,
83        $replace_once,
84        $update_by_size,
85        $utf8_mode,
86        $quiet_mode,
87    );
88}
89
90
91sub item {
92    my($class, $cl, $opt_topn, $month_page, $changelog_name, $changelog_description, $css_file, $what_time_is_it_now, $signature, $month_page_list, $latest_item_list, $category_list, $rss_filename, $outputdir, $replace_once, $update_by_size, $utf8_mode, $quiet_mode,
93     $clog_url,
94     $calendar_style,
95     $output_cat_pages,
96     $cat_page_cgi,
97     $inside_ref,
98     $page_mode, $day_page_mode,
99     $item_page_template
100    ) = @_;
101
102    my @day_list = reverse sort keys %{$cl->{all}};
103
104    for (my $idx = 0; $idx < @day_list; $idx++) {
105        my ($ymd, $ym) = ($day_list[$idx] =~ /^((\d+-\d+)-\d+)/);
106        my $ent = $cl->{all}->{$ymd};
107
108        for (my $i = $ent->{curid}; $i >= 1; $i--) {
109            my $item = $ent->{$i};
110            my $ymdi = "$ymd-$i";
111
112            ### カテゴリ
113            my $catstr = make_cat_link_html($ent->{$i}{cat}, $output_cat_pages, $cat_page_cgi);
114
115            ### 日付リンクによるリファラー
116            my @inside_refs = get_inside_ref("$ymdi", $inside_ref);
117
118            ### item の基礎情報
119            my $item_url = datestr2url("$ymdi", $page_mode, $day_page_mode);
120            my $item_ymdi = $ymdi;
121            my $item_id = $ymdi; $item_id =~ s/-//g; # Ex. "200309241"
122
123            # 前後のページ
124            my $ymdi_before;
125            my $ymdi_after;
126            if ($i > 1) {
127                $ymdi_before = $ymd."-".($i-1);
128            } elsif ($idx < @day_list - 1) {
129                my $day_b = $day_list[$idx + 1];
130                $ymdi_before = $day_b."-".$cl->{all}->{$day_b}{curid};
131            }
132            if ($i != $ent->{curid}) {
133                $ymdi_after = $ymd."-".($i+1);
134            } elsif ($idx > 0) {
135                my $day_a = $day_list[$idx - 1];
136                $ymdi_after = $day_a."-1";
137            }
138
139            ### ページの組み上げ
140            my $ccc = $item->{c}; $ccc =~ s!^<br>!!g;# ad hoc
141            my $ostr;
142            $template->process('item.tt', {
143                cl_name               => $changelog_name,
144                changelog_description => $changelog_description,
145                css_file              => $css_file,
146                lastupdate            => $what_time_is_it_now,
147                signature             => $signature,
148                ymd                   => $ymd,
149                ym                    => $ym,
150
151                month_page_list       => $month_page_list,
152                latest_item_list      => $latest_item_list,
153                category_list         => $category_list,
154
155                back => $ymdi_before,
156                next => $ymdi_after,
157
158                content     => $ccc,
159                header_text => $item->{ho},
160                header      => $item->{h},
161                cat         => $catstr,
162                author      => $item->{a},
163                referrer    => join(" ", @inside_refs),
164                id          => $item_id,
165                ymdi        => $item_ymdi,
166                url         => $item_url,
167                rss_file    => $rss_filename,
168                title       => $ent->{$i}->{ho},
169                clog_url    => $clog_url,
170            }, \$ostr);
171
172
173=pod
174
175            my $t = HTML::Template->new(scalarref => \$item_page_template,
176                                        loop_context_vars => 1,
177                                        die_on_bad_params => 0);
178
179            $t->param(cl_name => $changelog_name);
180            $t->param(changelog_description => $changelog_description);
181            $t->param(css_file => $css_file);
182            $t->param(lastupdate => $what_time_is_it_now);
183            $t->param(signature => $signature);
184
185            $t->param(ymd => $ymd);
186            $t->param(ym => $ym);
187
188            $t->param(month_page_list => $month_page_list);
189            $t->param(latest_item_list => $latest_item_list);
190            $t->param(category_list => $category_list);
191            $t->param(back => $ymdi_before);
192            $t->param(next => $ymdi_after);
193
194            my $ccc = $item->{c}; $ccc =~ s!^<br>!!g;# ad hoc
195            $t->param(content => $ccc);
196            $t->param(header_text => $item->{ho});
197            $t->param(header => $item->{h});
198            $t->param(cat => $catstr);
199            $t->param(author => $item->{a});
200            $t->param(referrer => join(" ", @inside_refs));
201            $t->param(id => $item_id); # 200101011
202            $t->param(ymdi => $item_ymdi); # 2001-01-01-1
203            $t->param(url => $item_url); # 2001-01-01-1.html
204            $t->param(rss_file => $rss_filename); # 050821
205            $t->param(title => $ent->{$i}->{ho});
206            $t->param(clog_url => $clog_url);
207           
208            my $ostr = $t->output();
209
210=cut
211
212            ### ファイルに出力
213warn $ostr;
214            $ostr ||= '';
215            output_to_file("$outputdir/$ymdi.html", \$ostr,
216                $replace_once,
217                $update_by_size,
218                $utf8_mode,
219                $quiet_mode,
220            );
221        }
222    }
223}
224
225
226### 日付リンク一覧を作成 - 文字列を返す
227sub make_day_list_str {
228    my ($ym, $calendar_style, $cl) = @_;
229    if ($calendar_style == 1) {
230        return make_calendar_table($ym, make_day_list($ym, $cl));
231    } else {
232        return join(" ", @{make_day_list($ym)});
233    }
234}
235
236# 日付リンク一覧を作成 - リストへのポインタを返す
237my %daylist;
238sub make_day_list {     
239    my ($ym, $cl) = @_;
240    my $lday = get_last_day_of_month($ym);
241    return $daylist{$ym} if (defined $daylist{$ym}); # cache
242    for (my $d = 1; $d <= $lday; $d++) {
243        my $day = ($d < 10) ? "0".$d : $d;
244        if (defined $cl->{all}->{$ym."-".$day}) {
245            my $day_url = datestr2url($ym."-".$day);
246            push @{$daylist{$ym}}, qq(<a href="$day_url">$day</a>);
247        } else {
248            push @{$daylist{$ym}}, $day;
249        }
250    }
251    return $daylist{$ym};
252}
253
254### 年月を入力としその月の最終日を出力する関数 since 030105
255# EXAMPLES
256#     get_last_day_of_month(12, 2002), get_last_day_of_month("2002-12")
257sub get_last_day_of_month {
258    my ($m, $y) = @_;
259    ($y, $m) = split("-", $m) unless (defined $y);
260    return (31, ((($y % 4 == 0) and ($y % 100)) or ($y % 400 == 0)) ? 29 : 28,
261            31, 30, 31, 30, 31, 31, 30, 31, 30, 31)[$m - 1];
262}
263
264
265### 指定されたファイルへ文字列を出力
266sub output_to_file {
267    my ($fname, $contp,
268        $replace_once,
269        $update_by_size,
270        $utf8_mode,
271        $quiet_mode,
272    ) = @_;
273    $$contp =~ s/<!-- ReplaceOnce -->/$replace_once/;
274
275    if (($update_by_size || 0 == 1) && -s $fname == length($$contp)) {
276        return;
277    }
278
279    if ($utf8_mode) {           # ad hoc 050821
280        $$contp =~ s/;charset=EUC-JP">/;charset=UTF-8">/;
281    }
282
283    print "output to \"$fname\"\n" if (!defined $quiet_mode);
284    open(F, "> $fname") || die "$fname: $!\n";
285    binmode(F);
286    print F $$contp;
287    close(F);
288}
289
290### make category link(anchor) string for item header
291sub make_cat_link_html {
292    my ($catp, $output_cat_pages, $cat_page_cgi) = @_;
293    my $catstr;
294    if (defined $catp) {
295        if ($output_cat_pages) {
296            $catstr =
297                join("", map
298                     {"[<a href=\"".get_category_filename($_)."\">$_</a>]"}
299                     @$catp);
300        } elsif ($cat_page_cgi eq "") {
301            $catstr = join("", map {"[".$_."]"} @$catp);
302        } else {
303            $catstr =
304                join("", map
305                     {my $tmp = $cat_page_cgi;
306                      $tmp =~ s/%%CAT%%/urlencode($_)/ge;
307                      "[<a href=\"$tmp\">$_</a>]"}
308                     @$catp);
309        }
310       
311    }
312    return $catstr;
313}   
314
315### inside referrer のリンク作成
316sub get_inside_ref {
317    my ($id, $inside_ref) = @_;
318    if (defined $inside_ref->{"$id"}) {
319        return map {datestr2anchor("[".$_."]")}
320        (sort {$b cmp $a} keys %{$inside_ref->{"$id"}});
321    }
322    return ();
323}
324
325sub datestr2url {
326    my ($d, $page_mode, $day_page_mode) = @_;
327    if ($page_mode == 2) {      # アイテムモード
328        $d =~ s!(\d{4}-\d\d-\d\d(-\d+)?)!$1.html!;
329    } elsif ($day_page_mode or $page_mode ==1) { # 日モード
330        unless ($d =~ s!((\d{4}-\d\d-\d\d)-\d+)!$2.html\#$1!) {
331            $d =~ s!(\d{4}-\d\d-\d\d)!$1.html!;
332        }
333    } else {                    # 月モード
334        $d =~ s!((\d{4}-\d\d)-\d\d(-\d+)?)!$2.html#$1!;
335    }
336    return $d;
337}
338
3391;
Note: See TracBrowser for help on using the browser.