###############################################################################
#
# <p>指定したページ、もしくは指定ページの指定パラグラフをインクルードします。</p>
# <p>
#   ページ全体をインクルードする場合は引数にページ名を指定します。
# </p>
# <pre>
# {{include ページ名}}
# </pre>
# <p>
#   指定ページの特定のパラグラフをインクルードする場合は
#   ページ名に続けて第2引数にパラグラフ名を指定します。
# </p>
# <pre>
# {{include ページ名,パラグラフ名}}
# </pre>
#
###############################################################################
package plugin::core::Include;
use strict;
#==============================================================================
# コンストラクタ
#==============================================================================
sub new {
	my $class = shift;
	my $self = {};
	return bless $self,$class;
}

#==============================================================================
# パラグラフ関数
#==============================================================================
sub paragraph {
	my $self   = shift;
	my $wiki   = shift;
	my $page   = shift;
	my $para   = shift;
	my $cgi    = $wiki->get_CGI;
	
	# エラーチェック
	if($self->{count}++ > 50){
		return &Util::paragraph_error("includeプラグインが多すぎます。","WIKI");
	}
	if($page eq ""){
		return &Util::paragraph_error("ページが指定されていません。","WIKI");
	}
	if(!$wiki->page_exists($page)){
		return &Util::paragraph_error("ページが存在しません。","WIKI");
	}
	if(!$wiki->can_show($page)){
		return &Util::paragraph_error("ページの参照権限がありません。","WIKI");
	}
	if($page eq $cgi->param("page")){
		return &Util::paragraph_error("同一のページはincludeできません。","WIKI");
	}
	foreach my $incpage (@{$self->{stack}}){
		if($incpage eq $page){
			return &Util::paragraph_error("同一のページはincludeできません。","WIKI");
		}
	}
	
	# ソースを取得
	my $source = $wiki->get_page($page);
	
	# パラグラフが指定されていた場合はパラグラフを切り出す
	$para = quotemeta(Util::trim($para));
	if($para ne ""){
		if($source =~ /(\n|^)!!!\s*$para\s*(\n!!!|$)/){
			return &Util::paragraph_error("パラグラフの本文が存在しません。","WIKI");
		} elsif($source =~ /(\n|^)!!!\s*$para\s*\n((.|\s|\r|\n)*?)\s*(\n!!!|$)/){
			$source = $2;
		} elsif($source =~ /(\n|^)!!\s*$para\s*(\n!!|$)/){
			return &Util::paragraph_error("パラグラフの本文が存在しません。","WIKI");
		} elsif($source =~ /(\n|^)!!\s*$para\s*\n((.|\s|\r|\n)*?)\s*(\n!!|$)/){
			$source = $2;
		} elsif($source =~ /(\n|^)!\s*$para\s*(\n!|$)/){
			return &Util::paragraph_error("パラグラフの本文が存在しません。","WIKI");
		} elsif($source =~ /(\n|^)!\s*$para\s*\n((.|\s|\r|\n)*?)\s*(\n!|$)/){
			$source = $2;
		} else {
			return &Util::paragraph_error("ページが存在しません。","WIKI");
		}
	}
	
	# スタックにつむ(無限ループ防止用)
	push(@{$self->{stack}},$page);
	
	# ちょっと裏技
	my $pagetmp = $cgi->param("page");
	$cgi->param("page",$page);
	$wiki->get_current_parser()->parse($source);
	$cgi->param("page",$pagetmp);
	
	# スタックから削除
	pop(@{$self->{stack}});
	
	return undef;
}

1;