-################################################################################\r
-# <p>\r
-# FSWikiÁ´ÂΤǻÈÍѤµ¤ì¤ë¥æ¡¼¥Æ¥£¥ê¥Æ¥£´Ø¿ô·²¤òÄ󶡤¹¤ë¥â¥¸¥å¡¼¥ë¤Ç¤¹¡£\r
-# </p>\r
-################################################################################\r
-package Util;\r
-use strict;\r
-\r
-#===============================================================================\r
-# <p>\r
-# die¤Èexit¤Î¥ª¡¼¥Ð¥é¥¤¥ÉÁàºî¤ò¹Ô¤¤¤Þ¤¹¡£\r
-# </p>\r
-#===============================================================================\r
-sub override_die{\r
- our @original_exit_handler;\r
- @original_exit_handler or @original_exit_handler = (\&CORE::GLOBAL::die,\&CORE::GLOBAL::exit);\r
- *CORE::GLOBAL::die = \&Util::_die;\r
- *CORE::GLOBAL::exit = \&Util::_exit;\r
-}\r
-\r
-BEGIN {\r
- require Util;\r
-# *CORE::GLOBAL::die = \&Util::_die;\r
-# *CORE::GLOBAL::exit = \&Util::_exit;\r
- exists($ENV{MOD_PERL}) or override_die();\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# °ú¿ô¤ÇÅϤµ¤ì¤¿Ê¸»úÎó¤òURL¥¨¥ó¥³¡¼¥É¤·¤ÆÊÖ¤·¤Þ¤¹¡£\r
-# </p>\r
-# <pre>\r
-# $str = Util::url_encode($str)\r
-# </pre>\r
-#===============================================================================\r
-sub url_encode {\r
- my $retstr = shift;\r
- $retstr =~ s/([^ 0-9A-Za-z])/sprintf("%%%.2X", ord($1))/eg;\r
- $retstr =~ tr/ /+/;\r
- return $retstr;\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# °ú¿ô¤ÇÅϤµ¤ì¤¿Ê¸»úÎó¤òURL¥Ç¥³¡¼¥É¤·¤ÆÊÖ¤·¤Þ¤¹¡£\r
-# </p>\r
-# <pre>\r
-# $str = Util::url_decode($str);\r
-# </pre>\r
-#===============================================================================\r
-sub url_decode{\r
- my $retstr = shift;\r
- $retstr =~ tr/+/ /;\r
- $retstr =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge;\r
- return $retstr;\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# Cookie¤Îpath¤Ë»ØÄꤹ¤ëʸ»úÎó¤ò¼èÆÀ¤·¤Þ¤¹¡£\r
-# </p>\r
-# <pre>\r
-# $path = Util::cookie_path($wiki);\r
-# </pre>\r
-#===============================================================================\r
-sub cookie_path {\r
- my $wiki = shift;\r
- my $script_name = quotemeta($wiki->config('script_name'));\r
- my $path = $ENV{'REQUEST_URI'};\r
- $path =~ s/\?.*//;\r
- $path =~ s/$script_name$//;\r
- return $path;\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# ¥Ç¥£¥ì¥¯¥È¥ê¡¢¥Õ¥¡¥¤¥ë̾¡¢³ÈÄ¥»Ò¤ò·ë¹ç¤·¤Æ¥Õ¥¡¥¤¥ë̾¤òÀ¸À®¤·¤Þ¤¹¡£\r
-# </p>\r
-# <pre>\r
-# my $filename = Util::make_filename(¥Ç¥£¥ì¥¯¥È¥ê̾,¥Õ¥¡¥¤¥ë̾,³ÈÄ¥»Ò);\r
-# </pre>\r
-#===============================================================================\r
-sub make_filename {\r
- my $dir = shift;\r
- my $file = shift;\r
- my $ext = shift;\r
- \r
- return $dir."/".$file.".".$ext;\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# °ú¿ô¤ÇÅϤµ¤ì¤¿Ê¸»úÎó¤ÎHTML¥¿¥°¤ò¥¨¥¹¥±¡¼¥×¤·¤ÆÊÖ¤·¤Þ¤¹¡£\r
-# </p>\r
-# <pre>\r
-# $str = Util::escapeHTML($str);\r
-# </pre>\r
-#===============================================================================\r
-sub escapeHTML {\r
- my($retstr) = shift;\r
- my %table = (\r
- '&' => '&',\r
- '"' => '"',\r
- '<' => '<',\r
- '>' => '>',\r
- );\r
- $retstr =~ s/([&\"<>])/$table{$1}/go;\r
- $retstr =~ s/&#([0-9]{1,5});/&#$1;/go;\r
- $retstr =~ s/&#(0*(0|9|10|13|38|60|62));/&#$1;/g;\r
-# $retstr =~ s/&([a-zA-Z0-9]{2,8});/&$1;/go;\r
- return $retstr;\r
-}\r
-\r
-\r
-#===============================================================================\r
-# <p>\r
-# ÆüÉÕ¤ò"yyyyǯmm·îddÆü hh»þmiʬssÉÃ"·Á¼°¤Ë¥Õ¥©¡¼¥Þ¥Ã¥È¤·¤Þ¤¹¡£\r
-# </p>\r
-# <pre>\r
-# my $date = Util::format_date(time());\r
-# </pre>\r
-#===============================================================================\r
-sub format_date {\r
- my $t = shift;\r
- my ($sec, $min, $hour, $mday, $mon, $year) = localtime($t);\r
- return sprintf("%04dǯ%02d·î%02dÆü %02d»þ%02dʬ%02dÉÃ",\r
- $year+1900,$mon+1,$mday,$hour,$min,$sec);\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# ʸ»úÎó¤Îξü¤Î¶õÇò¤òÀÚ¤êÍî¤È¤·¤Þ¤¹¡£\r
-# </p>\r
-# <pre>\r
-# $text = Util::trim($text);\r
-# </pre>\r
-#===============================================================================\r
-sub trim {\r
- my $text = shift;\r
- if(!defined($text)){\r
- return "";\r
- }\r
- $text =~ s/^(?:\s)+//o;\r
- $text =~ s/(?:\s)+$//o;\r
- return $text;\r
-}\r
-\r
-\r
-#===============================================================================\r
-# <p>\r
-# ¥¿¥°¤òºï½ü¤·¤Æʸ»úÎó¤Î¤ß¤ò¼èÆÀ¤·¤Þ¤¹¡£\r
-# <p>\r
-# <pre>\r
-# my $html = "<B>ʸ»úÎó</B>";\r
-# # <B>¤È</B>¤òºï½ü¤·¡¢"ʸ»úÎó"¤Î¤ß¼èÆÀ\r
-# my $text = Util::delete_tag($html);\r
-# </pre>\r
-#===============================================================================\r
-sub delete_tag {\r
- my $text = shift;\r
- $text =~ s/<(.|\s)+?>//g;\r
- return $text;\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# ¿ôÃͤ«¤É¤¦¤«¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£¿ôÃͤξì¹ç¤Ï¿¿¡¢¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¤Ïµ¶¤òÊÖ¤·¤Þ¤¹¡£\r
-# </p>\r
-# <pre>\r
-# if(Util::check_numeric($param)){\r
-# # À°¿ô¤Î¾ì¹ç¤Î½èÍý\r
-# } else {\r
-# # À°¿ô¤Ç¤Ê¤¤¾ì¹ç¤Î½èÍý\r
-# }\r
-# </pre>\r
-#===============================================================================\r
-sub check_numeric {\r
- my $text = shift;\r
- if($text =~ /^[0-9]+$/){\r
- return 1;\r
- } else {\r
- return 0;\r
- }\r
-}\r
-\r
-\r
-#===============================================================================\r
-# <p>\r
-# ´ÉÍý¼Ô¤Ë¥á¡¼¥ë¤òÁ÷¿®¤·¤Þ¤¹¡£\r
-# setup.dat¤ÎÀßÄêÆâÍƤ˱þ¤¸¤Æsendmail¥³¥Þ¥ó¥É¤â¤·¤¯¤ÏSMTPÄÌ¿®¤Ë¤è¤Ã¤Æ¥á¡¼¥ë¤¬Á÷¿®¤µ¤ì¤Þ¤¹¡£\r
-# ¤É¤Á¤é¤âÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤ÏÁ÷¿®¤ò¹Ô¤ï¤º¡¢¥¨¥é¡¼¤Ë¤â¤Ê¤ê¤Þ¤»¤ó¡£\r
-# SMTP¤ÇÁ÷¿®¤¹¤ë¾ì¹ç¡¢¤³¤Î¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤·¤¿»þÅÀ¤ÇNet::SMTP¤¬use¤µ¤ì¤Þ¤¹¡£\r
-# </p>\r
-# <pre>\r
-# Util::send_mail($wiki,·ï̾,ËÜʸ);\r
-# </pre>\r
-#===============================================================================\r
-sub send_mail {\r
- my $wiki = shift;\r
- my $subject = Jcode->new(shift)->mime_encode();\r
- my $content = &Jcode::convert(shift,'jis');\r
- \r
- if(($wiki->config('send_mail') eq "" && $wiki->config('smtp_server') eq "") ||\r
- $wiki->config('admin_mail') eq ""){\r
- return;\r
- }\r
-\r
- my ($sec, $min, $hour, $day, $mon, $year, $wday) = localtime(time);\r
- my $wday_str = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat')[$wday];\r
- my $mon_str = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')[$mon];\r
- my $date = sprintf("%s, %02d %s %4d %02d:%02d:%02d +0900", $wday_str, $day, $mon_str, $year+1900, $hour, $min, $sec);\r
- \r
- my $admin_mail = $wiki->config('admin_mail');\r
- foreach my $to (split(/,/,$admin_mail)){\r
- $to = trim($to);\r
- next if($to eq '');\r
- my $mail = "Subject: $subject\n".\r
- "From: $to\n".\r
- "To: $to\n".\r
- "Date: $date\n".\r
- "Content-Transfer-Encoding: 7bit\n".\r
- "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n".\r
- "\n".\r
- $content;\r
- \r
- # sendmail¥³¥Þ¥ó¥É¤ÇÁ÷¿®\r
- if($wiki->config('send_mail') ne ""){\r
- open(MAIL,"| ".$wiki->config('send_mail')." ".$to);\r
- print MAIL $mail;\r
- close(MAIL);\r
- \r
- # Net::SMTP¤ÇÁ÷¿®\r
- } else {\r
- eval("use Net::SMTP;");\r
- my $smtp = Net::SMTP->new($wiki->config('smtp_server'));\r
- $smtp->mail($to);\r
- $smtp->to($to);\r
- $smtp->data();\r
- $smtp->datasend($mail);\r
- $smtp->quit();\r
- }\r
- }\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# ¥¯¥é¥¤¥¢¥ó¥È¤¬·ÈÂÓÅÅÏ䫤ɤ¦¤«¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£\r
-# ·ÈÂÓÅÅÏäξì¹ç¤Ï¿¿¡¢¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¤Ïµ¶¤òÊÖ¤·¤Þ¤¹¡£\r
-# </p>\r
-# <pre>\r
-# if(Util::handyphone()){\r
-# # ·ÈÂÓÅÅÏäξì¹ç¤Î½èÍý\r
-# } else {\r
-# # ·ÈÂÓÅÅÏäǤʤ¤¾ì¹ç¤Î½èÍý\r
-# }\r
-# </pre>\r
-#===============================================================================\r
-sub handyphone {\r
- my $ua = $ENV{'HTTP_USER_AGENT'};\r
- if(!defined($ua)){\r
- return 0;\r
- }\r
- if($ua=~/^DoCoMo\// || $ua=~ /^J-PHONE\// || $ua=~ /UP\.Browser/ || $ua=~ /\(DDIPOCKET\;/ || $ua=~ /\(WILLCOM\;/ || $ua=~ /^Vodafone\// || $ua=~ /^SoftBank\//){\r
- return 1;\r
- } else {\r
- return 0;\r
- }\r
-}\r
-\r
-#===============================================================================\r
-# load_config_hash´Ø¿ô¤Ç»ÈÍѤ¹¤ë¥¢¥ó¥¨¥¹¥±¡¼¥×ÍÑ´Ø¿ô\r
-#===============================================================================\r
-{\r
- my %table = ("\\\\" => "\\", "\\n" => "\n", "\\r" => "\r");\r
-\r
- sub _unescape {\r
- my $value = shift;\r
- $value =~ s/(\\[\\nr])/$table{$1}/go;\r
- return $value;\r
- } \r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# ÀßÄê¥Õ¥¡¥¤¥ë¤ò³ÊǼ¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¡Ê¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï./config¡Ë¤«¤é»ØÄꤷ¤¿¥Õ¥¡¥¤¥ë¤òÆɤ߹þ¤ß¡¢\r
-# ¥Ï¥Ã¥·¥å¥ê¥Õ¥¡¥ì¥ó¥¹¤È¤·¤Æ¼èÆÀ¤·¤Þ¤¹¡£Âè°ì°ú¿ô¤Ë¤Ï$wiki¤òÅϤ·¡¢ÂèÆó°ú¿ô¤Ç¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£\r
-# </p>\r
-# <pre>\r
-# my $hashref = Util::load_config_hash($wiki, "hoge.dat");\r
-# </pre>\r
-#===============================================================================\r
-sub load_config_hash {\r
- my $wiki = shift;\r
- my $filename = shift;\r
- my $text = &load_config_text($wiki,$filename);\r
- my @lines = split(/\n/,$text);\r
- my $hash = {};\r
- foreach my $line (@lines){\r
- $line = &trim($line);\r
- if(index($line,"#")==0 || $line eq "\n" || $line eq "\r" || $line eq "\r\n"){\r
- next;\r
- }\r
- my ($name, @spl) = map {/^"(.*)"$/ ? scalar($_ = $1, s/\"\"/\"/g, $_) : $_}\r
- ("=$line" =~ /=\s*(\"[^\"]*(?:\"\"[^\"]*)*\"|[^=]*)/g);\r
- \r
- $name = &trim(_unescape($name));\r
- my $value = &trim(_unescape(join('=', @spl)));\r
- \r
- if($name ne ''){\r
- $hash->{$name} = $value;\r
- }\r
- }\r
- return $hash;\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# ÀßÄê¥Õ¥¡¥¤¥ë¤ò³ÊǼ¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¡Ê¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï./config¡Ë¤«¤é»ØÄꤷ¤¿¥Õ¥¡¥¤¥ë¤òÆɤ߹þ¤ß¡¢\r
-# ¥Õ¥¡¥¤¥ëÆâÍƤòʸ»úÎó¤È¤·¤Æ¼èÆÀ¤·¤Þ¤¹¡£Âè°ì°ú¿ô¤Ë¤Ï$wiki¤òÅϤ·¡¢ÂèÆó°ú¿ô¤Ç¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£\r
-# </p>\r
-# <pre>\r
-# my $content = Util::load_config_text($wiki, "hoge.dat");\r
-# </pre>\r
-#===============================================================================\r
-sub load_config_text {\r
- my $wiki = shift;\r
- my $filename = shift;\r
- my $fullpath = $filename;\r
- if(defined($wiki)){\r
- $fullpath = $wiki->config('config_dir')."/$filename";\r
- }\r
- \r
- if(defined($wiki->{config_cache}->{$fullpath})){\r
- return $wiki->{config_cache}->{$fullpath};\r
- }\r
- \r
- open(CONFIG,$fullpath) or return "";\r
- binmode(CONFIG);\r
- my $buf = "";\r
- while(my $line = <CONFIG>){\r
- $buf .= $line;\r
- }\r
- close(CONFIG);\r
- \r
- $buf =~ s/\r\n/\n/g;\r
- $buf =~ s/\r/\n/g;\r
- \r
- $wiki->{config_cache}->{$fullpath} = $buf;\r
- \r
- return $buf;\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# °ú¿ô¤ÇÅϤ·¤¿¥Ï¥Ã¥·¥å¥ê¥Õ¥¡¥ì¥ó¥¹¤òÀßÄê¥Õ¥¡¥¤¥ë¤ò³ÊǼ¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¡Ê¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï./config¡Ë¤Ë\r
-# »ØÄꤷ¤¿¥Õ¥¡¥¤¥ë̾¤ÇÊݸ¤·¤Þ¤¹¡£Âè°ì°ú¿ô¤Ë¤Ï$wiki¤òÅϤ·¡¢ÂèÆó°ú¿ô¤Ç¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£\r
-# </p>\r
-# <pre>\r
-# Util::save_config_hash($wiki, ¥Õ¥¡¥¤¥ë̾, ¥Ï¥Ã¥·¥å¥ê¥Õ¥¡¥ì¥ó¥¹);\r
-# </pre>\r
-#===============================================================================\r
-sub save_config_hash {\r
- my $wiki = shift;\r
- my $filename = shift;\r
- my $hash = shift;\r
- my $text = _make_quoted_text($hash);\r
- &save_config_text($wiki,$filename,$text);\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# °ú¿ô¤ÇÅϤ·¤¿¥Æ¥¥¹¥È¤òÀßÄê¥Õ¥¡¥¤¥ë¤ò³ÊǼ¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¡Ê¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï./config¡Ë¤Ë\r
-# »ØÄꤷ¤¿¥Õ¥¡¥¤¥ë̾¤ÇÊݸ¤·¤Þ¤¹¡£Âè°ì°ú¿ô¤Ë¤Ï$wiki¤òÅϤ·¡¢ÂèÆó°ú¿ô¤Ç¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£\r
-# </p>\r
-# <pre>\r
-# Util::save_config_hash($wiki, ¥Õ¥¡¥¤¥ë̾, ¥Æ¥¥¹¥È);\r
-# </pre>\r
-#===============================================================================\r
-sub save_config_text {\r
- my $wiki = shift;\r
- my $filename = shift;\r
- my $text = shift;\r
- \r
- $text =~ s/\r\n/\n/g;\r
- $text =~ s/\r/\n/g;\r
- \r
- my $fullpath = $filename;\r
- if(defined($wiki)){\r
- $fullpath = $wiki->config('config_dir')."/$filename";\r
- }\r
- \r
- my $tmpfile = "$fullpath.tmp";\r
- \r
- file_lock($fullpath);\r
- \r
- open(CONFIG,">$tmpfile") or die $!;\r
- binmode(CONFIG);\r
- print CONFIG $text;\r
- close(CONFIG);\r
- \r
- rename($tmpfile, $fullpath);\r
- file_unlock($fullpath);\r
- \r
- $wiki->{config_cache}->{$fullpath} = $text;\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# ÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß¤È½ñ¤¹þ¤ß¤òƱ°ì¤Î¥í¥Ã¥¯Æâ¤Ç¹Ô¤¦¤¿¤á¤Î´Ø¿ô¡£\r
-# Æɤ߹þ¤ó¤ÀÆâÍƤòÊÑ´¹¤·¤Æ½ñ¤¹þ¤ß¤ò¹Ô¤¦¤è¤¦¤Ê¾ì¹ç¤Ë»ÈÍѤ·¤Þ¤¹¡£\r
-# </p>\r
-# <pre>\r
-# sub convert {\r
-# my $hash = shift;\r
-# ...\r
-# return $hash;\r
-# }\r
-# \r
-# Util::sync_update_config($wiki, ¥Õ¥¡¥¤¥ë̾, \&convert);\r
-# </pre>\r
-#===============================================================================\r
-sub sync_update_config {\r
- my $wiki = shift;\r
- my $filename = shift;\r
- my $function = shift;\r
- \r
- my $fullpath = $filename;\r
- if(defined($wiki)){\r
- $fullpath = $wiki->config('config_dir')."/$filename";\r
- }\r
- \r
- my $tmpfile = "$fullpath.tmp";\r
- \r
- file_lock($fullpath);\r
- \r
- my $hash = load_config_hash($wiki, $filename);\r
- my $text = _make_quoted_text(&$function($hash));\r
- \r
- open(CONFIG,">$tmpfile") or die $!;\r
- binmode(CONFIG);\r
- print CONFIG $text;\r
- close(CONFIG);\r
- \r
- rename($tmpfile, $fullpath);\r
- file_unlock($fullpath);\r
- \r
- $wiki->{config_cache}->{$fullpath} = $text;\r
-}\r
-\r
-#===============================================================================\r
-# ¥Ï¥Ã¥·¥å¤ò¥Æ¥¥¹¥È¤ËÊÑ´¹¤¹¤ë¤¿¤á¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¡£\r
-#===============================================================================\r
-sub _make_quoted_text {\r
- my $hash = shift;\r
- my $text = "";\r
- foreach my $key (sort(keys(%$hash))){\r
- my $value = $hash->{$key};\r
- \r
- $key =~ s/"/""/g;\r
- $key =~ s/\\/\\\\/g;\r
- $key =~ s/\n/\\n/g;\r
- $key =~ s/\r/\\r/g;\r
- \r
- $value =~ s/"/""/g;\r
- $value =~ s/\\/\\\\/g;\r
- $value =~ s/\n/\\n/g;\r
- $value =~ s/\r/\\r/g;\r
- \r
- $text .= qq{"$key"="$value"\n};\r
- }\r
- return $text;\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# °ú¿ô¤ÇÅϤ·¤¿¥Õ¥¡¥¤¥ë¤ò¥í¥Ã¥¯¤·¤Þ¤¹¡£\r
-# ¥Õ¥¡¥¤¥ëÁàºî½ªÎ»¸å¤Ïɬ¤ºÆ±¤¸¥Õ¥¡¥¤¥ë̾¤ÇUtil::file_unlock¤ò¸Æ¤Ó½Ð¤·¤Æ²¼¤µ¤¤¡£\r
-# ¥í¥Ã¥¯¤Ë¼ºÇÔ¤·¤¿¾ì¹ç¤Ïdie¤·¤Þ¤¹¡£\r
-# </p>\r
-# <pre>\r
-# Util::file_lock(¥Õ¥¡¥¤¥ë̾, ¥ê¥È¥é¥¤²ó¿ô¡Ê¢â¥¿¥¤¥à¥¢¥¦¥È»þ´Ö¡¢¾Êά²Ä¡Ë);\r
-# </pre>\r
-#===============================================================================\r
-# ¥í¥Ã¥¯¤·¤Æ¤¤¤ë¥Õ¥¡¥¤¥ë¤òµÏ¿¤·¡¢½ªÎ»»þ¤Ë̤²ò½ü¤Î¥í¥Ã¥¯¤ò²ò½ü¤¹¤ëÊݸ±¤ò¤Ä¤±¤¿Êý¤¬Îɤ¤¤«¤âÃΤì¤Ê¤¤¡£\r
-sub file_lock {\r
- my $lock = shift() . ".lock";\r
- my $retry = shift || 5;\r
-# debug("file_lock($$): $lock");\r
- \r
- if(-e $lock){\r
- my $mtime = (stat($lock))[9];\r
- rmdir($lock) if($mtime < time() - 60);\r
- }\r
- \r
- while(!mkdir($lock,0777)){\r
- die "Lock is busy." if(--$retry <= 0);\r
- sleep(1);\r
- }\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# °ú¿ô¤ÇÅϤ·¤¿¥Õ¥¡¥¤¥ë¤Î¥í¥Ã¥¯¤ò²ò½ü¤·¤Þ¤¹¡£\r
-# </p>\r
-# <pre>\r
-# Util::file_unlock(¥Õ¥¡¥¤¥ë̾);\r
-# </pre>\r
-#===============================================================================\r
-sub file_unlock {\r
- my $lock = shift() . ".lock";\r
- rmdir($lock);\r
-# debug("file_unlock($$): $lock");\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# ¥¤¥ó¥é¥¤¥ó¥×¥é¥°¥¤¥ó¤«¤é¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òÊÖ¤¹¾ì¹ç¤Ë»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£\r
-# </p>\r
-# <pre>\r
-# return Util::inline_error('¥×¥í¥¸¥§¥¯¥È̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£');\r
-# </pre>\r
-#===============================================================================\r
-sub inline_error {\r
- my $message = shift;\r
- my $type = shift;\r
- \r
- if(uc($type) eq "WIKI"){\r
- return "<<$message>>";\r
- } else {\r
- return "<span class=\"error\">".&Util::escapeHTML($message)."</span>";\r
- }\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# ¥Ñ¥é¥°¥é¥Õ¥×¥é¥°¥¤¥ó¤«¤é¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òÊÖ¤¹¾ì¹ç¤Ë»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£\r
-# </p>\r
-# <pre>\r
-# return Util::paragraph_error('¥×¥í¥¸¥§¥¯¥È̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£');\r
-# </pre>\r
-#===============================================================================\r
-sub paragraph_error {\r
- my $message = shift;\r
- my $type = shift;\r
- \r
- if(uc($type) eq "WIKI"){\r
- return "<<$message>>";\r
- } else {\r
- return "<p><span class=\"error\">".&Util::escapeHTML($message)."</span></p>";\r
- }\r
-}\r
-\r
-\r
-#===============================================================================\r
-# <p>\r
-# »ØÄê¤ÎURL¤ËGET¥ê¥¯¥¨¥¹¥È¤òȯ¹Ô¤·¡¢¥ì¥¹¥Ý¥ó¥¹¤Î¥Ü¥Ç¥£Éô¤òÊֵѤ·¤Þ¤¹¡£\r
-# ¤³¤Î´Ø¿ô¤ò¸Æ¤Ó½Ð¤·¤¿»þÅÀ¤ÇLWP::UserAgent¤¬use¤µ¤ì¤Þ¤¹¡£\r
-# </p>\r
-# <pre>\r
-# my $response = Util::get_response($wiki,URL);\r
-# </pre>\r
-#===============================================================================\r
-sub get_response {\r
- my $wiki = shift;\r
- my $url = shift;\r
-\r
- eval("use LWP::UserAgent;");\r
- eval("use MIME::Base64;");\r
-\r
- my $ua = LWP::UserAgent->new();\r
- my $req = HTTP::Request->new('GET',$url);\r
- \r
- # ¥×¥í¥¥·¤ÎÀßÄê\r
- my $proxy_host = $wiki->config('proxy_host');\r
- my $proxy_port = $wiki->config('proxy_port');\r
- my $proxy_user = $wiki->config('proxy_user');\r
- my $proxy_pass = $wiki->config('proxy_pass');\r
- \r
- if($proxy_host ne "" && $proxy_port ne ""){\r
- $ua->proxy("http","http://$proxy_host:$proxy_port");\r
- if($proxy_user ne "" && $proxy_pass ne ""){\r
- $req->header('Proxy-Authorization'=>"Basic ".&MIME::Base64::encode("$proxy_user:$proxy_pass"));\r
- }\r
- }\r
- \r
- # ¥ê¥¯¥¨¥¹¥È¤òȯ¹Ô\r
- my $res = $ua->request($req);\r
- return $res->content();\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# ¥â¥¸¥å¡¼¥ë̾¤«¤é¥Õ¥¡¥¤¥ë̾¤ò¼èÆÀ¤·¤Þ¤¹¡£\r
-# Î㤨¤Ðplugin::core::Install¤òÅϤ¹¤Èplugin/core/Install.pm¤¬ÊֵѤµ¤ì¤Þ¤¹¡£\r
-# </p>\r
-# <pre>\r
-# $file = Util::get_module_file(¥â¥¸¥å¡¼¥ë̾);\r
-# </pre>\r
-#===============================================================================\r
-sub get_module_file {\r
- return join('/',split(/::/,shift)).'.pm';\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# ¥Ç¥Ð¥Ã¥°¥í¥°¡Êdebug.log¡Ë¤ò¥«¥ì¥ó¥È¥Ç¥£¥ì¥¯¥È¥ê¤Ë½ÐÎϤ·¤Þ¤¹¡£\r
-# Wiki::DEBUG=1¤Î¾ì¹ç¤Î¤ß½ÐÎϤò¹Ô¤¤¤Þ¤¹¡£\r
-# </p>\r
-#===============================================================================\r
-sub debug {\r
- my $message = shift;\r
- if($Wiki::DEBUG==1){\r
- my $date = &Util::format_date(time());\r
- my $lock = "debug.log.lock";\r
- my $retry = 5;\r
- if(-e $lock){\r
- my $mtime = (stat($lock))[9];\r
- rmdir($lock) if($mtime < time() - 60);\r
- }\r
- \r
- while(!mkdir($lock,0777)){\r
- die "Lock is busy." if(--$retry <= 0);\r
- sleep(1);\r
- }\r
- open(LOG,">>debug.log");\r
- print LOG "$date $message\n";\r
- close(LOG);\r
- rmdir($lock);\r
- }\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# Digest::Perl::MD5¤òÍѤ¤¤¿¥Ñ¥¹¥ï¡¼¥É¤Î°Å¹æ²½¤ò¹Ô¤¤¤Þ¤¹¡£\r
-# Âè°ì°ú¿ô¤Ë¥Ñ¥¹¥ï¡¼¥É¡¢ÂèÆó°ú¿ô¤Ë¥¢¥«¥¦¥ó¥È¤òÅϤ·¤Þ¤¹¡£\r
-# ¤³¤Î¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤·¤¿»þÅÀ¤ÇDigest::Perl::MD5¤¬use¤µ¤ì¤Þ¤¹¡£\r
-# </p>\r
-# <pre>\r
-# my $md5pass = Util::md5($pass,$account);\r
-# </pre>\r
-#===============================================================================\r
-sub md5 {\r
- my $pass = shift;\r
- my $salt = shift;\r
- \r
- eval("use Digest::Perl::MD5;");\r
- \r
- my $md5 = Digest::Perl::MD5->new();\r
- $md5->add($pass);\r
- $md5->add($salt);\r
- \r
- return $md5->hexdigest;\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# HTTP¥Ø¥Ã¥À¤ÎContent-Disposition¹Ô¤òÀ¸À®¤·¤Þ¤¹¡£\r
-# źÉÕ¥Õ¥¡¥¤¥ë¤äPDF¤Ê¤É¤Ë»ÈÍѤ·¤Þ¤¹¡£\r
-# </p>\r
-#===============================================================================\r
-sub make_content_disposition {\r
- my ($filename, $disposition) = @_;\r
- my $ua = $ENV{"HTTP_USER_AGENT"};\r
- my $encoded = ($ua =~ /MSIE/ ? &Jcode::convert($filename, 'sjis') : Jcode->new($filename)->mime_encode(''));\r
- return "Content-Disposition: $disposition;filename=\"".$encoded."\"\n\n";\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# CGI::Carp¥â¥¸¥å¡¼¥ë¤ÎÂå¤ï¤ê¤Ëdie´Ø¿ô¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£\r
-# ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òÀ¸À®¤·¤¿¸å¤ËËÜʪ¤Îdie´Ø¿ô¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£\r
-# </p>\r
-#===============================================================================\r
-sub _die {\r
- my ($arg,@rest) = @_;\r
- $arg = join("", ($arg,@rest));\r
- my($pack,$file,$line,$sub) = caller(1);\r
- $arg .= " at $file line $line." unless $arg=~/\n$/;\r
- CORE::die($arg);\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# exit´Ø¿ô¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£\r
-# </p>\r
-#===============================================================================\r
-sub _exit {\r
- CORE::die('safe_die');\r
-}\r
-\r
-#===============================================================================\r
-# <p>\r
-# die¤Èexit¤Î¥ª¡¼¥Ð¥é¥¤¥ÉÁàºî¤ò²ò½ü¤·¤Þ¤¹¡£\r
-# </p>\r
-#===============================================================================\r
-sub restore_die{\r
- our @original_exit_handler;\r
- *CORE::GLOBAL::die = $original_exit_handler[0];\r
- *CORE::GLOBAL::exit = $original_exit_handler[1];\r
-}\r
-\r
-1;\r
+################################################################################
+# <p>
+# FSWikiÁ´ÂΤǻÈÍѤµ¤ì¤ë¥æ¡¼¥Æ¥£¥ê¥Æ¥£´Ø¿ô·²¤òÄ󶡤¹¤ë¥â¥¸¥å¡¼¥ë¤Ç¤¹¡£
+# </p>
+################################################################################
+package Util;
+use strict;
+
+#===============================================================================
+# <p>
+# die¤Èexit¤Î¥ª¡¼¥Ð¥é¥¤¥ÉÁàºî¤ò¹Ô¤¤¤Þ¤¹¡£
+# </p>
+#===============================================================================
+sub override_die{
+ our @original_exit_handler;
+ @original_exit_handler or @original_exit_handler = (\&CORE::GLOBAL::die,\&CORE::GLOBAL::exit);
+ *CORE::GLOBAL::die = \&Util::_die;
+ *CORE::GLOBAL::exit = \&Util::_exit;
+}
+
+BEGIN {
+ require Util;
+# *CORE::GLOBAL::die = \&Util::_die;
+# *CORE::GLOBAL::exit = \&Util::_exit;
+ exists($ENV{MOD_PERL}) or override_die();
+}
+
+#===============================================================================
+# <p>
+# °ú¿ô¤ÇÅϤµ¤ì¤¿Ê¸»úÎó¤òURL¥¨¥ó¥³¡¼¥É¤·¤ÆÊÖ¤·¤Þ¤¹¡£
+# </p>
+# <pre>
+# $str = Util::url_encode($str)
+# </pre>
+#===============================================================================
+sub url_encode {
+ my $retstr = shift;
+ $retstr =~ s/([^ 0-9A-Za-z])/sprintf("%%%.2X", ord($1))/eg;
+ $retstr =~ tr/ /+/;
+ return $retstr;
+}
+
+#===============================================================================
+# <p>
+# °ú¿ô¤ÇÅϤµ¤ì¤¿Ê¸»úÎó¤òURL¥Ç¥³¡¼¥É¤·¤ÆÊÖ¤·¤Þ¤¹¡£
+# </p>
+# <pre>
+# $str = Util::url_decode($str);
+# </pre>
+#===============================================================================
+sub url_decode{
+ my $retstr = shift;
+ $retstr =~ tr/+/ /;
+ $retstr =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge;
+ return $retstr;
+}
+
+#===============================================================================
+# <p>
+# Cookie¤Îpath¤Ë»ØÄꤹ¤ëʸ»úÎó¤ò¼èÆÀ¤·¤Þ¤¹¡£
+# </p>
+# <pre>
+# $path = Util::cookie_path($wiki);
+# </pre>
+#===============================================================================
+sub cookie_path {
+ my $wiki = shift;
+ my $script_name = quotemeta($wiki->config('script_name'));
+ my $path = $ENV{'REQUEST_URI'};
+ $path =~ s/\?.*//;
+ $path =~ s/$script_name$//;
+ return $path;
+}
+
+#===============================================================================
+# <p>
+# ¥Ç¥£¥ì¥¯¥È¥ê¡¢¥Õ¥¡¥¤¥ë̾¡¢³ÈÄ¥»Ò¤ò·ë¹ç¤·¤Æ¥Õ¥¡¥¤¥ë̾¤òÀ¸À®¤·¤Þ¤¹¡£
+# </p>
+# <pre>
+# my $filename = Util::make_filename(¥Ç¥£¥ì¥¯¥È¥ê̾,¥Õ¥¡¥¤¥ë̾,³ÈÄ¥»Ò);
+# </pre>
+#===============================================================================
+sub make_filename {
+ my $dir = shift;
+ my $file = shift;
+ my $ext = shift;
+
+ return $dir."/".$file.".".$ext;
+}
+
+#===============================================================================
+# <p>
+# °ú¿ô¤ÇÅϤµ¤ì¤¿Ê¸»úÎó¤ÎHTML¥¿¥°¤ò¥¨¥¹¥±¡¼¥×¤·¤ÆÊÖ¤·¤Þ¤¹¡£
+# </p>
+# <pre>
+# $str = Util::escapeHTML($str);
+# </pre>
+#===============================================================================
+sub escapeHTML {
+ my($retstr) = shift;
+ my %table = (
+ '&' => '&',
+ '"' => '"',
+ '<' => '<',
+ '>' => '>',
+ );
+ $retstr =~ s/([&\"<>])/$table{$1}/go;
+ $retstr =~ s/&#([0-9]{1,5});/&#$1;/go;
+ $retstr =~ s/&#(0*(0|9|10|13|38|60|62));/&#$1;/g;
+# $retstr =~ s/&([a-zA-Z0-9]{2,8});/&$1;/go;
+ return $retstr;
+}
+
+
+#===============================================================================
+# <p>
+# ÆüÉÕ¤ò"yyyyǯmm·îddÆü hh»þmiʬssÉÃ"·Á¼°¤Ë¥Õ¥©¡¼¥Þ¥Ã¥È¤·¤Þ¤¹¡£
+# </p>
+# <pre>
+# my $date = Util::format_date(time());
+# </pre>
+#===============================================================================
+sub format_date {
+ my $t = shift;
+ my ($sec, $min, $hour, $mday, $mon, $year) = localtime($t);
+ return sprintf("%04dǯ%02d·î%02dÆü %02d»þ%02dʬ%02dÉÃ",
+ $year+1900,$mon+1,$mday,$hour,$min,$sec);
+}
+
+#===============================================================================
+# <p>
+# ʸ»úÎó¤Îξü¤Î¶õÇò¤òÀÚ¤êÍî¤È¤·¤Þ¤¹¡£
+# </p>
+# <pre>
+# $text = Util::trim($text);
+# </pre>
+#===============================================================================
+sub trim {
+ my $text = shift;
+ if(!defined($text)){
+ return "";
+ }
+ $text =~ s/^(?:\s)+//o;
+ $text =~ s/(?:\s)+$//o;
+ return $text;
+}
+
+
+#===============================================================================
+# <p>
+# ¥¿¥°¤òºï½ü¤·¤Æʸ»úÎó¤Î¤ß¤ò¼èÆÀ¤·¤Þ¤¹¡£
+# <p>
+# <pre>
+# my $html = "<B>ʸ»úÎó</B>";
+# # <B>¤È</B>¤òºï½ü¤·¡¢"ʸ»úÎó"¤Î¤ß¼èÆÀ
+# my $text = Util::delete_tag($html);
+# </pre>
+#===============================================================================
+sub delete_tag {
+ my $text = shift;
+ $text =~ s/<(.|\s)+?>//g;
+ return $text;
+}
+
+#===============================================================================
+# <p>
+# ¿ôÃͤ«¤É¤¦¤«¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£¿ôÃͤξì¹ç¤Ï¿¿¡¢¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¤Ïµ¶¤òÊÖ¤·¤Þ¤¹¡£
+# </p>
+# <pre>
+# if(Util::check_numeric($param)){
+# # À°¿ô¤Î¾ì¹ç¤Î½èÍý
+# } else {
+# # À°¿ô¤Ç¤Ê¤¤¾ì¹ç¤Î½èÍý
+# }
+# </pre>
+#===============================================================================
+sub check_numeric {
+ my $text = shift;
+ if($text =~ /^[0-9]+$/){
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+
+#===============================================================================
+# <p>
+# ´ÉÍý¼Ô¤Ë¥á¡¼¥ë¤òÁ÷¿®¤·¤Þ¤¹¡£
+# setup.dat¤ÎÀßÄêÆâÍƤ˱þ¤¸¤Æsendmail¥³¥Þ¥ó¥É¤â¤·¤¯¤ÏSMTPÄÌ¿®¤Ë¤è¤Ã¤Æ¥á¡¼¥ë¤¬Á÷¿®¤µ¤ì¤Þ¤¹¡£
+# ¤É¤Á¤é¤âÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤ÏÁ÷¿®¤ò¹Ô¤ï¤º¡¢¥¨¥é¡¼¤Ë¤â¤Ê¤ê¤Þ¤»¤ó¡£
+# SMTP¤ÇÁ÷¿®¤¹¤ë¾ì¹ç¡¢¤³¤Î¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤·¤¿»þÅÀ¤ÇNet::SMTP¤¬use¤µ¤ì¤Þ¤¹¡£
+# </p>
+# <pre>
+# Util::send_mail($wiki,·ï̾,ËÜʸ);
+# </pre>
+#===============================================================================
+sub send_mail {
+ my $wiki = shift;
+ my $subject = Jcode->new(shift)->mime_encode();
+ my $content = &Jcode::convert(shift,'jis');
+
+ if(($wiki->config('send_mail') eq "" && $wiki->config('smtp_server') eq "") ||
+ $wiki->config('admin_mail') eq ""){
+ return;
+ }
+
+ my ($sec, $min, $hour, $day, $mon, $year, $wday) = localtime(time);
+ my $wday_str = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat')[$wday];
+ my $mon_str = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')[$mon];
+ my $date = sprintf("%s, %02d %s %4d %02d:%02d:%02d +0900", $wday_str, $day, $mon_str, $year+1900, $hour, $min, $sec);
+
+ my $admin_mail = $wiki->config('admin_mail');
+ foreach my $to (split(/,/,$admin_mail)){
+ $to = trim($to);
+ next if($to eq '');
+ my $mail = "Subject: $subject\n".
+ "From: $to\n".
+ "To: $to\n".
+ "Date: $date\n".
+ "Content-Transfer-Encoding: 7bit\n".
+ "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n".
+ "\n".
+ $content;
+
+ # sendmail¥³¥Þ¥ó¥É¤ÇÁ÷¿®
+ if($wiki->config('send_mail') ne ""){
+ open(MAIL,"| ".$wiki->config('send_mail')." ".$to);
+ print MAIL $mail;
+ close(MAIL);
+
+ # Net::SMTP¤ÇÁ÷¿®
+ } else {
+ eval("use Net::SMTP;");
+ my $smtp = Net::SMTP->new($wiki->config('smtp_server'));
+ $smtp->mail($to);
+ $smtp->to($to);
+ $smtp->data();
+ $smtp->datasend($mail);
+ $smtp->quit();
+ }
+ }
+}
+
+#===============================================================================
+# <p>
+# ¥¯¥é¥¤¥¢¥ó¥È¤¬·ÈÂÓÅÅÏ䫤ɤ¦¤«¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£
+# ·ÈÂÓÅÅÏäξì¹ç¤Ï¿¿¡¢¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¤Ïµ¶¤òÊÖ¤·¤Þ¤¹¡£
+# </p>
+# <pre>
+# if(Util::handyphone()){
+# # ·ÈÂÓÅÅÏäξì¹ç¤Î½èÍý
+# } else {
+# # ·ÈÂÓÅÅÏäǤʤ¤¾ì¹ç¤Î½èÍý
+# }
+# </pre>
+#===============================================================================
+sub handyphone {
+ my $ua = $ENV{'HTTP_USER_AGENT'};
+ if(!defined($ua)){
+ return 0;
+ }
+ if($ua=~/^DoCoMo\// || $ua=~ /^J-PHONE\// || $ua=~ /UP\.Browser/ || $ua=~ /\(DDIPOCKET\;/ || $ua=~ /\(WILLCOM\;/ || $ua=~ /^Vodafone\// || $ua=~ /^SoftBank\//){
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+#===============================================================================
+# <p>
+# ¥¯¥é¥¤¥¢¥ó¥È¤¬¥¹¥Þ¡¼¥È¥Õ¥©¥ó¤«¤É¤¦¤«¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£
+# ¥¹¥Þ¡¼¥È¥Õ¥©¥ó¤Î¾ì¹ç¤Ï¿¿¡¢¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¤Ïµ¶¤òÊÖ¤·¤Þ¤¹¡£
+# </p>
+# <pre>
+# if(Util::smartphone()){
+# # ¥¹¥Þ¡¼¥È¥Õ¥©¥ó¤Î¾ì¹ç¤Î½èÍý
+# } else {
+# # ¥¹¥Þ¡¼¥È¥Õ¥©¥ó¤Ç¤Ê¤¤¾ì¹ç¤Î½èÍý
+# }
+# </pre>
+#===============================================================================
+sub smartphone {
+ my $ua = $ENV{'HTTP_USER_AGENT'};
+ if(!defined($ua)){
+ return 0;
+ }
+ if($ua =~ /Android/ || $ua =~ /iPhone/){
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+#===============================================================================
+# load_config_hash´Ø¿ô¤Ç»ÈÍѤ¹¤ë¥¢¥ó¥¨¥¹¥±¡¼¥×ÍÑ´Ø¿ô
+#===============================================================================
+{
+ my %table = ("\\\\" => "\\", "\\n" => "\n", "\\r" => "\r");
+
+ sub _unescape {
+ my $value = shift;
+ $value =~ s/(\\[\\nr])/$table{$1}/go;
+ return $value;
+ }
+}
+
+#===============================================================================
+# <p>
+# ÀßÄê¥Õ¥¡¥¤¥ë¤ò³ÊǼ¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¡Ê¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï./config¡Ë¤«¤é»ØÄꤷ¤¿¥Õ¥¡¥¤¥ë¤òÆɤ߹þ¤ß¡¢
+# ¥Ï¥Ã¥·¥å¥ê¥Õ¥¡¥ì¥ó¥¹¤È¤·¤Æ¼èÆÀ¤·¤Þ¤¹¡£Âè°ì°ú¿ô¤Ë¤Ï$wiki¤òÅϤ·¡¢ÂèÆó°ú¿ô¤Ç¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£
+# </p>
+# <pre>
+# my $hashref = Util::load_config_hash($wiki, "hoge.dat");
+# </pre>
+#===============================================================================
+sub load_config_hash {
+ my $wiki = shift;
+ my $filename = shift;
+ my $text = &load_config_text($wiki,$filename);
+ my @lines = split(/\n/,$text);
+ my $hash = {};
+ foreach my $line (@lines){
+ $line = &trim($line);
+ if(index($line,"#")==0 || $line eq "\n" || $line eq "\r" || $line eq "\r\n"){
+ next;
+ }
+ my ($name, @spl) = map {/^"(.*)"$/ ? scalar($_ = $1, s/\"\"/\"/g, $_) : $_}
+ ("=$line" =~ /=\s*(\"[^\"]*(?:\"\"[^\"]*)*\"|[^=]*)/g);
+
+ $name = &trim(_unescape($name));
+ my $value = &trim(_unescape(join('=', @spl)));
+
+ if($name ne ''){
+ $hash->{$name} = $value;
+ }
+ }
+ return $hash;
+}
+
+#===============================================================================
+# <p>
+# ÀßÄê¥Õ¥¡¥¤¥ë¤ò³ÊǼ¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¡Ê¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï./config¡Ë¤«¤é»ØÄꤷ¤¿¥Õ¥¡¥¤¥ë¤òÆɤ߹þ¤ß¡¢
+# ¥Õ¥¡¥¤¥ëÆâÍƤòʸ»úÎó¤È¤·¤Æ¼èÆÀ¤·¤Þ¤¹¡£Âè°ì°ú¿ô¤Ë¤Ï$wiki¤òÅϤ·¡¢ÂèÆó°ú¿ô¤Ç¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£
+# </p>
+# <pre>
+# my $content = Util::load_config_text($wiki, "hoge.dat");
+# </pre>
+#===============================================================================
+sub load_config_text {
+ my $wiki = shift;
+ my $filename = shift;
+ my $fullpath = $filename;
+ if(defined($wiki)){
+ $fullpath = $wiki->config('config_dir')."/$filename";
+ }
+
+ if(defined($wiki->{config_cache}->{$fullpath})){
+ return $wiki->{config_cache}->{$fullpath};
+ }
+
+ open(CONFIG,$fullpath) or return "";
+ binmode(CONFIG);
+ my $buf = "";
+ while(my $line = <CONFIG>){
+ $buf .= $line;
+ }
+ close(CONFIG);
+
+ $buf =~ s/\r\n/\n/g;
+ $buf =~ s/\r/\n/g;
+
+ $wiki->{config_cache}->{$fullpath} = $buf;
+
+ return $buf;
+}
+
+#===============================================================================
+# <p>
+# °ú¿ô¤ÇÅϤ·¤¿¥Ï¥Ã¥·¥å¥ê¥Õ¥¡¥ì¥ó¥¹¤òÀßÄê¥Õ¥¡¥¤¥ë¤ò³ÊǼ¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¡Ê¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï./config¡Ë¤Ë
+# »ØÄꤷ¤¿¥Õ¥¡¥¤¥ë̾¤ÇÊݸ¤·¤Þ¤¹¡£Âè°ì°ú¿ô¤Ë¤Ï$wiki¤òÅϤ·¡¢ÂèÆó°ú¿ô¤Ç¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£
+# </p>
+# <pre>
+# Util::save_config_hash($wiki, ¥Õ¥¡¥¤¥ë̾, ¥Ï¥Ã¥·¥å¥ê¥Õ¥¡¥ì¥ó¥¹);
+# </pre>
+#===============================================================================
+sub save_config_hash {
+ my $wiki = shift;
+ my $filename = shift;
+ my $hash = shift;
+ my $text = _make_quoted_text($hash);
+ &save_config_text($wiki,$filename,$text);
+}
+
+#===============================================================================
+# <p>
+# °ú¿ô¤ÇÅϤ·¤¿¥Æ¥¥¹¥È¤òÀßÄê¥Õ¥¡¥¤¥ë¤ò³ÊǼ¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¡Ê¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï./config¡Ë¤Ë
+# »ØÄꤷ¤¿¥Õ¥¡¥¤¥ë̾¤ÇÊݸ¤·¤Þ¤¹¡£Âè°ì°ú¿ô¤Ë¤Ï$wiki¤òÅϤ·¡¢ÂèÆó°ú¿ô¤Ç¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£
+# </p>
+# <pre>
+# Util::save_config_hash($wiki, ¥Õ¥¡¥¤¥ë̾, ¥Æ¥¥¹¥È);
+# </pre>
+#===============================================================================
+sub save_config_text {
+ my $wiki = shift;
+ my $filename = shift;
+ my $text = shift;
+
+ $text =~ s/\r\n/\n/g;
+ $text =~ s/\r/\n/g;
+
+ my $fullpath = $filename;
+ if(defined($wiki)){
+ $fullpath = $wiki->config('config_dir')."/$filename";
+ }
+
+ my $tmpfile = "$fullpath.tmp";
+
+ file_lock($fullpath);
+
+ open(CONFIG,">$tmpfile") or die $!;
+ binmode(CONFIG);
+ print CONFIG $text;
+ close(CONFIG);
+
+ rename($tmpfile, $fullpath);
+ file_unlock($fullpath);
+
+ $wiki->{config_cache}->{$fullpath} = $text;
+}
+
+#===============================================================================
+# <p>
+# ÀßÄê¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ß¤È½ñ¤¹þ¤ß¤òƱ°ì¤Î¥í¥Ã¥¯Æâ¤Ç¹Ô¤¦¤¿¤á¤Î´Ø¿ô¡£
+# Æɤ߹þ¤ó¤ÀÆâÍƤòÊÑ´¹¤·¤Æ½ñ¤¹þ¤ß¤ò¹Ô¤¦¤è¤¦¤Ê¾ì¹ç¤Ë»ÈÍѤ·¤Þ¤¹¡£
+# </p>
+# <pre>
+# sub convert {
+# my $hash = shift;
+# ...
+# return $hash;
+# }
+#
+# Util::sync_update_config($wiki, ¥Õ¥¡¥¤¥ë̾, \&convert);
+# </pre>
+#===============================================================================
+sub sync_update_config {
+ my $wiki = shift;
+ my $filename = shift;
+ my $function = shift;
+
+ my $fullpath = $filename;
+ if(defined($wiki)){
+ $fullpath = $wiki->config('config_dir')."/$filename";
+ }
+
+ my $tmpfile = "$fullpath.tmp";
+
+ file_lock($fullpath);
+
+ my $hash = load_config_hash($wiki, $filename);
+ my $text = _make_quoted_text(&$function($hash));
+
+ open(CONFIG,">$tmpfile") or die $!;
+ binmode(CONFIG);
+ print CONFIG $text;
+ close(CONFIG);
+
+ rename($tmpfile, $fullpath);
+ file_unlock($fullpath);
+
+ $wiki->{config_cache}->{$fullpath} = $text;
+}
+
+#===============================================================================
+# ¥Ï¥Ã¥·¥å¤ò¥Æ¥¥¹¥È¤ËÊÑ´¹¤¹¤ë¤¿¤á¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¡£
+#===============================================================================
+sub _make_quoted_text {
+ my $hash = shift;
+ my $text = "";
+ foreach my $key (sort(keys(%$hash))){
+ my $value = $hash->{$key};
+
+ $key =~ s/"/""/g;
+ $key =~ s/\\/\\\\/g;
+ $key =~ s/\n/\\n/g;
+ $key =~ s/\r/\\r/g;
+
+ $value =~ s/"/""/g;
+ $value =~ s/\\/\\\\/g;
+ $value =~ s/\n/\\n/g;
+ $value =~ s/\r/\\r/g;
+
+ $text .= qq{"$key"="$value"\n};
+ }
+ return $text;
+}
+
+#===============================================================================
+# <p>
+# °ú¿ô¤ÇÅϤ·¤¿¥Õ¥¡¥¤¥ë¤ò¥í¥Ã¥¯¤·¤Þ¤¹¡£
+# ¥Õ¥¡¥¤¥ëÁàºî½ªÎ»¸å¤Ïɬ¤ºÆ±¤¸¥Õ¥¡¥¤¥ë̾¤ÇUtil::file_unlock¤ò¸Æ¤Ó½Ð¤·¤Æ²¼¤µ¤¤¡£
+# ¥í¥Ã¥¯¤Ë¼ºÇÔ¤·¤¿¾ì¹ç¤Ïdie¤·¤Þ¤¹¡£
+# </p>
+# <pre>
+# Util::file_lock(¥Õ¥¡¥¤¥ë̾, ¥ê¥È¥é¥¤²ó¿ô¡Ê¢â¥¿¥¤¥à¥¢¥¦¥È»þ´Ö¡¢¾Êά²Ä¡Ë);
+# </pre>
+#===============================================================================
+# ¥í¥Ã¥¯¤·¤Æ¤¤¤ë¥Õ¥¡¥¤¥ë¤òµÏ¿¤·¡¢½ªÎ»»þ¤Ë̤²ò½ü¤Î¥í¥Ã¥¯¤ò²ò½ü¤¹¤ëÊݸ±¤ò¤Ä¤±¤¿Êý¤¬Îɤ¤¤«¤âÃΤì¤Ê¤¤¡£
+sub file_lock {
+ my $lock = shift() . ".lock";
+ my $retry = shift || 5;
+# debug("file_lock($$): $lock");
+
+ if(-e $lock){
+ my $mtime = (stat($lock))[9];
+ rmdir($lock) if($mtime < time() - 60);
+ }
+
+ while(!mkdir($lock,0777)){
+ die "Lock is busy." if(--$retry <= 0);
+ sleep(1);
+ }
+}
+
+#===============================================================================
+# <p>
+# °ú¿ô¤ÇÅϤ·¤¿¥Õ¥¡¥¤¥ë¤Î¥í¥Ã¥¯¤ò²ò½ü¤·¤Þ¤¹¡£
+# </p>
+# <pre>
+# Util::file_unlock(¥Õ¥¡¥¤¥ë̾);
+# </pre>
+#===============================================================================
+sub file_unlock {
+ my $lock = shift() . ".lock";
+ rmdir($lock);
+# debug("file_unlock($$): $lock");
+}
+
+#===============================================================================
+# <p>
+# ¥¤¥ó¥é¥¤¥ó¥×¥é¥°¥¤¥ó¤«¤é¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òÊÖ¤¹¾ì¹ç¤Ë»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£
+# </p>
+# <pre>
+# return Util::inline_error('¥×¥í¥¸¥§¥¯¥È̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£');
+# </pre>
+#===============================================================================
+sub inline_error {
+ my $message = shift;
+ my $type = shift;
+
+ if(uc($type) eq "WIKI"){
+ return "<<$message>>";
+ } else {
+ return "<span class=\"error\">".&Util::escapeHTML($message)."</span>";
+ }
+}
+
+#===============================================================================
+# <p>
+# ¥Ñ¥é¥°¥é¥Õ¥×¥é¥°¥¤¥ó¤«¤é¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òÊÖ¤¹¾ì¹ç¤Ë»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£
+# </p>
+# <pre>
+# return Util::paragraph_error('¥×¥í¥¸¥§¥¯¥È̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£');
+# </pre>
+#===============================================================================
+sub paragraph_error {
+ my $message = shift;
+ my $type = shift;
+
+ if(uc($type) eq "WIKI"){
+ return "<<$message>>";
+ } else {
+ return "<p><span class=\"error\">".&Util::escapeHTML($message)."</span></p>";
+ }
+}
+
+
+#===============================================================================
+# <p>
+# »ØÄê¤ÎURL¤ËGET¥ê¥¯¥¨¥¹¥È¤òȯ¹Ô¤·¡¢¥ì¥¹¥Ý¥ó¥¹¤Î¥Ü¥Ç¥£Éô¤òÊֵѤ·¤Þ¤¹¡£
+# ¤³¤Î´Ø¿ô¤ò¸Æ¤Ó½Ð¤·¤¿»þÅÀ¤ÇLWP::UserAgent¤¬use¤µ¤ì¤Þ¤¹¡£
+# </p>
+# <pre>
+# my $response = Util::get_response($wiki,URL);
+# </pre>
+#===============================================================================
+sub get_response {
+ my $wiki = shift;
+ my $url = shift;
+
+ eval("use LWP::UserAgent;");
+ eval("use MIME::Base64;");
+
+ my $ua = LWP::UserAgent->new();
+ my $req = HTTP::Request->new('GET',$url);
+
+ # ¥×¥í¥¥·¤ÎÀßÄê
+ my $proxy_host = $wiki->config('proxy_host');
+ my $proxy_port = $wiki->config('proxy_port');
+ my $proxy_user = $wiki->config('proxy_user');
+ my $proxy_pass = $wiki->config('proxy_pass');
+
+ if($proxy_host ne "" && $proxy_port ne ""){
+ $ua->proxy("http","http://$proxy_host:$proxy_port");
+ if($proxy_user ne "" && $proxy_pass ne ""){
+ $req->header('Proxy-Authorization'=>"Basic ".&MIME::Base64::encode("$proxy_user:$proxy_pass"));
+ }
+ }
+
+ # ¥ê¥¯¥¨¥¹¥È¤òȯ¹Ô
+ my $res = $ua->request($req);
+ return $res->content();
+}
+
+#===============================================================================
+# <p>
+# ¥â¥¸¥å¡¼¥ë̾¤«¤é¥Õ¥¡¥¤¥ë̾¤ò¼èÆÀ¤·¤Þ¤¹¡£
+# Î㤨¤Ðplugin::core::Install¤òÅϤ¹¤Èplugin/core/Install.pm¤¬ÊֵѤµ¤ì¤Þ¤¹¡£
+# </p>
+# <pre>
+# $file = Util::get_module_file(¥â¥¸¥å¡¼¥ë̾);
+# </pre>
+#===============================================================================
+sub get_module_file {
+ return join('/',split(/::/,shift)).'.pm';
+}
+
+#===============================================================================
+# <p>
+# ¥Ç¥Ð¥Ã¥°¥í¥°¡Êdebug.log¡Ë¤ò¥«¥ì¥ó¥È¥Ç¥£¥ì¥¯¥È¥ê¤Ë½ÐÎϤ·¤Þ¤¹¡£
+# Wiki::DEBUG=1¤Î¾ì¹ç¤Î¤ß½ÐÎϤò¹Ô¤¤¤Þ¤¹¡£
+# </p>
+#===============================================================================
+sub debug {
+ my $message = shift;
+ if($Wiki::DEBUG==1){
+ my $date = &Util::format_date(time());
+ my $lock = "debug.log.lock";
+ my $retry = 5;
+ if(-e $lock){
+ my $mtime = (stat($lock))[9];
+ rmdir($lock) if($mtime < time() - 60);
+ }
+
+ while(!mkdir($lock,0777)){
+ die "Lock is busy." if(--$retry <= 0);
+ sleep(1);
+ }
+ open(LOG,">>debug.log");
+ print LOG "$date $message\n";
+ close(LOG);
+ rmdir($lock);
+ }
+}
+
+#===============================================================================
+# <p>
+# Digest::Perl::MD5¤òÍѤ¤¤¿¥Ñ¥¹¥ï¡¼¥É¤Î°Å¹æ²½¤ò¹Ô¤¤¤Þ¤¹¡£
+# Âè°ì°ú¿ô¤Ë¥Ñ¥¹¥ï¡¼¥É¡¢ÂèÆó°ú¿ô¤Ë¥¢¥«¥¦¥ó¥È¤òÅϤ·¤Þ¤¹¡£
+# ¤³¤Î¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤·¤¿»þÅÀ¤ÇDigest::Perl::MD5¤¬use¤µ¤ì¤Þ¤¹¡£
+# </p>
+# <pre>
+# my $md5pass = Util::md5($pass,$account);
+# </pre>
+#===============================================================================
+sub md5 {
+ my $pass = shift;
+ my $salt = shift;
+
+ eval("use Digest::Perl::MD5;");
+
+ my $md5 = Digest::Perl::MD5->new();
+ $md5->add($pass);
+ $md5->add($salt);
+
+ return $md5->hexdigest;
+}
+
+#===============================================================================
+# <p>
+# HTTP¥Ø¥Ã¥À¤ÎContent-Disposition¹Ô¤òÀ¸À®¤·¤Þ¤¹¡£
+# źÉÕ¥Õ¥¡¥¤¥ë¤äPDF¤Ê¤É¤Ë»ÈÍѤ·¤Þ¤¹¡£
+# </p>
+#===============================================================================
+sub make_content_disposition {
+ my ($filename, $disposition) = @_;
+ my $ua = $ENV{"HTTP_USER_AGENT"};
+ my $encoded = ($ua =~ /MSIE/ ? &Jcode::convert($filename, 'sjis') : Jcode->new($filename)->mime_encode(''));
+ return "Content-Disposition: $disposition;filename=\"".$encoded."\"\n\n";
+}
+
+#===============================================================================
+# <p>
+# CGI::Carp¥â¥¸¥å¡¼¥ë¤ÎÂå¤ï¤ê¤Ëdie´Ø¿ô¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£
+# ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òÀ¸À®¤·¤¿¸å¤ËËÜʪ¤Îdie´Ø¿ô¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£
+# </p>
+#===============================================================================
+sub _die {
+ my ($arg,@rest) = @_;
+ $arg = join("", ($arg,@rest));
+ my($pack,$file,$line,$sub) = caller(1);
+ $arg .= " at $file line $line." unless $arg=~/\n$/;
+ CORE::die($arg);
+}
+
+#===============================================================================
+# <p>
+# exit´Ø¿ô¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£
+# </p>
+#===============================================================================
+sub _exit {
+ CORE::die('safe_die');
+}
+
+#===============================================================================
+# <p>
+# die¤Èexit¤Î¥ª¡¼¥Ð¥é¥¤¥ÉÁàºî¤ò²ò½ü¤·¤Þ¤¹¡£
+# </p>
+#===============================================================================
+sub restore_die{
+ our @original_exit_handler;
+ *CORE::GLOBAL::die = $original_exit_handler[0];
+ *CORE::GLOBAL::exit = $original_exit_handler[1];
+}
+
+1;