############################################################################### # # ページを編集するプラグイン # ############################################################################### package plugin::core::EditPage; use strict; #============================================================================== # コンストラクタ #============================================================================== sub new { my $class = shift; my $self = {}; return bless $self,$class; } #============================================================================== # アクションの実行 #============================================================================== sub do_action { my $self = shift; my $wiki = shift; my $cgi = $wiki->get_CGI; my $pagename = $cgi->param("page"); my $format = $wiki->get_edit_format(); my $content = $cgi->param("content"); my $sage = $cgi->param("sage"); my $template = $cgi->param("template"); my $artno = $cgi->param("artno"); my $time = $wiki->get_last_modified($pagename); my $buf = ""; my $login = $wiki->get_login_info(); if($pagename eq ""){ return $wiki->error("ページが指定されていません。"); } if($pagename =~ /([\|\[\]])|^:|([^:]:[^:])/){ return $wiki->error("ページ名に使用できない文字が含まれています。"); } if(!$wiki->can_modify_page($pagename)){ return $wiki->error("ページの編集は許可されていません。"); } #-------------------------------------------------------------------------- # 保存処理 if($cgi->param("save") ne ""){ if($wiki->page_exists($pagename)){ if($cgi->param("lastmodified") != $time){ return $wiki->error("ページは既に別のユーザによって更新されています。"); } } #my $save_content = $content; my $mode = $wiki->get_edit_format(); my $save_content = $wiki->convert_to_fswiki($content,$mode); # パート編集の場合 if($artno ne ""){ $save_content = &make_save_source($wiki->get_page($pagename),$save_content,$artno,$wiki); } # FrontPageは削除不可 if($pagename eq $wiki->config("frontpage") && $save_content eq ""){ $buf = "<b>".&Util::escapeHTML($wiki->config("frontpage"))."は削除することはできません。</b>\n"; # それ以外の場合は処理を実行してメッセージを返却 } else { $wiki->save_page($pagename,$save_content,$sage); if($content ne ""){ $wiki->redirect($pagename); } else { if($artno eq ""){ $wiki->set_title($pagename."を削除しました"); return Util::escapeHTML($pagename)."を削除しました。"; } else { $wiki->set_title($pagename."のパートを削除しました"); return Util::escapeHTML($pagename)."のパートを削除しました。"; } } } #-------------------------------------------------------------------------- # プレビュー処理 } elsif($cgi->param("preview") ne ""){ $time = $cgi->param("lastmodified"); $buf = "以下のプレビューを確認してよろしければ「保存」ボタンを押してください。<br>"; if($content eq ""){ if($pagename eq $wiki->config("frontpage") && $artno eq ""){ $buf = $buf."<b>(".&Util::escapeHTML($wiki->config("frontpage"))."は削除することはできません。)</b>"; } else { if($artno eq ""){ $buf = $buf."<b>(ページ内容は空です。更新するとこのページは削除されます。)</b>"; } else { $buf = $buf."<b>(ページ内容は空です。更新するとこのパートは削除されます。)</b>"; } } } $content = $wiki->convert_to_fswiki($content,$format); $buf = $buf."<br>".$wiki->process_wiki($content); } elsif($wiki->page_exists($pagename)) { #ページが存在する場合 if($artno eq ""){ $content = $wiki->get_page($pagename); } else { $content = &read_by_part($wiki->get_page($pagename),$artno); } } elsif($template ne ""){ #テンプレートを指定された場合 $content = $wiki->get_page($template); } #-------------------------------------------------------------------------- # 入力フォーム $wiki->set_title($pagename."の編集",1); my $tmpl = HTML::Template->new(filename=>$wiki->config('tmpl_dir')."/editform.tmpl", die_on_bad_params => 0); $tmpl->param({SCRIPT_NAME => $wiki->create_url(), PAGE_NAME => $pagename, CONTENT => $wiki->convert_from_fswiki($content,$format), LAST_MODIFIED => $time, ACTION => 'EDIT', EXISTS_PAGE => $wiki->page_exists($pagename), SAGE => $sage}); if($artno ne ""){ $tmpl->param(OPTIONAL_PARAMS=>[{NAME=>'artno',VALUE=>$artno}]); } $buf .= $tmpl->output(); # プラグインを挿入 $buf .= $wiki->get_editform_plugin(); return $buf; } #============================================================================== # パート編集の場合の編集部分の取り出し #============================================================================== sub read_by_part { my $page = shift; my $num = shift; my $count = 0; my $buf = ""; my $level = 0; my $flag = 0; foreach my $line (split(/\n/,$page)){ if($line=~/^(!{1,3})/){ if($flag==1 && $level<=length($1)){ last; } if($count==$num){ $flag = 1; $level = length($1); } $count++; } if($flag==1){ $buf .= $line."\n"; } } return $buf; } #============================================================================== # パート編集の場合の保存用ソースの作成 #============================================================================== sub make_save_source { my $org = shift; my $edit = shift; my $num = shift; my $wiki = shift; my $count = 0; my $buf = ""; my $level = ""; my $flag = ""; foreach my $line (split(/\n/,$org)){ if($line=~/^(!{1,3})/){ if($flag==1 && $level<=length($1)){ $flag = 0; } if($count==$num){ $flag = 1; $level = length($1); $buf .= $edit; # 最後が改行でない場合だけ改行を追加(次のセクションとくっついてしまうため) $buf .= "\n" unless($edit =~ /\n$/); } $count++; } if($flag==0){ $buf .= "$line\n"; } } return $buf; } #============================================================================== # ページ表示時のフックメソッド # 「編集」メニューを有効にします #============================================================================== sub hook { my $self = shift; my $wiki = shift; my $cgi = $wiki->get_CGI; my $pagename = $cgi->param("page"); my $login = $wiki->get_login_info(); # 編集メニューの制御 if($wiki->can_modify_page($pagename)){ $wiki->add_menu("編集",$wiki->create_url({ action=>"EDIT",page=>$pagename })); } } 1;