OSDN Git Service

get_backup_listで日付をフォーマットせずに返却するようにした。
[fswiki/fswiki.git] / lib / Util.pm
index 1baebc1..32b1b1b 100644 (file)
-################################################################################\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
-               '&' => '&amp;',\r
-               '"' => '&quot;',\r
-               '<' => '&lt;',\r
-               '>' => '&gt;',\r
-       );\r
-       $retstr =~ s/([&\"<>])/$table{$1}/go;\r
-       $retstr =~ s/&amp;#([0-9]{1,5});/&#$1;/go;\r
-       $retstr =~ s/&#(0*(0|9|10|13|38|60|62));/&amp;#$1;/g;\r
-#      $retstr =~ s/&amp;([a-zA-Z0-9]{2,8});/&$1;/go;\r
-       return $retstr;\r
-}\r
-\r
-\r
-#===============================================================================\r
-# <p>\r
-#   ÆüÉÕ¤ò&quot;yyyyǯmm·îddÆü hh»þmiʬssÉÃ&quot;·Á¼°¤Ë¥Õ¥©¡¼¥Þ¥Ã¥È¤·¤Þ¤¹¡£\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
-# # &lt;B&gt;¤È&lt;/B&gt;¤òºï½ü¤·¡¢&quot;ʸ»úÎó&quot;¤Î¤ß¼èÆÀ\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, &quot;hoge.dat&quot;);\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, &quot;hoge.dat&quot;);\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 = (
+               '&' => '&amp;',
+               '"' => '&quot;',
+               '<' => '&lt;',
+               '>' => '&gt;',
+       );
+       $retstr =~ s/([&\"<>])/$table{$1}/go;
+       $retstr =~ s/&amp;#([0-9]{1,5});/&#$1;/go;
+       $retstr =~ s/&#(0*(0|9|10|13|38|60|62));/&amp;#$1;/g;
+#      $retstr =~ s/&amp;([a-zA-Z0-9]{2,8});/&$1;/go;
+       return $retstr;
+}
+
+
+#===============================================================================
+# <p>
+#   ÆüÉÕ¤ò&quot;yyyyǯmm·îddÆü hh»þmiʬssÉÃ&quot;·Á¼°¤Ë¥Õ¥©¡¼¥Þ¥Ã¥È¤·¤Þ¤¹¡£
+# </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>";
+# # &lt;B&gt;¤È&lt;/B&gt;¤òºï½ü¤·¡¢&quot;ʸ»úÎó&quot;¤Î¤ß¼èÆÀ
+# 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, &quot;hoge.dat&quot;);
+# </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, &quot;hoge.dat&quot;);
+# </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;