• R/O
  • HTTP
  • SSH
  • HTTPS

sandbox: 提交

個人用


Commit MetaInfo

修訂481c132c99e617e0b605b3a8f1ba9c25aed0b41f (tree)
時間2011-12-24 03:02:38
作者takezoe <takezoe@871d...>
Commitertakezoe

Log Message

linkプラグインは1リクエストの処理内ではパース結果をキャッシュして負荷を減らすようにした。

Change Summary

差異

--- a/takezoe/plugin/book/Link.pm
+++ b/takezoe/plugin/book/Link.pm
@@ -20,6 +20,7 @@ package plugin::book::Link;
2020 sub new {
2121 my $class = shift;
2222 my $self = {};
23+ my $self->{cache} = {};
2324 return bless $self,$class;
2425 }
2526
@@ -35,61 +36,62 @@ sub inline {
3536 $page = $wiki->get_CGI->param('page') unless $page;
3637 my $source = $wiki->get_page($page);
3738
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 = '';
4644
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;
6468 $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;
7275 $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++;
7981 $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}++;
8788 $text = $type.$chapter.'-'.$count->{$type}.': '.Util::trim($plugin->{'args'}->[1]);
88- last;
89+ $self->{cache}->{$page}->{$plugin->{'args'}->[2]} = $text;
8990 }
9091 }
9192 }
92- if($text ne ''){
93+ if(defined($self->{cache}->{$page}->{$anchor})){
94+ my $text = $self->{cache}->{$page}->{$anchor};
9395 return '<a href="?page='.Util::url_encode($page).'#'.Util::escapeHTML($anchor).'" class="xref">'.Util::escapeHTML($text).'</a>';
9496 } else {
9597 return '<span class="xref-error">参照先が見つかりません!</span>';
Show on old repository browser