############################################################################### # # キャッシュ作成用HTMLパーサ # ############################################################################### package Wiki::CacheParser; use Wiki::HTMLParser; use vars qw(@ISA); @ISA = qw(Wiki::HTMLParser); #============================================================================== #

# コンストラクタ #

#============================================================================== sub new { my $class = shift; my $wiki = shift; my $self = Wiki::HTMLParser->new($wiki,0); return bless $self,$class; } #============================================================================== #

# ヘッドライン #

#============================================================================== sub l_headline { my $self = shift; my $level = shift; my $obj = shift; my $wiki = $self->{wiki}; if($self->{para}==1){ $self->{html} .= "

"; $self->{para} = 0; } $self->end_list; $self->end_verbatim; $self->end_table; $self->end_quote; my $html = join("",@$obj); $self->{html} .= "".$html."\n"; $self->{p_cnt}++; } #============================================================================== #

# プラグイン #

#============================================================================== sub plugin { my $self = shift; my $plugin = shift; my $html = "\n\n"; foreach my $arg (@{$plugin->{args}}){ $html .= " \n"; } $html .= "\n"; return ($html); } #============================================================================== #

# パラグラフプラグイン #

#============================================================================== sub l_plugin { my $self = shift; my $plugin = shift; if($self->{para}==1){ $self->{html} .= "

"; $self->{para} = 0; } $self->end_list; $self->end_verbatim; $self->end_table; $self->end_quote; my $html = "\n\n"; foreach my $arg (@{$plugin->{args}}){ $html .= " \n"; } $html .= "\n"; if(defined($html) && $html ne ""){ $self->{html} .= $html; } } #============================================================================== #

# キャッシュの動的部分を処理します。 # 他のモジュールから使用するため、メソッドではなく関数として実装しています。 # 以下のようにして使用します。 #

#
# my $cache = Wiki::CacheParserで作成した形式のHTMLキャッシュ文字列;
# my $main  = メイン領域の場合1、サイドバーやヘッダ、フッタ領域の場合は0;
# my $html  = &Wiki::CacheParser::process_cache($wiki,$cache,$main);
# 
#============================================================================== sub process_cache { my $wiki = shift; my $html = shift; my $main = shift; my $count = 0; my $parser = Wiki::HTMLParser->new($wiki,$main); $html =~ s/\r//g; my @lines = split(/\n/,$html); $parser->{html} = ""; for($count=0;$count<=$#lines;$count++){ my $line = $lines[$count]; # 見出しの処理 if($line =~ //){ if($main){ $line =~ s///; $parser->{p_cnt} = $1 + 1; $line =~ s//<\/a>/; } $parser->{html} .= $line; # インラインプラグインの処理 } elsif($line =~ //){ my $plugin = {command=>$1,args=>[]}; while(!($lines[$count] =~ //)){ if($lines[$count] =~ //){ push(@{$plugin->{args}},$1); } $count++; } my @plugin_result = $wiki->process_plugin($plugin,$parser); $parser->{html} .= join("",@plugin_result); # パラグラフプラグインの処理 } elsif($line =~ //){ my $plugin = {command=>$1,args=>[]}; while(!($lines[$count] =~ //)){ if($lines[$count] =~ //){ push(@{$plugin->{args}},$1); } $count++; } my $plugin_result = $wiki->process_plugin($plugin,$parser); if(defined($plugin_result) && $plugin_result ne ""){ $parser->{html} .= $plugin_result; } } else { $parser->{html} .= $line."\n"; } } return $parser->{html}; } 1;