ファイル情報

Rev. 4ba68e3ad501c323b546e9cc524ea0d4f1ca7280
サイズ 11,570 バイト
日時 2019-09-09 13:49:12
作者 kgsoft
ログメッセージ

BugTrack-wiki/353 : 番号付きリスト項目リストの組合せが正しく表示されない

内容

#!/usr/bin/perl
###############################################################################
#
# FreeStyleWiki フロントエンドCGIスクリプト
#
###############################################################################
BEGIN {
	if(exists $ENV{MOD_PERL}){
		# カレントディレクトリの変更
		chdir($ENV{FSWIKI_HOME});
	}
}
# ModPerl::Registry(Prefork)では実行時に変更されている可能性がある
if(exists $ENV{MOD_PERL}){
	chdir($ENV{FSWIKI_HOME});
}

#==============================================================================
# モジュールのインクルード
#==============================================================================
use Cwd;
use lib './lib';
# ModPerl::Registry(Prefork)では@INCが初期化されている場合がある
unshift @INC, './lib' if(exists $ENV{MOD_PERL});
use strict;
#use CGI::Carp qw(fatalsToBrowser);
#use CGI2;
use Wiki;
use Util;
use Jcode;
use HTML::Template;

# これをやらないとApache::Registoryで動かない
if(exists $ENV{MOD_PERL}){
	eval("use Digest::Perl::MD5;");
	eval("use plugin::core::Diff;");
	eval("use plugin::pdf::PDFMaker;");
	&Jcode::load_module("Jcode::Unicode") unless $Jcode::USE_ENCODE;
}

#==============================================================================
# CGIとWikiのインスタンス化
#==============================================================================
my $wiki = Wiki->new('setup.dat');
my $cgi = $wiki->get_CGI();

Util::override_die();
eval {
	# Session用ディレクトリはFarmでも共通に使用する
	$wiki->config('session_dir',$wiki->config('log_dir')) if (!$wiki->config('session_dir'));
	
	#==============================================================================
	# Farmとして動作する場合
	#==============================================================================
	my $path_info  = $cgi->path_info();
	my $path_count = 0;
	if(length($path_info) > 0){
		# Farmがあるか確認する
		unless($path_info =~ m<^(/[A-Za-z0-9]+)*/?$> and -d $wiki->config('data_dir').$path_info){
			CORE::die("Wikiが存在しません。");
		}
		
		# PATH_INFOの最後が/だったら/なしのURLに転送する
		if($path_info =~ m|/$|) {
			$path_info =~ s|/$||;
			$wiki->redirectURL($cgi->url().$path_info);
		}
		$path_info =~ m</([^/]+)$>;
		$wiki->config('script_name', $1);
		$wiki->config('data_dir'   , $wiki->config('data_dir'  ).$path_info);
		$wiki->config('config_dir' , $wiki->config('config_dir').$path_info);
		$wiki->config('backup_dir' , $wiki->config('backup_dir').$path_info);
		$wiki->config('log_dir'    , $wiki->config('log_dir'   ).$path_info);

		if(!($wiki->config('theme_uri') =~ /^(\/|http:|https:|ftp:)/)){
			my @paths = split(/\//,$path_info);
			$path_count = $#paths;
			for(my $i=0;$i<$path_count;$i++){
				$wiki->config('theme_uri','../'.$wiki->config('theme_uri'));
			}
		}
	}

	#==============================================================================
	# 設定を反映(もうちょっとスマートにやりたいね)
	#==============================================================================
	my $config = &Util::load_config_hash($wiki,$wiki->config('config_file'));
	foreach my $key (keys(%$config)){
		$wiki->config($key,$config->{$key});
	}
	# 個別に設定が必要なものだけ上書き
	$wiki->config('css',
		$wiki->config('theme_uri')."/".$config->{theme}."/".$config->{theme}.".css");
	$wiki->config('site_tmpl',
		$wiki->config('tmpl_dir')."/site/".$config->{site_tmpl_theme}."/".$config->{site_tmpl_theme}.".tmpl");
	$wiki->config('site_handyphone_tmpl',
		$wiki->config('tmpl_dir')."/site/".$config->{site_tmpl_theme}."/".$config->{site_tmpl_theme}."_handyphone.tmpl");
	$wiki->config('site_smartphone_tmpl',
		$wiki->config('tmpl_dir')."/site/".$config->{site_tmpl_theme}."/".$config->{site_tmpl_theme}."_smartphone.tmpl");

	#==============================================================================
	# タイムアウトしているセッションを破棄
	#==============================================================================
	$cgi->remove_session($wiki);

	#==============================================================================
	# ユーザ情報の読み込み
	#==============================================================================
	my $users = &Util::load_config_hash($wiki,$wiki->config('userdat_file'));
	foreach my $id (keys(%$users)){
		my ($pass,$type) = split(/\t/,$users->{$id});
		$wiki->add_user($id,$pass,$type);
	}

	#==============================================================================
	# プラグインのインストールと初期化
	#==============================================================================
	my @plugins = split(/\n/,&Util::load_config_text($wiki,$wiki->config('plugin_file')));
	my $plugin_error = '';
	foreach(sort(@plugins)){
		$plugin_error .= $wiki->install_plugin($_);
	}
	# プラグインごとの初期化処理を起動
	$wiki->do_hook("initialize");

	#==============================================================================
	# アクションハンドラの呼び出し
	#==============================================================================
	my $action  = $cgi->param("action");
	my $content = $wiki->call_handler($action);

	# プラグインのインストールに失敗した場合
	$content = $plugin_error . $content if $plugin_error ne '';

	#==============================================================================
	# レスポンス
	#==============================================================================
	my $output        = "";
	my $is_handyphone = &Util::handyphone();
	my $is_smartphone = &Util::smartphone();
	my $template_name = "";

	if ($is_handyphone) {
		$template_name = 'site_handyphone_tmpl';
	} elsif ($is_smartphone) {
		$template_name = 'site_smartphone_tmpl';
	} else {
		$template_name = 'site_tmpl';
	}

	# トップページかどうかを判定
	my $top  = 0;
	if($cgi->param("page") eq $wiki->config("frontpage")){
		$top = 1;
	}

	# ページのタイトルを決定
	my $title = "";
	if($cgi->param('action') eq "" && $wiki->page_exists($cgi->param('page')) && $wiki->is_installed('search')){
		$title = "<a href=\"".$wiki->create_url({action=>"SEARCH",word=>$wiki->get_title()})."\">".
		       &Util::escapeHTML($wiki->get_title())."</a>";
	} else {
		$title = &Util::escapeHTML($wiki->get_title());
	}

	#------------------------------------------------------------------------------
	# ヘッダの生成
	#------------------------------------------------------------------------------
	my $header_tmpl = HTML::Template->new(filename => $wiki->config('tmpl_dir')."/header.tmpl",
	                                      die_on_bad_params => 0,
	                                      case_sensitive    => 1);
	# メニューを取得
	my @menu = ();
	foreach(sort {$b->{weight}<=>$a->{weight}} @{$wiki->{menu}}){
		if($_->{href} ne ""){
			push(@menu,$_);
		}
	}
	$header_tmpl->param(MENU       => \@menu,
	                    FRONT_PAGE => $top);
	my $header = $header_tmpl->output();

	#------------------------------------------------------------------------------
	# フッタの生成
	#------------------------------------------------------------------------------
	my $footer_tmpl = HTML::Template->new(filename => $wiki->config('tmpl_dir')."/footer.tmpl",
	                                      die_on_bad_params => 0,
	                                      case_sensitive    => 1);

	# コピーライトを表示するかどうか
	my $admin_name = $wiki->config('admin_name');
	my $admin_mail = $wiki->config('admin_mail_pub');
	my $out_copyright  = 1;
	if($admin_name eq ""){ $admin_name = $admin_mail; }
	if($admin_name eq "" && $admin_mail eq ""){ $out_copyright = 0; }

	$footer_tmpl->param(ADMIN_NAME    => $admin_name,
	                    ADMIN_MAIL    => $admin_mail,
	                    OUT_COPYRIGHT => $out_copyright,
	                    FRONT_PAGE    => $top,
	                    VERSION       => Wiki->VERSION,
	                    PERL_VERSION  => $]);

	if(exists $ENV{MOD_PERL}){
		$footer_tmpl->param(MOD_PERL=>$ENV{MOD_PERL});
	}

	my $footer = $footer_tmpl->output();

	#------------------------------------------------------------------------------
	# サイトテンプレートの処理
	#------------------------------------------------------------------------------
	# テンプレートの読み込み
	my $template = HTML::Template->new(filename => $wiki->config($template_name),
	                                   die_on_bad_params => 0,
	                                   case_sensitive    => 1);

	# 参照権限があるかどうか
	my $can_show = 0;
	if($action ne '' || ($action eq '' && $wiki->can_show($cgi->param('page')))){
		$can_show = 1;
	}

	# headタグ内に表示する情報を作成
	my $head_info = "";
	foreach (@{$wiki->{'head_info'}}){
		$head_info .= $_."\n";
	}

	# テンプレートにパラメータをセット
	$template->param(SITE_TITLE  => &Util::escapeHTML($wiki->get_title()." - ".$wiki->config('site_title')),
	                 MENU        => $header,
	                 TITLE       => $title,
	                 CONTENT     => $content,
	                 FRONT_PAGE  => $top,
	                 FOOTER      => $footer,
	                 EDIT_MODE   => $action,
	                 CAN_SHOW    => $can_show,
	                 HEAD_INFO   => $head_info,
	                 SITE_NAME   => $wiki->config('site_title'));

	my $login = $wiki->get_login_info();
	$template->param(
		IS_ADMIN => defined($login) && $login->{type}==0,
		IS_LOGIN => defined($login)
	);

	if ($is_handyphone) {
		# 携帯電話用処理
		$output = $template->output;
		&Jcode::convert(\$output,"sjis");
	} else {
		# パソコン用処理
		my $usercss = &Util::load_config_text($wiki,$wiki->config('usercss_file'));
		
		if($config->{'theme'} eq ''){
			# テーマが使用されておらず、外部CSSが指定されている場合はそれを使用
			if($config->{'outer_css'} ne ''){
				$wiki->config('css',$config->{'outer_css'});
			# テーマも外部CSSも指定されていない場合はスタイルシートを使用しない
			} else {
				$wiki->config('css','');
			}
		}
		# パラメータをセット
		$template->param(HAVE_USER_CSS => $usercss ne "",
		                 THEME_CSS     => $wiki->config('css'),
		                 USER_CSS      => &Util::escapeHTML($usercss),
		                 THEME_URI     => $wiki->config('theme_uri'));
		
		# ページ名をEXIST_PAGE_ページ名というパラメータにセット
		# ただし、スラッシュを含むページ名はセットしない
		my @pagelist = $wiki->get_page_list();
		foreach my $page (@pagelist){
			if(index($page,"/")==-1 && $wiki->can_show($page)){
				$template->param("EXIST_PAGE_".$page=>1);
			}
		}
		
		$output = $template->output;
		
		# インクルード命令
		# <!--FSWIKI_INCLUDE PAGE="ページ名"-->
		# ページ名でWikiNameを指定する。
		my $fswiki_include_tag = '<!--\s*FSWIKI_INCLUDE\s+PAGE\s*=\s*"([^"]*)"\s*-->';
		while($output =~ /$fswiki_include_tag/o){
			if($wiki->page_exists($1) && $wiki->can_show($1)){
				$output =~ s/$fswiki_include_tag/$wiki->process_wiki($wiki->get_page($1))/oe;
			} else {
				$output =~ s/$fswiki_include_tag//o;
			}
		}
	}
	
	#------------------------------------------------------------------------------
	# 出力処理
	#------------------------------------------------------------------------------
	# ヘッダの出力
	if($is_handyphone){
		print "Content-Type: text/html;charset=Shift_JIS\n";
	} else {
		print "Content-Type: text/html;charset=EUC-JP\n";
	}
	print "Pragma: no-cache\n";
	print "Cache-Control: no-cache\n\n";
	 
	# HTMLの出力
	print $output;
};

my $msg = $@;
$ENV{'PATH_INFO'} = undef;
$wiki->_process_before_exit();

if($msg && index($msg, 'safe_die')<0){
	$msg = Util::escapeHTML($msg);
	print "Content-Type: text/html\n\n";
	print "<html><head><title>Software Error</title></head>";
	print "<body><h1>Software Error:</h1><p>$msg</p></body></html>";
}
Util::restore_die();
旧リポジトリブラウザで表示