修訂 | 481c132c99e617e0b605b3a8f1ba9c25aed0b41f (tree) |
---|---|
時間 | 2011-12-24 03:02:38 |
作者 | takezoe <takezoe@871d...> |
Commiter | takezoe |
linkプラグインは1リクエストの処理内ではパース結果をキャッシュして負荷を減らすようにした。
@@ -20,6 +20,7 @@ package plugin::book::Link; | ||
20 | 20 | sub new { |
21 | 21 | my $class = shift; |
22 | 22 | my $self = {}; |
23 | + my $self->{cache} = {}; | |
23 | 24 | return bless $self,$class; |
24 | 25 | } |
25 | 26 |
@@ -35,61 +36,62 @@ sub inline { | ||
35 | 36 | $page = $wiki->get_CGI->param('page') unless $page; |
36 | 37 | my $source = $wiki->get_page($page); |
37 | 38 | |
38 | - my $text = ''; | |
39 | - | |
40 | - my @lines = split(/\n/,$wiki->get_page($page)); | |
41 | - my $chapter = ''; | |
42 | - my $count = {}; | |
43 | - my $title1Count = 0; | |
44 | - my $title2Count = 0; | |
45 | - my $title3Count = 0; | |
39 | + unless(defined($self->{cache}->{$page})){ | |
40 | + $self->{cache}->{$page} = {}; | |
41 | + my $source = $wiki->get_page($page); | |
42 | + | |
43 | + my $text = ''; | |
46 | 44 | |
47 | - # TODO {{pre}}プラグイン内の記述は飛ばさないとダメ!!パーサを作らないとダメっぽい? | |
48 | - foreach my $line (@lines){ | |
49 | - if($line =~ /^{{(chapter.+}})$/){ | |
50 | - my $plugin = $wiki->parse_inline_plugin($1); | |
51 | - $chapter = $plugin->{'args'}->[0]; | |
52 | - $title1Count = 0; | |
53 | - $title2Count = 0; | |
54 | - $title3Count = 0; | |
55 | - foreach my $key (keys(%$count)){ | |
56 | - $count->{$key} = 0; | |
57 | - } | |
58 | - } elsif($line =~ /^!!!{{(title1.+}})(.+)$/){ | |
59 | - my $plugin = $wiki->parse_inline_plugin($1); | |
60 | - $title1Count++; | |
61 | - $title2Count = 0; | |
62 | - $title3Count = 0; | |
63 | - if($plugin->{'args'}->[0] eq $anchor){ | |
45 | + my @lines = split(/\n/,$wiki->get_page($page)); | |
46 | + my $chapter = ''; | |
47 | + my $count = {}; | |
48 | + my $title1Count = 0; | |
49 | + my $title2Count = 0; | |
50 | + my $title3Count = 0; | |
51 | + | |
52 | + # TODO {{pre}}プラグイン内の記述は飛ばさないとダメ!!パーサを作らないとダメっぽい? | |
53 | + foreach my $line (@lines){ | |
54 | + if($line =~ /^{{(chapter.+}})$/){ | |
55 | + my $plugin = $wiki->parse_inline_plugin($1); | |
56 | + $chapter = $plugin->{'args'}->[0]; | |
57 | + $title1Count = 0; | |
58 | + $title2Count = 0; | |
59 | + $title3Count = 0; | |
60 | + foreach my $key (keys(%$count)){ | |
61 | + $count->{$key} = 0; | |
62 | + } | |
63 | + } elsif($line =~ /^!!!{{(title1.+}})(.+)$/){ | |
64 | + my $plugin = $wiki->parse_inline_plugin($1); | |
65 | + $title1Count++; | |
66 | + $title2Count = 0; | |
67 | + $title3Count = 0; | |
64 | 68 | $text= $chapter.'-'.$title1Count.'. '.Util::trim($2); |
65 | - last; | |
66 | - } | |
67 | - } elsif($line =~ /^!!{{(title2.+}})$/){ | |
68 | - my $plugin = $wiki->parse_inline_plugin($1); | |
69 | - $title2Count++; | |
70 | - $title3Count = 0; | |
71 | - if($plugin->{'args'}->[0] eq $anchor){ | |
69 | + $self->{cache}->{$page}->{$plugin->{'args'}->[0]} = $text; | |
70 | + | |
71 | + } elsif($line =~ /^!!{{(title2.+}})$/){ | |
72 | + my $plugin = $wiki->parse_inline_plugin($1); | |
73 | + $title2Count++; | |
74 | + $title3Count = 0; | |
72 | 75 | $text= $chapter.'-'.$title1Count.'-'.$title2Count.'. '.Util::trim($2); |
73 | - last; | |
74 | - } | |
75 | - } elsif($line =~ /^!{{(title3.+}})$/){ | |
76 | - my $plugin = $wiki->parse_inline_plugin($1); | |
77 | - $title3Count++; | |
78 | - if($plugin->{'args'}->[0] eq $anchor){ | |
76 | + $self->{cache}->{$page}->{$plugin->{'args'}->[0]} = $text; | |
77 | + | |
78 | + } elsif($line =~ /^!{{(title3.+}})$/){ | |
79 | + my $plugin = $wiki->parse_inline_plugin($1); | |
80 | + $title3Count++; | |
79 | 81 | $text= $chapter.'-'.$title1Count.'-'.$title2Count.'-'.$title3Count.'. '.Util::trim($2); |
80 | - last; | |
81 | - } | |
82 | - } elsif($line =~ /^{{(caption.+}})$/){ | |
83 | - my $plugin = $wiki->parse_inline_plugin($1); | |
84 | - my $type = $plugin->{'args'}->[0]; | |
85 | - $count->{$type}++; | |
86 | - if($plugin->{'args'}->[2] eq $anchor){ | |
82 | + $self->{cache}->{$page}->{$plugin->{'args'}->[0]} = $text; | |
83 | + | |
84 | + } elsif($line =~ /^{{(caption.+}})$/){ | |
85 | + my $plugin = $wiki->parse_inline_plugin($1); | |
86 | + my $type = $plugin->{'args'}->[0]; | |
87 | + $count->{$type}++; | |
87 | 88 | $text = $type.$chapter.'-'.$count->{$type}.': '.Util::trim($plugin->{'args'}->[1]); |
88 | - last; | |
89 | + $self->{cache}->{$page}->{$plugin->{'args'}->[2]} = $text; | |
89 | 90 | } |
90 | 91 | } |
91 | 92 | } |
92 | - if($text ne ''){ | |
93 | + if(defined($self->{cache}->{$page}->{$anchor})){ | |
94 | + my $text = $self->{cache}->{$page}->{$anchor}; | |
93 | 95 | return '<a href="?page='.Util::url_encode($page).'#'.Util::escapeHTML($anchor).'" class="xref">'.Util::escapeHTML($text).'</a>'; |
94 | 96 | } else { |
95 | 97 | return '<span class="xref-error">参照先が見つかりません!</span>'; |