OSDN Git Service

FSWiki3.6.5ベースにコードを変更。
authorkgsoft <kgsoft@871d6764-1e22-0410-b313-a55050885396>
Wed, 11 Apr 2018 08:34:05 +0000 (08:34 +0000)
committerkgsoft <kgsoft@871d6764-1e22-0410-b313-a55050885396>
Wed, 11 Apr 2018 08:34:05 +0000 (08:34 +0000)
edit.cgi
lib/common.pl
lib/setup.pl
plugin/core.pl
wiki.cgi

index d0e6cdb..d70ae53 100644 (file)
--- a/edit.cgi
+++ b/edit.cgi
@@ -13,7 +13,7 @@ if($in{"p"} eq ""){
        $in{"p"} = "FrontPage";
 }
 
-if($in{"p"}=~ /[\|:\[\]]/){
+if(!&Util::check_pagename($in{"p"})){
        &Util::error("¥Ú¡¼¥¸Ì¾¤Ë»ÈÍѤǤ­¤Ê¤¤Ê¸»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£");
 }
 
@@ -36,7 +36,7 @@ if($in{"a"} eq "edit"){
        &attach_delete();
        
 } else {
-       redirect("FrontPage");
+       &Wiki::redirect("FrontPage");
 }
 
 #-------------------------------------------------------------------------------
@@ -50,7 +50,7 @@ sub edit_page {
        
        if($source ne ""){
                $preview = 1;
-       } elsif(&Wiki::exists_page($page)){
+       } elsif(&Wiki::page_exists($page)){
                $source = &Wiki::get_page($page);
                $time   = &Wiki::get_last_modified($page);
        }
@@ -81,10 +81,10 @@ sub edit_page {
        closedir(DIR);
        foreach my $attach (@attachfiles){
                $attach =~ /^\Q$main::ATTACH_DIR\E\/(.+)\.(.+)$/;
-               my $pagename = $1;
-               my $filename = $2;
-               print &Wiki::Plugin::ref(&Util::url_decode($filename));
-               printf ("[<a href=\"$EDIT_SCRIPT?a=delconf&p=%s&f=%s\">ºï½ü</a>]\n",$pagename,$filename);
+               my $pagename = &Util::url_decode($1);
+               my $filename = &Util::url_decode($2);
+               print &Wiki::Plugin::ref($filename);
+               printf("[<a href=\"%s\">ºï½ü</a>]\n",&Wiki::create_url({a=>delconf,p=>$pagename,f=>$filename}));
        }
        
        print "<form action=\"$EDIT_SCRIPT\" method=\"post\" enctype=\"multipart/form-data\">\n";
@@ -124,25 +124,25 @@ sub save_page {
                # ¥Ú¡¼¥¸¤Îºï½ü
                if($source eq ""){
                        # ¹¹¿·¤Î½ÅÊ£¥Á¥§¥Ã¥¯
-                       if(&Wiki::exists_page($page)){
+                       if(&Wiki::page_exists($page)){
                                if($in{"t"} != &Wiki::get_last_modified($page)){
                                        &Util::error("¤³¤Î¥Ú¡¼¥¸¤Ï´û¤Ë¹¹¿·¤µ¤ì¤Æ¤¤¤Þ¤¹¡£");
                                } else {
                                        &Wiki::remove_page($page);
                                }
                        }
-                       &redirect("FrontPage");
+                       &Wiki::redirect("FrontPage");
                        
                # ¥Ú¡¼¥¸¤ÎºîÀ®¤Þ¤¿¤Ï¹¹¿·
                } else {
                        # ¹¹¿·¤Î½ÅÊ£¥Á¥§¥Ã¥¯
-                       if(&Wiki::exists_page($page)){
+                       if(&Wiki::page_exists($page)){
                                if($in{"t"} != &Wiki::get_last_modified($page)){
                                        &Util::error("¤³¤Î¥Ú¡¼¥¸¤Ï´û¤Ë¹¹¿·¤µ¤ì¤Æ¤¤¤Þ¤¹¡£");
                                }
                        }
                        &Wiki::save_page($page,$source);
-                       &redirect($page);
+                       &Wiki::redirect($page);
                }
        }
 }
@@ -172,7 +172,7 @@ sub attach_file {
        print DATA $file;
        close(DATA);
        
-       &redirectURL("$EDIT_SCRIPT?a=edit&p=".&Util::url_encode($page));
+       &Wiki::redirectURL(&Wiki::create_url({a=>edit,p=>$page}));
 }
 
 #-------------------------------------------------------------------------------
@@ -187,10 +187,10 @@ sub attach_delete_confirm {
        }
        
        &print_header("źÉÕ¥Õ¥¡¥¤¥ë¤Îºï½ü");
-       printf ("<p><a href=\"$MAIN_SCRIPT?p=%s\">%s</a>¤«¤é".
-                       "<a href=\"$DOWNLOAD_SCRIPT?p=%s&f=%s\">%s</a>¤òºï½ü¤·¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«¡©</p>\n",
-                       &Util::url_encode($page),&Util::escapeHTML($page),
-                       &Util::url_encode($page),&Util::url_encode($file),&Util::escapeHTML($file));
+       printf ("<p><a href=\"%s\">%s</a>¤«¤é".
+                       "<a href=\"%s\">%s</a>¤òºï½ü¤·¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«¡©</p>\n",
+                       &Wiki::create_url({p=>$page}),&Util::escapeHTML($page),
+                       &Wiki::create_url({p=>$page,f=>$file},$main::DOWNLOAD_SCRIPT),&Util::escapeHTML($file));
        
        print "<form action=\"$EDIT_SCRIPT\" method=\"POST\">\n";
        print "  <input type=\"submit\" name=\"do_delete\" value=\" ºï ½ü \">\n";
@@ -215,5 +215,5 @@ sub attach_delete {
        my $filename = sprintf("$ATTACH_DIR/%s.%s",&Util::url_encode($page),&Util::url_encode($file));
        unlink($filename);
        
-       &redirectURL("$EDIT_SCRIPT?a=edit&p=".&Util::url_encode($page));
+       &Wiki::redirectURL(&Wiki::create_url({a=>edit,p=>$page}));
 }
index 4ea9d2a..586cc5a 100644 (file)
@@ -8,37 +8,6 @@ require "./lib/jcode.pl";
 require "./lib/mimew.pl";
 require "./lib/setup.pl";
 #-------------------------------------------------------------------------------
-# °ú¿ô¤ÇÅϤ·¤¿¥Ú¡¼¥¸¤ËÁ«°Ü
-#-------------------------------------------------------------------------------
-sub redirect {
-       my $page = shift;
-       my $url  = "$MAIN_SCRIPT?p=".&Util::url_encode($page);
-       &redirectURL($url);
-}
-
-#-------------------------------------------------------------------------------
-# °ú¿ô¤ÇÅϤ·¤¿URL¤ËÁ«°Ü
-#-------------------------------------------------------------------------------
-sub redirectURL {
-       my $url  = shift;
-       
-       print "Content-Type: text/html;charset=EUC-JP\n";
-       print "Pragma: no-cache\n";
-       print "Cache-Control: no-cache\n\n";
-       print "<html>\n";
-       print "  <head>\n";
-       print "    <title>moving...</title>\n";
-       print "    <meta http-equiv=\"Refresh\" content=\"0;URL=$url\">\n";
-       print "  </head>\n";
-       print "  <body>\n";
-       print "    Wait or <a href=\"$url\">Click Here!!</a>\n";
-       print "  </body>\n";
-       print "</html>\n";
-       
-       exit;
-}
-
-#-------------------------------------------------------------------------------
 # ¥Ø¥Ã¥À¤òɽ¼¨
 #-------------------------------------------------------------------------------
 sub print_header {
@@ -57,163 +26,220 @@ sub print_header {
        
        print "<div class=\"adminmenu\">\n";
        print "  <span class=\"adminmenu\">\n";
-       print "    <a href=\"$MAIN_SCRIPT?p=FrontPage\">FrontPage</a>\n";
-       print "    <a href=\"$EDIT_SCRIPT?a=new\">¿·µ¬</a>\n";
+       print "    <a href=\"".&Wiki::create_url({p=>"FrontPage"})."\">FrontPage</a>\n";
+       print "    <a href=\"".&Wiki::create_url({a=>"new"})."\">¿·µ¬</a>\n";
        if($show==1){
-               print "    <a href=\"$EDIT_SCRIPT?a=edit&p=".&Util::url_encode($in{"p"})."\">ÊÔ½¸</a>\n";
+               print "    <a href=\"".&Wiki::create_url({a=>"edit",p=>$in{"p"}})."\">ÊÔ½¸</a>\n";
        }
-       print "    <a href=\"$MAIN_SCRIPT?a=search\">¸¡º÷</a>\n";
-       print "    <a href=\"$MAIN_SCRIPT?a=list\">°ìÍ÷</a>\n";
-       print "    <a href=\"$MAIN_SCRIPT?p=Help\">¥Ø¥ë¥×</a>\n";
+       print "    <a href=\"".&Wiki::create_url({a=>"search"})."\">¸¡º÷</a>\n";
+       print "    <a href=\"".&Wiki::create_url({a=>"list"})."\">°ìÍ÷</a>\n";
+       print "    <a href=\"".&Wiki::create_url({p=>"Help"})."\">¥Ø¥ë¥×</a>\n";
        print "  </span>\n";
        print "</div>\n";
        
        print "<h1>".&Util::escapeHTML($title)."</h1>\n";
-       if(&Wiki::exists_page("Menu")){
+       if(&Wiki::page_exists("Menu")){
                print "<div class=\"main\">\n";
        }
-       
 }
 
 #-------------------------------------------------------------------------------
 # ¥Õ¥Ã¥¿¤òɽ¼¨
 #-------------------------------------------------------------------------------
 sub print_footer {
-       if(&Wiki::exists_page("Menu")){
+       if(&Wiki::page_exists("Menu")){
                print "</div>\n";
                print "<div class=\"sidebar\">\n";
                print &Wiki::process_wiki(&Wiki::get_page("Menu"));
                print "</div>\n";
        }
-       print "<div class=\"footer\">Powered by <a href=\"$main::SITE_URL\">FreeStyleWikiLite $main::VERSION</a></div>\n";
+       print "<div class=\"footer\">Powered by <a href=\"".$main::SITE_URL."\">FreeStyleWikiLite ".$main::VERSION."</a></div>\n";
        print "</body></html>\n";
 }
 
+#-------------------------------------------------------------------------------
+# µìVer(0.0.11)¸ß´¹À­°Ý»ý
+# ¼¡´ü¥Ð¡¼¥¸¥ç¥ó¤Çºï½ü¤µ¤ì¤Þ¤¹¡£
+#-------------------------------------------------------------------------------
+sub redirect { return &Wiki::redirect($@); }
+sub redirectURL { return &Wiki::redirectURL($@); }
+
+package Wiki;
+sub exists_page { return &page_exists(shift); }
+sub send_mail { return &Util::send_mail($@); }
+
+package HTMLParser;
+
+package Util;
+sub parse_plugin { return &Wiki::parse_inline_plugin($@); }
+
 ###############################################################################
 #
 # Wiki´ØÏ¢¤Î´Ø¿ô¤òÄ󶡤¹¤ë¥Ñ¥Ã¥±¡¼¥¸
 #
 ###############################################################################
 package Wiki;
-#-------------------------------------------------------------------------------
-# ¥Ú¡¼¥¸¤ò¼èÆÀ
-#-------------------------------------------------------------------------------
-sub get_page {
-       my $page = &Util::url_encode(shift);
-       
-       open(DATA,"$main::DATA_DIR/$page.wiki") or &Util::error("$main::DATA_DIR/$page.wiki¤Î¥ª¡¼¥×¥ó¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£");
-       my $content = "";
-       while(<DATA>){
-               $content .= $_;
-       }
-       close(DATA);
-       
-       return $content;
+
+local @current_parser = [];
+
+#==============================================================================
+# ¥×¥é¥°¥¤¥ó¤Î¾ðÊó¤ò¼èÆÀ¤·¤Þ¤¹
+#==============================================================================
+sub get_plugin_info {
+       my $name = shift;
+       return defined($main::P_PLUGIN->{$name}) ? {FUNCTION=>$main::P_PLUGIN->{$name}, TYPE=>'paragraph'} :
+              defined($main::I_PLUGIN->{$name}) ? {FUNCTION=>$main::I_PLUGIN->{$name}, TYPE=>'inline'   } :
+              defined($main::B_PLUGIN->{$name}) ? {FUNCTION=>$main::B_PLUGIN->{$name}, TYPE=>'block'    } :
+              {};
 }
-#-------------------------------------------------------------------------------
-# ¥Ú¡¼¥¸¤òÊݸ
-#-------------------------------------------------------------------------------
-sub save_page {
-       my $page   = shift;
-       my $source = shift;
+
+#==============================================================================
+# Wiki¥½¡¼¥¹¤òÅϤ·¤ÆHTML¤ò¼èÆÀ¤·¤Þ¤¹
+#==============================================================================
+sub process_wiki {
+       my $source  = shift;
+       my $mainflg = shift;
+       my $parser  = HTMLParser->new($mainflg);
        
-       $page = &Util::trim($page);
-       $source =~ s/\r\n/\n/g;
-       $source =~ s/\r/\n/g;
+       # Î¢µ»ÍÑ(¥×¥é¥°¥¤¥óÆâÉô¤«¤é¥Ñ¡¼¥µ¤ò»È¤¦¾ì¹ç)
+       push(@current_parser, $parser);
        
-       my $enc_page = &Util::url_encode($page);
-       my $action   = 'MODIFY';
-       unless(-e "$main::DATA_DIR/$enc_page.wiki"){
-               $action = 'CREATE';
-       }
-       
-       # ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤òºîÀ®
-       if(-e "$main::DATA_DIR/$enc_page.wiki"){
-               open(BACKUP,">$main::BACKUP_DIR/$enc_page.bak") or &Util::error("$main::BACKUP_DIR/$enc_page.bak¤Î¥ª¡¼¥×¥ó¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£");
-               open(DATA  ,"$main::DATA_DIR/$enc_page.wiki")   or &Util::error("$main::DATA_DIR/$enc_page.wiki¤Î¥ª¡¼¥×¥ó¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£");
-               while(<DATA>){
-                       print BACKUP $_;
-               }
-               close(DATA);
-               close(BACKUP);
-       }
+       $parser->parse($source);
        
-       # ÆþÎÏÆâÍƤòÊݸ
-       open(DATA,">$main::DATA_DIR/$enc_page.wiki") or &Util::error("$main::DATA_DIR/$enc_page.wiki¤Î¥ª¡¼¥×¥ó¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£");
-       print DATA $source;
-       close(DATA);
+       # ¥Ñ¡¼¥µ¤Î»²¾È¤ò²òÊü
+       pop(@current_parser);
        
-       &send_mail($action,$page);
+       return $parser->{html};
 }
-#-------------------------------------------------------------------------------
-# ¥Ú¡¼¥¸¤òºï½ü
-#-------------------------------------------------------------------------------
-sub remove_page {
-       my $page     = shift;
-       my $enc_page = &Util::url_encode($page);
-       unlink("$main::DATA_DIR/$enc_page.wiki") or &Util::error("$main::DATA_DIR/$enc_page.wiki¤Îºï½ü¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£");
-       
-       &send_mail('DELETE',$page);
+
+#==============================================================================
+# ¥Ñ¡¼¥¹Ãæ¤Î¾ì¹ç¡¢¸½ºßÍ­¸ú¤ÊHTMLParser¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÊֵѤ·¤Þ¤¹¡£
+# ¥Ñ¡¼¥¹Ãæ¤ÎÆâÍƤò¥×¥é¥°¥¤¥ó¤«¤éÊѹ¹¤·¤¿¤¤¾ì¹ç¤Ë»ÈÍѤ·¤Þ¤¹¡£
+#==============================================================================
+sub get_current_parser {
+       return $current_parser[$#current_parser];
 }
-#-------------------------------------------------------------------------------
-# ¥á¡¼¥ëÁ÷¿®
-#-------------------------------------------------------------------------------
-sub send_mail {
-       my $action   = shift;
-       my $page     = shift;
-       my $enc_page = &Util::url_encode($page);
-       
-       if($main::ADMIN_MAIL eq "" || $main::SEND_MAIL eq ""){
-               return;
-       }
-       
-       my $subject = "";
-       if($action eq 'CREATE'){
-               $subject = "[FSWikiLite]$page¤¬ºîÀ®¤µ¤ì¤Þ¤·¤¿";
-               
-       } elsif($action eq 'MODIFY'){
-               $subject = "[FSWikiLite]$page¤¬¹¹¿·¤µ¤ì¤Þ¤·¤¿";
-               
-       } elsif($action eq 'DELETE'){
-               $subject = "[FSWikiLite]$page¤¬ºï½ü¤µ¤ì¤Þ¤·¤¿";
+
+#===============================================================================
+# ¥¤¥ó¥é¥¤¥ó¥×¥é¥°¥¤¥ó¤ò¥Ñ¡¼¥¹¤·¤Æ¥³¥Þ¥ó¥É¤È°ú¿ô¤Ëʬ³ä
+#===============================================================================
+sub parse_inline_plugin {
+       my $text = shift;
+       my ($cmd, @args_tmp) = split(/ /,$text);
+       my $args_txt = &Util::trim(join(" ",@args_tmp));
+       if($cmd =~ s/\}\}(.*?)$//){
+               return { command=>$cmd, args=>[], post=>"$1 $args_txt"};
        }
        
-       # MIME¥¨¥ó¥³¡¼¥É
-       $subject = &main::mimeencode($subject);
-       
-       my $head = "Subject: $subject\n".
-                  "From: $main::ADMIN_MAIL\n".
-                  "Content-Transfer-Encoding: 7bit\n".
-                  "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n".
-                  "Reply-To: $main::ADMIN_MAIL\n".
-                  "\n";
-       
-       my $body = "IP:".$ENV{'REMOTE_ADDR'}."\n".
-                  "UA:".$ENV{'HTTP_USER_AGENT'}."\n";
+       my @ret_args;
+       my $tmp    = "";
+       my $escape = 0;
+       my $quote  = 0;
+       my $i      = 0;
        
-       if($action eq 'MODIFY' || $action eq 'DELETE'){
-               if(-e "$main::BACKUP_DIR/$enc_page.bak"){
-                       $body .= "°Ê²¼¤ÏÊѹ¹Á°¤Î¥½¡¼¥¹¤Ç¤¹¡£\n".
-                                "-----------------------------------------------------\n";
-                       open(BACKUP,"$main::BACKUP_DIR/$enc_page.bak");
-                       while(my $line = <BACKUP>){
-                               $body .= $line;
+       for($i = 0; $i<length($args_txt); $i++){
+               my $c = substr($args_txt,$i,1);
+               if($quote!=1 && $c eq ","){
+                       if($quote==3){
+                               $tmp .= '}';
                        }
-                       close(BACKUP);
+                       push(@ret_args,$tmp);
+                       $tmp = "";
+                       $quote = 0;
+               } elsif($quote==1 && $c eq "\\"){
+                       if($escape==0){
+                               $escape = 1;
+                       } else {
+                               $tmp .= $c;
+                               $escape = 0;
+                       }
+               } elsif($quote==0 && $c eq '"'){
+                       if($tmp eq ""){
+                               $quote = 1;
+                       } else {
+                               $tmp .= $c;
+                       }
+               } elsif($quote==1 && $c eq '"'){
+                       if($escape==1){
+                               $tmp .= $c;
+                               $escape = 0;
+                       } else {
+                               $quote = 2;
+                       }
+               } elsif(($quote==0 || $quote==2) && $c eq '}'){
+                       $quote = 3;
+               } elsif($quote==3){
+                       if($c eq '}'){
+                               last;
+                       } else {
+                               $tmp .= '}'.$c;
+                               $quote = 0;
+                       }
+               } elsif($quote==2){
+                       return {error=>"¥¤¥ó¥é¥¤¥ó¥×¥é¥°¥¤¥ó¤Î¹½Ê¸¤¬ÉÔÀµ¤Ç¤¹¡£"};
+               } else {
+                       $tmp .= $c;
+                       $escape = 0;
                }
        }
        
-       # Ê¸»ú¥³¡¼¥É¤ÎÊÑ´¹(jcode.pl¤ò»ÈÍѤ¹¤ë)
-       &jcode::convert(\$body,'jis');
+       if($quote!=3){
+               my $info = &Wiki::get_plugin_info($cmd);
+               return undef if (defined($info->{TYPE}) && $info->{TYPE} ne 'block');
+       }
        
-       open(MAIL,"| $main::SEND_MAIL $main::ADMIN_MAIL");
-       print MAIL $head;
-       print MAIL $body;
-       close(MAIL);
+       if($tmp ne ""){
+               push(@ret_args,$tmp);
+       }
+       
+       return { command=>$cmd, args=>\@ret_args, 
+               post=>substr($args_txt, $i + 1, length($args_txt) - $i)};
 }
-#-------------------------------------------------------------------------------
+
+#==============================================================================
+# ¥Ú¡¼¥¸É½¼¨¤ÎURL¤òÀ¸À®
+#==============================================================================
+sub create_page_url {
+       my $page = shift;
+       return create_url({p=>$page});
+}
+
+#==============================================================================
+# Ç¤°Õ¤ÎURL¤òÀ¸À®
+#==============================================================================
+sub create_url {
+       my $params = shift;
+       my $script = shift;
+       my $url    = '';
+       my $query  = '';
+       my $action = '';
+       foreach my $key (keys(%$params)){
+               my $val = $params->{$key};
+               if ($key eq 'a') {
+                       $action = $val;
+               }
+               if($query ne ''){
+                       $query .= '&amp;';
+               }
+               $query .= Util::url_encode($key)."=".Util::url_encode($val);
+       }
+       if(!defined($script)){
+               if ($action =~ /^(edit|new|delconf)$/){
+                       $script = $main::EDIT_SCRIPT;
+               }else{
+                       $script = $main::MAIN_SCRIPT;
+               }
+       }
+       $url = $script;
+       if($query ne ''){
+               $url .= '?'.$query; 
+       }
+       return $url;
+}
+
+#==============================================================================
 # ¥Ú¡¼¥¸¤Î°ìÍ÷¤ò¼èÆÀ
-#-------------------------------------------------------------------------------
+#==============================================================================
 sub get_page_list {
        opendir(DIR, $main::DATA_DIR);
        my ($fileentry, @files);
@@ -240,12 +266,12 @@ sub get_page_list {
        return @pages;
 }
 
-#-------------------------------------------------------------------------------
+#==============================================================================
 # ¥Ú¡¼¥¸¤Î¹¹¿·Æü»þ¤ò¼èÆÀ
-#-------------------------------------------------------------------------------
+#==============================================================================
 sub get_last_modified {
        my $page = shift;
-       if(&exists_page($page)){
+       if(&page_exists($page)){
                my $file = sprintf("%s/%s.wiki",$main::DATA_DIR,&Util::url_encode($page));
                my @stat = stat($file);
                return $stat[9];
@@ -254,10 +280,61 @@ sub get_last_modified {
        }
 }
 
-#-------------------------------------------------------------------------------
+#==============================================================================
+# ¥Ú¡¼¥¸¤ò¼èÆÀ
+#==============================================================================
+sub get_page {
+       my $page = &Util::url_encode(shift);
+       
+       open(DATA,"$main::DATA_DIR/$page.wiki") or &Util::error("$main::DATA_DIR/$page.wiki¤Î¥ª¡¼¥×¥ó¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£");
+       my $content = "";
+       while(<DATA>){
+               $content .= $_;
+       }
+       close(DATA);
+       
+       return $content;
+}
+#==============================================================================
+# ¥Ú¡¼¥¸¤òÊݸ
+#==============================================================================
+sub save_page {
+       my $page   = shift;
+       my $source = shift;
+       
+       $page = &Util::trim($page);
+       $source =~ s/\r\n/\n/g;
+       $source =~ s/\r/\n/g;
+       
+       my $enc_page = &Util::url_encode($page);
+       my $action   = 'MODIFY';
+       unless(-e "$main::DATA_DIR/$enc_page.wiki"){
+               $action = 'CREATE';
+       }
+       
+       # ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Õ¥¡¥¤¥ë¤òºîÀ®
+       if(-e "$main::DATA_DIR/$enc_page.wiki"){
+               open(BACKUP,">$main::BACKUP_DIR/$enc_page.bak") or &Util::error("$main::BACKUP_DIR/$enc_page.bak¤Î¥ª¡¼¥×¥ó¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£");
+               open(DATA  ,"$main::DATA_DIR/$enc_page.wiki")   or &Util::error("$main::DATA_DIR/$enc_page.wiki¤Î¥ª¡¼¥×¥ó¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£");
+               while(<DATA>){
+                       print BACKUP $_;
+               }
+               close(DATA);
+               close(BACKUP);
+       }
+       
+       # ÆþÎÏÆâÍƤòÊݸ
+       open(DATA,">$main::DATA_DIR/$enc_page.wiki") or &Util::error("$main::DATA_DIR/$enc_page.wiki¤Î¥ª¡¼¥×¥ó¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£");
+       print DATA $source;
+       close(DATA);
+       
+       &Util::send_mail($action,$page);
+}
+
+#==============================================================================
 # ¥Ú¡¼¥¸¤¬Â¸ºß¤¹¤ë¤«¤É¤¦¤«
-#-------------------------------------------------------------------------------
-sub exists_page {
+#==============================================================================
+sub page_exists {
        my $page = &Util::url_encode(shift);
        if(-e "$main::DATA_DIR/$page.wiki"){
                return 1;
@@ -266,16 +343,46 @@ sub exists_page {
        }
 }
 
-#-------------------------------------------------------------------------------
-# Wiki¥½¡¼¥¹¤òÅϤ·¤ÆHTML¤ò¼èÆÀ¤·¤Þ¤¹
-#-------------------------------------------------------------------------------
-sub process_wiki {
-       my $source = shift;
-       my $main   = shift;
-       my $parser = HTMLParser->new($main);
-       $parser->parse($source);
+#==============================================================================
+# °ú¿ô¤ÇÅϤ·¤¿¥Ú¡¼¥¸¤ËÁ«°Ü
+#==============================================================================
+sub redirect {
+       my $page = shift;
+       my $url  = &Wiki::create_url({p=>$page});
+       &redirectURL($url);
+}
+
+#==============================================================================
+# °ú¿ô¤ÇÅϤ·¤¿URL¤ËÁ«°Ü
+#==============================================================================
+sub redirectURL {
+       my $url  = shift;
        
-       return $parser->{html};
+       print "Content-Type: text/html;charset=EUC-JP\n";
+       print "Pragma: no-cache\n";
+       print "Cache-Control: no-cache\n\n";
+       print "<html>\n";
+       print "  <head>\n";
+       print "    <title>moving...</title>\n";
+       print "    <meta http-equiv=\"Refresh\" content=\"0;URL=$url\">\n";
+       print "  </head>\n";
+       print "  <body>\n";
+       print "    Wait or <a href=\"$url\">Click Here!!</a>\n";
+       print "  </body>\n";
+       print "</html>\n";
+       
+       exit;
+}
+
+#==============================================================================
+# ¥Ú¡¼¥¸¤òºï½ü
+#==============================================================================
+sub remove_page {
+       my $page     = shift;
+       my $enc_page = &Util::url_encode($page);
+       unlink("$main::DATA_DIR/$enc_page.wiki") or &Util::error("$main::DATA_DIR/$enc_page.wiki¤Îºï½ü¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£");
+       
+       &Util::send_mail('DELETE',$page);
 }
 
 ###############################################################################
@@ -294,14 +401,18 @@ sub new {
        
        if(!defined($mainflg) || $mainflg eq ""){ $mainflg = 0; }
        
+       $self->{dl_flag} = 0;
+       $self->{dt} = "";
+       $self->{dd} = "";
+       
        $self->{html}  = "";
        $self->{pre}   = "";
        $self->{quote} = "";
        $self->{table} = 0;
        $self->{level} = 0;
+       $self->{list}  = 0;
        $self->{para}  = 0;
        $self->{p_cnt} = 0;
-       $self->{explan} = 0;
        $self->{main}  = $mainflg;
        return bless $self,$class;
 }
@@ -313,7 +424,9 @@ sub parse {
        my $self   = shift;
        my $source = shift;
        
+       $self->start_parse;
        $source =~ s/\r//g;
+       
        my @lines = split(/\n/,$source);
        
        foreach my $line (@lines){
@@ -327,20 +440,63 @@ sub parse {
                my $word3 = substr($line,0,3);
                
                # ¶õ¹Ô
-               if($line eq ""){
+               if($line eq "" && !$self->{block}){
                        $self->l_paragraph();
                        next;
                }
                
+               # ¥Ö¥í¥Ã¥¯½ñ¼°¤Î¥¨¥¹¥±¡¼¥×
+               if($word2 eq "\\\\" || $word1 eq "\\"){
+                       my @obj = $self->parse_line(substr($line, 1));
+                       $self->l_text(\@obj);
+                       next;
+               }
+               
                # ¥Ñ¥é¥°¥é¥Õ¥×¥é¥°¥¤¥ó
-               if($line =~ /^{{((.|\s)+?)}}$/){
-                       my $plugin = &Util::parse_plugin($1);
-                       my $class  = $main::P_PLUGIN->{$plugin->{command}};
-                       if(defined($class)){
+               if($line =~ /^\{\{(.+\}\})$/){
+                       if(!$self->{block}){
+                               my $plugin = &Wiki::parse_inline_plugin($1);
+                               my $info   = &Wiki::get_plugin_info($plugin->{command});
+                               if($info->{TYPE} eq "paragraph"){
+                                       $self->l_plugin($plugin);
+                               } else {
+                                       my @obj = $self->parse_line($line);
+                                       $self->l_text(\@obj);
+                               }
+                               next;
+                       }
+               } elsif($line =~ /^\{\{(.+)$/){
+                       if ($self->{block}) {
+                               my $plugin = &Wiki::parse_inline_plugin($1);
+                               my $info   = &Wiki::get_plugin_info($plugin->{command});
+                               $self->{block}->{level}++ if($info->{TYPE} eq "block");
+                               $self->{block}->{args}->[0] .= $line."\n";
+                               next;
+                       }
+                       my $plugin = &Wiki::parse_inline_plugin($1);
+                       my $info   = &Wiki::get_plugin_info($plugin->{command});
+                       if($info->{TYPE} eq "block"){
+                               unshift(@{$plugin->{args}}, "");
+                               $self->{block} = $plugin;
+                               $self->{block}->{level} = 0;
+                       } else {
+                               my @obj = $self->parse_line($line);
+                               $self->l_text(\@obj);
+                       }
+                       next;
+               }
+               if($self->{block}){
+                       if($line eq "}}"){
+                               if ($self->{block}->{level} > 0) {
+                                       $self->{block}->{level}--;
+                                       $self->{block}->{args}->[0] .= $line."\n";
+                                       next;
+                               }
+                               my $plugin = $self->{block};
+                               delete($self->{block});
                                $self->l_plugin($plugin);
                        } else {
-                               my @obj = $self->parse_line($line);
-                               $self->l_text(\@obj);
+                               $self->{block}->{args}->[0] .= $line."\n";
                        }
                        next;
                }
@@ -403,10 +559,10 @@ sub parse {
                                $self->{dd} .= substr($line,3);
                                next;
                        }
+                       if($self->{dt} ne "" || $self->{dd} ne ""){
+                               $self->multi_explanation;
+                       }
                        if(index($line,"::")==0){
-                               if($self->{dt} ne "" || $self->{dd} ne ""){
-                                       $self->multi_explanation;
-                               }
                                $self->{dt} = substr($line,2);
                                $self->{dl_flag} = 1;
                                next;
@@ -423,7 +579,7 @@ sub parse {
                                $line .= " ";
                        }
                        my @spl = map {/^"(.*)"$/ ? scalar($_ = $1, s/\"\"/\"/g, $_) : $_}
-                                     ($line =~ /,\s*(\"[^\"]*(?:\"\"[^\"]*)*\"|[^,]*)/g);
+                                                 ($line =~ /,\s*(\"[^\"]*(?:\"\"[^\"]*)*\"|[^,]*)/g);
                        my @array;
                        foreach my $value (@spl){
                                my @cell = $self->parse_line($value);
@@ -444,6 +600,13 @@ sub parse {
        # Ê£¿ô¹Ô¤ÎÀâÌÀ
        $self->multi_explanation;
        
+       # ¥Ñ¡¼¥¹Ãæ¤Î¥Ö¥í¥Ã¥¯¥×¥é¥°¥¤¥ó¤¬¤¢¤Ã¤¿¾ì¹ç¡¢¤È¤ê¤¢¤¨¤ºÉ¾²Á¤·¤Æ¤ª¤¯¡©
+       if($self->{block}){
+               my $plugin = $self->{block};
+               delete($self->{block});
+               $self->l_plugin($plugin);
+       }
+       
        $self->end_parse;
 }
 
@@ -467,121 +630,222 @@ sub multi_explanation {
 # £±¹Ôʬ¤ò¥Ñ¡¼¥¹
 #===============================================================================
 sub parse_line {
-       my $self   = shift;
-       my $source = shift;
-       my @array  = ();
-       
-       # ¥×¥é¥°¥¤¥ó
-       if($source =~ /{{((.|\s)+?)}}/){
-               my $pre  = $`;
-               my $post = $';
-               if($pre ne ""){ push(@array,$self->parse_line($pre)); }
-               my $plugin = &Util::parse_plugin($1);
-               my $class  = $main::I_PLUGIN->{$plugin->{command}};
-               if(defined($class)){
-                       push @array,$self->plugin($plugin);
-               } else {
-                       push @array,$self->text("{{$1}}");
+       my ($self, $source) = @_;
+
+       return () if (not defined $source);
+
+       my @array = ();
+       my $pre   = q{};
+       my @parsed = ();
+
+       # $source ¤¬¶õ¤Ë¤Ê¤ë¤Þ¤Ç·«¤êÊÖ¤¹¡£
+       SOURCE:
+       while ($source ne q{}) {
+
+               # ¤É¤Î¥¤¥ó¥é¥¤¥ó Wiki ½ñ¼°¤ÎÀèƬ¤Ë¤â match ¤·¤Ê¤¤¾ì¹ç
+               if (!($source =~ /^(.*?)((?:\{\{|\[\[?|https?:|mailto:|f(?:tp:|ile:)|'''?|==|__|<<).*)$/)) {
+                       # WikiName¸¡º÷¡¦ÃÖ´¹½èÍý¤Î¤ß¼Â»Ü¤·¤Æ½ªÎ»¤¹¤ë
+                       push @array, $self->_parse_line_wikiname($pre . $source);
+                       return @array;
                }
-               if($post ne ""){ push(@array,$self->parse_line($post)); }
-               
-       # ¥Ü¡¼¥ë¥É¡¢¥¤¥¿¥ê¥Ã¥¯¡¢¼è¤ê¾Ã¤·Àþ¡¢²¼Àþ
-       } elsif($source =~ /((''')|('')|(==)|(__))(.+?)(\1)/){
-               my $pre   = $`;
-               my $post  = $';
-               my $type  = $1;
-               my $label = $6;
-               if($pre ne ""){ push(@array,$self->parse_line($pre)); }
-               if($type eq "'''"){
-                       push @array,$self->bold($label);
-               } elsif($type eq "__"){
-                       push @array,$self->underline($label);
-               } elsif($type eq "''"){
-                       push @array,$self->italic($label);
-               } elsif($type eq "=="){
-                       push @array,$self->denialline($label);
+
+               $pre   .= $1;   # match ¤·¤Ê¤«¤Ã¤¿ÀèƬÉôʬ¤Ïί¤á¤Æ¤ª¤¤¤Æ¸å¤Ç½èÍý¤¹¤ë
+               $source = $2;   # match Éôʬ¤Ï¸å³½èÍý¤Ë¤Æ¾ÜºÙ¥Á¥§¥Ã¥¯¤ò¹Ô¤¦
+               @parsed = ();
+
+               # ¥×¥é¥°¥¤¥ó
+               if ($source =~ /^\{\{/) {
+                       $source = $';
+                       my $plugin = &Wiki::parse_inline_plugin($source);
+                       unless($plugin){
+                               push @parsed, '{{';
+                               push @parsed, $self->parse_line($source);
+                       } else {
+                               my $info = &Wiki::get_plugin_info($plugin->{command});
+                               if($info->{TYPE} eq "inline"){
+                                       push @parsed, $self->plugin($plugin);
+                               } else {
+                                       push @parsed, $self->parse_line("<<".$plugin->{command}."¥×¥é¥°¥¤¥ó¤Ï¸ºß¤·¤Þ¤»¤ó¡£>>");
+                               }
+                               if ($source ne "") {
+                                       $source = $plugin->{post};
+                               }
+                       }
                }
-               if($post ne ""){ push(@array,$self->parse_line($post)); }
-               
-       # ¥Ú¡¼¥¸ÊÌ̾¥ê¥ó¥¯
-       } elsif($source =~ /\[\[([^\[]+?)\|(.+?)\]\]/){
-               my $pre   = $`;
-               my $post  = $';
-               my $label = $1;
-               my $page  = $2;
-               if($pre ne ""){ push(@array,$self->parse_line($pre)); }
-               push @array,$self->wiki_anchor($page,$label);
-               if($post ne ""){ push(@array,$self->parse_line($post)); }
-
-       # URLÊÌ̾¥ê¥ó¥¯
-       } elsif($source =~ /\[([^\[]+?)\|((http|https|ftp|mailto):[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!\$&=:;\*#\@']*)\]/
-           ||  $source =~ /\[([^\[]+?)\|(file:[^\[\]]*)\]/
-           ||  $source =~ /\[([^\[]+?)\|((\/|\.\/|\.\.\/)+[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!\$&=:;\*#\@']*)\]/){
-               my $pre   = $`;
-               my $post  = $';
-               my $label = $1;
-               my $url   = $2;
-               if($pre ne ""){ push(@array,$self->parse_line($pre)); }
-               if(index($url,'"') >= 0 || index($url,'><') >= 0 || index($url, 'javascript:') >= 0){
-                       push @array,"<span class=\"error\">ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£</span>";
-               } else {
-                       push @array,$self->url_anchor($url,$label);
+
+               # ¥Ú¡¼¥¸ÊÌ̾¥ê¥ó¥¯
+               elsif ($source =~ /^\[\[([^\[]+?)\|([^\|\[]+?)\]\]/) {
+                       my $label = $1;
+                       my $page  = $2;
+                       $source = $';
+                       push @parsed, $self->wiki_anchor($page, $label);
                }
-               if($post ne ""){ push(@array,$self->parse_line($post)); }
-               
-       # URL¥ê¥ó¥¯
-       } elsif($source =~ /(http|https|ftp|mailto):[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!\$&=:;\*#\@']*/
-           ||  $source =~ /\[([^\[]+?)\|(file:[^\[\]]*)\]/){
-               my $pre   = $`;
-               my $post  = $';
-               my $url = $&;
-               if($pre ne ""){ push(@array,$self->parse_line($pre)); }
-               if(index($url,'"') >= 0 || index($url,'><') >= 0 || index($url, 'javascript:') >= 0){
-                       push @array,"<span class=\"error\">ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£</span>";
-               } else {
-                       push @array,$self->url_anchor($url);
+
+               # URLÊÌ̾¥ê¥ó¥¯
+               elsif ($source
+                       =~ /^\[([^\[]+?)\|((?:http|https|ftp|mailto):[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!&=:;\*#\@'\$]*)\]/
+                       || $source =~ /^\[([^\[]+?)\|(file:[^\[\]]*)\]/
+                       || $source
+                       =~ /^\[([^\[]+?)\|((?:\/|\.\/|\.\.\/)+[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!&=:;\*#\@'\$]*)\]/
+                       )
+               {
+                       my $label = $1;
+                       my $url   = $2;
+                       $source = $';
+                       if (   index($url, q{"}) >= 0
+                               || index($url, '><') >= 0
+                               || index($url, 'javascript:') >= 0)
+                       {
+                               push @parsed, $self->parse_line('<<ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£>>');
+                       }
+                       else {
+                               push @parsed, $self->url_anchor($url, $label);
+                       }
                }
-               if($post ne ""){ push(@array,$self->parse_line($post)); }
-               
-       # ¥Ú¡¼¥¸¥ê¥ó¥¯
-       } elsif($source =~ /\[\[([^\|]+?)\]\]/){
-               my $pre   = $`;
-               my $post  = $';
-               my $page = $1;
-               if($pre ne ""){ push(@array,$self->parse_line($pre)); }
-               push @array,$self->wiki_anchor($page);
-               if($post ne ""){ push(@array,$self->parse_line($post)); }
-
-       # Ç¤°Õ¤ÎURL¥ê¥ó¥¯
-       } elsif($source =~ /\[([^\[]+?)\|(.+?)\]/){
-               my $pre   = $`;
-               my $post  = $';
-               my $label = $1;
-               my $url   = $2;
-               if($pre ne ""){ push(@array,$self->parse_line($pre)); }
-               if(index($url,'"') >= 0 || index($url,'><') >= 0 || index($url, 'javascript:') >= 0){
-                       push @array,"<span class=\"error\">ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£</span>";
-               } else {
-                       push @array,$self->url_anchor($url,$label);
+
+               # URL¥ê¥ó¥¯
+               elsif ($source
+                       =~ /^(?:https?|ftp|mailto):[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!&=:;\*#\@'\$]*/
+                       || $source =~ /^file:[^\[\]]*/)
+               {
+                       my $url = $&;
+                       $source = $';
+                       if (   index($url, q{"}) >= 0
+                               || index($url, '><') >= 0
+                               || index($url, 'javascript:') >= 0)
+                       {
+                               push @parsed, $self->parse_line('<<ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£>>');
+                       }
+                       else {
+                               push @parsed, $self->url_anchor($url);
+                       }
+               }
+
+               # ¥Ú¡¼¥¸¥ê¥ó¥¯
+               elsif ($source =~ /^\[\[([^\|]+?)\]\]/) {
+                       my $page = $1;
+                       $source = $';
+                       push @parsed, $self->wiki_anchor($page);
+               }
+
+               # Ç¤°Õ¤ÎURL¥ê¥ó¥¯
+               elsif ($source =~ /^\[([^\[]+?)\|(.+?)\]/) {
+                       my $label = $1;
+                       my $url   = $2;
+                       $source = $';
+                       if (   index($url, q{"}) >= 0
+                               || index($url, '><') >= 0
+                               || index($url, 'javascript:') >= 0)
+                       {
+                               push @parsed, $self->parse_line('<<ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£>>');
+                       }
+                       else {
+                               # URI¤òºîÀ®
+                               my $uri  = &main::MyBaseUrl().$ENV{"PATH_INFO"};
+                               push @parsed, $self->url_anchor($uri . '/../' . $url, $label);
+                       }
+               }
+
+               # ¥Ü¡¼¥ë¥É¡¢¥¤¥¿¥ê¥Ã¥¯¡¢¼è¤ê¾Ã¤·Àþ¡¢²¼Àþ
+               elsif ($source =~ /^('''?|==|__)(.+?)\1/) {
+                       my $type  = $1;
+                       my $label = $2;
+                       $source = $';
+                       if ($type eq q{'''}) {
+                               push @parsed, $self->bold($label);
+                       }
+                       elsif ($type eq q{__}) {
+                               push @parsed, $self->underline($label);
+                       }
+                       elsif ($type eq q{''}) {
+                               push @parsed, $self->italic($label);
+                       }
+                       else {                                                     ## elsif ($type eq q{==}) {
+                               push @parsed, $self->denialline($label);
+                       }
+               }
+
+               # ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸
+               elsif ($source =~ /^<<(.+?)>>/) {
+                       my $label = $1;
+                       $source = $';
+                       push @parsed, $self->error($label);
+               }
+
+               # ¥¤¥ó¥é¥¤¥ó Wiki ½ñ¼°Á´ÂΤˤϠmacth ¤·¤Ê¤«¤Ã¤¿¤È¤­
+               else {
+                       # 1 Ê¸»ú¿Ê¤à¡£
+                       if ($source =~ /^(.)/) {
+                               $pre .= $1;
+                               $source = $';
+                       }
+                       
+                       # parse ·ë²Ì¤ò @array ¤ËÊݸ¤¹¤ë½èÍý¤òÈô¤Ð¤·¤Æ·«¤êÊÖ¤·¡£
+                       next SOURCE;
+               }
+
+               # ¥¤¥ó¥é¥¤¥ó Wiki ½ñ¼°Á´ÂΤˠmacth ¤·¤¿¸å¤Î
+               # parse ·ë²Ì¤ò @array ¤ËÊݸ¤¹¤ë½èÍý¡£
+
+               # ¤â¤· $pre ¤¬Î¯¤Þ¤Ã¤Æ¤¤¤ë¤Ê¤é¡¢WikiName¤Î½èÍý¤ò¼Â»Ü¡£
+               if ($pre ne q{}) {
+                       push @array, $self->_parse_line_wikiname($pre);
+                       $pre = q{};
+               }
+
+               push @array, @parsed;
+       }
+
+       # ¤â¤· $pre ¤¬Î¯¤Þ¤Ã¤Æ¤¤¤ë¤Ê¤é¡¢WikiName¤Î½èÍý¤ò¼Â»Ü¡£
+       if ($pre ne q{}) {
+               push @array, $self->_parse_line_wikiname($pre);
+       }
+
+       return @array;
+}
+
+#========================================================================
+# parse_line() ¤«¤é¸Æ¤Ó½Ð¤µ¤ì¡¢WikiName¤Î¸¡º÷¡¦ÃÖ´¹½èÍý¤ò¹Ô¤¤¤Þ¤¹¡£
+#========================================================================
+sub _parse_line_wikiname {
+       my $self   = shift;
+       my $source = shift;
+
+       return () if (not defined $source);
+
+       my @array = ();
+
+       # $source ¤¬¶õ¤Ë¤Ê¤ë¤Þ¤Ç·«¤êÊÖ¤¹¡£
+       while ($source ne q{}) {
+
+               # WikiName
+               if ($main::WIKI_NAME == 1 && $source =~ /[A-Z]+?[a-z]+?(?:[A-Z]+?[a-z]+)+/) {
+                       my $pre  = $`;
+                       my $page = $&;
+                       $source  = $';
+                       if ($pre ne q{}) {
+                               push @array, $self->_parse_line_wikiname($pre);
+                       }
+                       push @array, $self->wiki_anchor($page);
+               }
+
+               # WikiName ¤â¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¤È¤­
+               else {
+                       push @array, $self->text($source);
+                       return @array;
                }
-               if($post ne ""){ push(@array,$self->parse_line($post)); }
-               
-       # WikiName
-       } elsif($main::WIKI_NAME==1 && $source =~ /[A-Z]+?[a-z]+?([A-Z]+?[a-z]+)+/){
-               my $pre   = $`;
-               my $post  = $';
-               my $page  = $&;
-               if($pre ne ""){ push(@array,$self->parse_line($pre)); }
-               push @array,$self->wiki_anchor($page);
-               if($post ne ""){ push(@array,$self->parse_line($post)); }
-               
-       } else {
-               push @array,$self->text($source);
        }
-       
        return @array;
 }
 
+#===============================================================================
+# <p>
+# ¥Ñ¡¼¥¹¤ò³«»ÏÁ°¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
+# ¥µ¥Ö¥¯¥é¥¹¤ÇɬÍפʽèÍý¤¬¤¢¤ë¾ì¹ç¤Ï¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Æ¤¯¤À¤µ¤¤¡£
+# </p>
+#===============================================================================
+sub start_parse {}
+
 #==============================================================================
 # ¥ê¥¹¥È
 #==============================================================================
@@ -595,30 +859,39 @@ sub l_list {
                $self->{para} = 0;
        }
        
+       if($self->{list} == 1 && $level <= $self->{level}){
+               $self->end_list;
+       }
+       $self->{list} = 0;
+       
        $self->end_verbatim;
        $self->end_table;
        $self->end_quote;
-       $self->end_explan;
        
        my $html = join("",@$obj);
-       my $plus = 1;
-       
-       if($level < $self->{level}){ $plus = -1; }
-       if($level==$self->{level}){
-               $self->{html} .= "</li>\n";
-       }
-       while($level != $self->{level}){
-               if($plus==1){
+
+       if($level > $self->{level}){
+               while($level != $self->{level}){
                        $self->{html} .= "<ul>\n";
                        push(@{$self->{close_list}},"</ul>\n");
-               } else {
-                       $self->{html} .= "</li>\n";
+                       $self->{level}++;
+               }
+       } elsif($level <= $self->{level}){
+               while($level-1 != $self->{level}){
+                       if($self->{'list_close_'.$self->{level}} == 1){
+                               $self->{html} .= "</li>\n";
+                               $self->{'list_close_'.$self->{level}} = 0;
+                       }
+                       if($level == $self->{level}){
+                               last;
+                       }
                        $self->{html} .= pop(@{$self->{close_list}});
+                       $self->{level}--;
                }
-               $self->{level} += $plus;
        }
        
        $self->{html} .= "<li>".$html;
+       $self->{'list_close_'.$level} = 1;
 }
 
 #==============================================================================
@@ -634,29 +907,39 @@ sub l_numlist {
                $self->{para} = 0;
        }
        
+       if($self->{list} == 0 && $level <= $self->{level}){
+               $self->end_list;
+       }
+       $self->{list} = 1;
+       
        $self->end_verbatim;
        $self->end_table;
        $self->end_quote;
-       $self->end_explan;
        
        my $html = join("",@$obj);
-       my $plus = 1;
        
-       if($level < $self->{level}){ $plus = -1; }
-       if($level==$self->{level}){
-               $self->{html} .= "</li>\n";
-       }
-       while($level != $self->{level}){
-               if($plus==1){
+       if($level > $self->{level}){
+               while($level != $self->{level}){
                        $self->{html} .= "<ol>\n";
                        push(@{$self->{close_list}},"</ol>\n");
-               } else {
-                       $self->{html} .= "</li>\n";
+                       $self->{level}++;
+               }
+       } elsif($level <= $self->{level}){
+               while($level-1 != $self->{level}){
+                       if($self->{'list_close_'.$self->{level}} == 1){
+                               $self->{html} .= "</li>\n";
+                               $self->{'list_close_'.$self->{level}} = 0;
+                       }
+                       if($level == $self->{level}){
+                               last;
+                       }
                        $self->{html} .= pop(@{$self->{close_list}});
+                       $self->{level}--;
                }
-               $self->{level} += $plus;
        }
+       
        $self->{html} .= "<li>".$html;
+       $self->{'list_close_'.$level} = 1;
 }
 
 #==============================================================================
@@ -664,12 +947,13 @@ sub l_numlist {
 #==============================================================================
 sub end_list {
        my $self  = shift;
-       if ($self->{level}!=0) {
-               $self->{html} .= "</li>\n";
-               while($self->{level}!=0){
-                       $self->{html} .= pop(@{$self->{close_list}});
-                       $self->{level} += -1;
+       while($self->{level} != 0){
+               if($self->{'list_close_'.($self->{level})} == 1){
+                       $self->{html} .= "</li>\n";
+                       $self->{'list_close_'.$self->{level}} = 0;
                }
+               $self->{html} .= pop(@{$self->{close_list}});
+               $self->{level}--;
        }
 }
 
@@ -690,20 +974,20 @@ sub l_headline {
        $self->end_verbatim;
        $self->end_table;
        $self->end_quote;
-       $self->end_explan;
        
        my $html  = join("",@$obj);
        
+       # ¥á¥¤¥ó¤Îɽ¼¨Îΰè¤Ç¤Ê¤¤¤È¤­
        if(!$self->{main}){
                $self->{html} .= "<h".($level+1).">".$html."</h".($level+1).">\n";
+
+       # ¥á¥¤¥ó¤Îɽ¼¨Îΰè¤Î¾ì¹ç¤Ï¥¢¥ó¥«¤ò½ÐÎÏ
        } else {
                if($level==2){
-                       $self->{html} .= "<h".($level+1)."><a name=\"p".$self->{p_cnt}."\">".
-                                        "<span class=\"sanchor\">_</span></a>".$html."</h".($level+1).">\n";
+                       $self->{html} .= "<h".($level+1)."><a name=\"p".$self->{p_cnt}."\"><span class=\"sanchor\">&nbsp;</span>".
+                                        $html."</a></h".($level+1).">\n";
                } else {
-                       $self->{html} .= "<h".($level+1).">".
-                                        "<a name=\"p".$self->{p_cnt}."\">".$html."</a>".
-                                        "</h".($level+1).">\n";
+                       $self->{html} .= "<h".($level+1)."><a name=\"p".$self->{p_cnt}."\">".$html."</a></h".($level+1).">\n";
                }
        }
        $self->{p_cnt}++;
@@ -715,11 +999,15 @@ sub l_headline {
 sub l_line {
        my $self = shift;
        
+       if($self->{para}==1){
+               $self->{html} .= "</p>\n";
+               $self->{para} = 0;
+       }
+       
        $self->end_list;
        $self->end_verbatim;
        $self->end_table;
        $self->end_quote;
-       $self->end_explan;
        
        $self->{html} .= "<hr>\n";
 }
@@ -734,11 +1022,12 @@ sub l_paragraph {
        $self->end_verbatim;
        $self->end_table;
        $self->end_quote;
-       $self->end_explan;
        
        if($self->{para}==1){
                $self->{html} .= "</p>\n";
                $self->{para} = 0;
+       } elsif($main::BR_MODE==1){
+               $self->{html} .= "<br>\n";
        }
 }
 
@@ -757,15 +1046,15 @@ sub l_verbatim {
        $self->end_list;
        $self->end_table;
        $self->end_quote;
-       $self->end_explan;
        
+       $text =~ s/^\s//;
        $self->{pre} .= Util::escapeHTML($text)."\n";
 }
 
 sub end_verbatim {
        my $self  = shift;
        if($self->{pre} ne ""){
-               $self->{html} .= "<pre>".$self->{pre}."</pre>";
+               $self->{html} .= "<pre>".$self->{pre}."</pre>\n";
                $self->{pre} = "";
        }
 }
@@ -779,26 +1068,31 @@ sub l_table {
        $self->end_list;
        $self->end_verbatim;
        $self->end_quote;
-       $self->end_explan;
+       
+       my $tag = "td";
        
        if($self->{table}==0){
                $self->{table}=1;
                $self->{html} .= "<table>\n";
-               $self->{html} .= "<tr>\n";
-               foreach(@$row){
-                       my $html = join("",@$_);
-                       $self->{html} .= "<th>".$html."</th>\n";
-               }
-               $self->{html} .= "</tr>\n";
+               $tag = "th";
        } else {
                $self->{table}=2;
-               $self->{html} .= "<tr>\n";
-               foreach(@$row){
-                       my $html = join("",@$_);
-                       $self->{html} .= "<td>".$html."</td>\n";
+       }
+       
+       my @columns = ();
+       foreach(@$row){
+               my $html = join("",@$_);
+               if($#columns != -1 && $html eq '&lt;&lt;'){
+                       @columns[$#columns]->{colspan}++;
+               } else {
+                       push(@columns, {colspan => 1, html => $html});
                }
-               $self->{html} .= "</tr>\n";
        }
+       $self->{html} .= "<tr>\n";
+       foreach(@columns){
+               $self->{html} .= "<$tag colspan=\"".$_->{colspan}."\">".$_->{html}."</$tag>\n";
+       }
+       $self->{html} .= "</tr>\n";
 }
 
 sub end_table {
@@ -818,7 +1112,6 @@ sub end_parse {
        $self->end_verbatim;
        $self->end_table;
        $self->end_quote;
-       $self->end_explan;
        
        if($self->{para}==1){
                $self->{html} .= "</p>\n";
@@ -836,7 +1129,6 @@ sub l_text {
        $self->end_verbatim;
        $self->end_table;
        $self->end_quote;
-       $self->end_explan;
        my $html = join("",@$obj);
        
        if($self->{para}==0){
@@ -844,6 +1136,11 @@ sub l_text {
                $self->{para} = 1;
        }
        $self->{html} .= $html;
+       
+       # br¥â¡¼¥É¤ËÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï<br>¤ò­¤¹
+       if($main::BR_MODE==1){
+               $self->{html} .= "<br>\n";
+       }
 }
 
 #==============================================================================
@@ -855,7 +1152,6 @@ sub l_quotation {
        $self->end_list;
        $self->end_verbatim;
        $self->end_table;
-       $self->end_explan;
        my $html = join("",@$obj);
        $self->{quote} .= "<p>".$html."</p>\n";
 }
@@ -876,33 +1172,15 @@ sub l_explanation {
        my $obj1 = shift;
        my $obj2 = shift;
        
-       if($self->{para}==1){
-               $self->{html} .= "</p>";
-               $self->{para} = 0;
-       }
-
        $self->end_list;
        $self->end_verbatim;
        $self->end_table;
        $self->end_quote;
        
-       if($self->{explan}==0){
-               $self->{explan}=1;
-               $self->{html} .= "<dl>\n";
-       }
-       
        my $html1 = join("",@$obj1);
        my $html2 = join("",@$obj2);
        
-       $self->{html} .= "<dt>".$html1."</dt>\n<dd>".$html2."</dd>\n";
-}
-
-sub end_explan {
-       my $self = shift;
-       if($self->{explan}!=0){
-               $self->{explan} = 0;
-               $self->{html} .= "</dl>\n";
-       }
+       $self->{html} .= "<dl>\n<dt>".$html1."</dt>\n<dd>".$html2."</dd>\n</dl>\n";
 }
 
 #==============================================================================
@@ -953,7 +1231,7 @@ sub url_anchor {
                $name = $url;
        }
        
-       if($url eq $name && $url=~/\.(gif|jpg|jpeg|bmp|png)$/i){
+       if($url eq $name && $url=~/\.(gif|jpg|jpeg|bmp|png)$/i && $main::DISPLAY_IMAGE==1){
                return "<img src=\"".$url."\">";
        } else {
                return "<a href=\"$url\">".Util::escapeHTML($name)."</a>";
@@ -968,16 +1246,36 @@ sub wiki_anchor {
        my $page = shift;
        my $name = shift;
        
+       my $anchor = undef;
+       my $ppage = $page;
+       
        if(!defined($name) || $name eq ""){
                $name = $page;
        }
        
-       if(&Wiki::exists_page($page)){
-               return "<a href=\"$main::MAIN_SCRIPT?p=".&Util::url_encode($page)."\" class=\"wikipage\">".
+       if(&Wiki::page_exists($page)){
+               #¥¢¥ó¥«¡¼¤ò´Þ¤à¥Ú¡¼¥¸¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ï¥ê¥ó¥¯¤òÍ¥Àè
+               return "<a href=\"".&Wiki::create_page_url($page)."\" class=\"wikipage\">".
                       &Util::escapeHTML($name)."</a>";
        } else {
-               return "<span class=\"nopage\">".&Util::escapeHTML($name)."</span>".
-                      "<a href=\"$main::MAIN_SCRIPT?p=".&Util::url_encode($page)."\">?</a>";
+               #ºÇ¸å¤Î"#"°Ê¹ß¤ò¥¢¥ó¥«¡¼¤È¤¹¤ë
+               if($page =~ m/#([^#]+)$/) {
+                       $page = $`;
+                       $anchor = $1;
+               }
+               if(defined($anchor) && $page eq '') {
+                       #Ʊ°ì¥Ú¡¼¥¸¤Î¥¢¥ó¥«¡¼¥ê¥ó¥¯
+                       return "<a href=\"#$anchor\" class=\"wikipage\">".
+                              &Util::escapeHTML($name)."</a>";
+               } elsif(&Wiki::page_exists($page)) {
+                       #»ØÄê¥Ú¡¼¥¸¤Î¥¢¥ó¥«¡¼¥ê¥ó¥¯
+                       return "<a href=\"".&Wiki::create_page_url($page).(defined($anchor)?"#".$anchor:"")."\" class=\"wikipage\">".
+                              &Util::escapeHTML($name)."</a>";
+               } else {
+                       #¿·µ¬¥Ú¡¼¥¸ºîÀ®ÍÑ¥ê¥ó¥¯
+                       return "<span class=\"nopage\">".&Util::escapeHTML($name)."</span>".
+                              "<a href=\"".&Wiki::create_page_url($page)."\">?</a>";
+               }
        }
 }
 
@@ -997,7 +1295,7 @@ sub plugin {
        my $self   = shift;
        my $plugin = shift;
        
-       my $func_ref = $main::I_PLUGIN->{$plugin->{command}};
+       my $func_ref = &Wiki::get_plugin_info($plugin->{command})->{FUNCTION};
        my $result = &$func_ref(@{$plugin->{args}});
        if(defined($result) && $result ne ""){
                return ($result);
@@ -1022,9 +1320,8 @@ sub l_plugin {
        $self->end_verbatim;
        $self->end_table;
        $self->end_quote;
-       $self->end_explan;
        
-       my $func_ref = $main::P_PLUGIN->{$plugin->{command}};
+       my $func_ref = &Wiki::get_plugin_info($plugin->{command})->{FUNCTION};
        my $result = &$func_ref(@{$plugin->{args}});
        if(defined($result) && $result ne ""){
                $self->{html} .= $result;
@@ -1035,13 +1332,14 @@ sub l_plugin {
 # ¥¤¥á¡¼¥¸
 #==============================================================================
 sub l_image {
-       my $self = shift;
-       my $page = shift;
-       my $file = shift;
-       my $wiki = $self->{wiki};
+       my $self   = shift;
+       my $page   = shift;
+       my $file   = shift;
+       my $width  = shift;
+       my $height = shift;
        
        if($self->{para}==1){
-               $self->{html} .= "</p>";
+               $self->{html} .= "</p>\n";
                $self->{para} = 0;
        }
        
@@ -1049,12 +1347,24 @@ sub l_image {
        $self->end_verbatim;
        $self->end_table;
        $self->end_quote;
-       $self->end_explan;
        
-       $self->{html} .= "<img src=\"".$wiki->config('script_name')."?action=ATTACH&amp;".
-                        "page=".&Util::url_encode($page)."&amp;file=".&Util::url_encode($file)."\">";
+       $self->{html} .= "<div class=\"image\">";
+       $self->{html} .= "<img src=\"".&Wiki::create_url({'p'=>$page,'f'=>$file},$main::DOWNLOAD_SCRIPT)."\"";
+       $self->{html} .= " width=\"$width\"" if ($width ne "");
+       $self->{html} .= " height=\"$height\"" if ($height ne "");
+       $self->{html} .= "/>";
+       $self->{html} .= "</div>\n";
 }
 
+#==============================================================================
+# ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸
+#==============================================================================
+sub error {
+       my $self  = shift;
+       my $label = shift;
+       
+       return "<span class=\"error\">".Util::escapeHTML($label)."</span>";
+}
 
 ################################################################################
 #
@@ -1067,6 +1377,8 @@ package Util;
 #===============================================================================
 sub url_encode {
        my $retstr = shift;
+       &jcode::convert(\$retstr,"euc");
+       
        $retstr =~ s/([^ 0-9A-Za-z])/sprintf("%%%.2X", ord($1))/eg;
        $retstr =~ tr/ /+/;
        return $retstr;
@@ -1077,6 +1389,7 @@ sub url_encode {
 #===============================================================================
 sub url_decode{
        my $retstr = shift;
+       
        $retstr =~ tr/+/ /;
        $retstr =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge;
        return $retstr;
@@ -1087,6 +1400,8 @@ sub url_decode{
 #===============================================================================
 sub escapeHTML {
        my($retstr) = shift;
+       &jcode::convert(\$retstr,"euc");
+       
        my %table = (
                '&' => '&amp;',
                '"' => '&quot;',
@@ -1094,6 +1409,9 @@ sub escapeHTML {
                '>' => '&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;
 }
 
@@ -1132,6 +1450,25 @@ sub delete_tag {
 }
 
 #===============================================================================
+# ¥Ú¡¼¥¸Ì¾¤¬»ÈÍѲÄǽ¤«¤É¤¦¤«¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£
+#===============================================================================
+sub check_pagename {
+       my $pagename = shift;
+
+       #¥Ú¡¼¥¸Ì¾¤ò¥Á¥§¥Ã¥¯
+       if( !defined($pagename)
+               || $pagename eq ""                     # ¶õ
+               || $pagename =~ /[\|\[\]]/             # |[]
+               || $pagename =~ /^:/                   # ¥³¥í¥ó¤Ç»Ï¤Þ¤ë
+               || $pagename =~ /[^:]:[^:]/            # ¥³¥í¥óñÂΤǤλÈÍÑ
+               || $pagename =~ /^\s+$/                # ¶õÇò¤Î¤ß
+       ){
+               return 0;
+       }
+       return 1;
+}
+
+#===============================================================================
 # ¿ôÃͤ«¤É¤¦¤«¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£
 #===============================================================================
 sub check_numeric {
@@ -1143,6 +1480,63 @@ sub check_numeric {
        }
 }
 
+#==============================================================================
+# ¥á¡¼¥ëÁ÷¿®
+#==============================================================================
+sub send_mail {
+       my $action   = shift;
+       my $page     = shift;
+       my $enc_page = &Util::url_encode($page);
+       
+       if($main::ADMIN_MAIL eq "" || $main::SEND_MAIL eq ""){
+               return;
+       }
+       
+       my $subject = "";
+       if($action eq 'CREATE'){
+               $subject = "[FSWikiLite]$page¤¬ºîÀ®¤µ¤ì¤Þ¤·¤¿";
+               
+       } elsif($action eq 'MODIFY'){
+               $subject = "[FSWikiLite]$page¤¬¹¹¿·¤µ¤ì¤Þ¤·¤¿";
+               
+       } elsif($action eq 'DELETE'){
+               $subject = "[FSWikiLite]$page¤¬ºï½ü¤µ¤ì¤Þ¤·¤¿";
+       }
+       
+       # MIME¥¨¥ó¥³¡¼¥É
+       $subject = &main::mimeencode($subject);
+       
+       my $head = "Subject: $subject\n".
+                  "From: $main::ADMIN_MAIL\n".
+                  "Content-Transfer-Encoding: 7bit\n".
+                  "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n".
+                  "Reply-To: $main::ADMIN_MAIL\n".
+                  "\n";
+       
+       my $body = "IP:".$ENV{'REMOTE_ADDR'}."\n".
+                  "UA:".$ENV{'HTTP_USER_AGENT'}."\n";
+       
+       if($action eq 'MODIFY' || $action eq 'DELETE'){
+               if(-e "$main::BACKUP_DIR/$enc_page.bak"){
+                       $body .= "°Ê²¼¤ÏÊѹ¹Á°¤Î¥½¡¼¥¹¤Ç¤¹¡£\n".
+                                "-----------------------------------------------------\n";
+                       open(BACKUP,"$main::BACKUP_DIR/$enc_page.bak");
+                       while(my $line = <BACKUP>){
+                               $body .= $line;
+                       }
+                       close(BACKUP);
+               }
+       }
+       
+       # Ê¸»ú¥³¡¼¥É¤ÎÊÑ´¹(jcode.pl¤ò»ÈÍѤ¹¤ë)
+       &jcode::convert(\$body,'jis');
+       
+       open(MAIL,"| $main::SEND_MAIL $main::ADMIN_MAIL");
+       print MAIL $head;
+       print MAIL $body;
+       close(MAIL);
+}
+
 #===============================================================================
 # ¥¨¥é¡¼¤òÄÌÃÎ
 #===============================================================================
@@ -1170,7 +1564,7 @@ sub handyphone {
        if(!defined($ua)){
                return 0;
        }
-       if($ua=~/^DoCoMo\// || $ua=~ /^J-PHONE\// || $ua=~ /UP\.Browser/){
+       if($ua=~/^DoCoMo\// || $ua=~ /^J-PHONE\// || $ua=~ /UP\.Browser/ || $ua=~ /\(DDIPOCKET\;/ || $ua=~ /\(WILLCOM\;/ || $ua=~ /^Vodafone\// || $ua=~ /^SoftBank\//){
                return 1;
        } else {
                return 0;
@@ -1178,59 +1572,18 @@ sub handyphone {
 }
 
 #===============================================================================
-# ¥¤¥ó¥é¥¤¥ó¥×¥é¥°¥¤¥ó¤ò¥Ñ¡¼¥¹¤·¤Æ¥³¥Þ¥ó¥É¤È°ú¿ô¤Ëʬ³ä
+# ¥¹¥Þ¡¼¥È¥Õ¥©¥ó¤«¤É¤¦¤«¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£
 #===============================================================================
-sub parse_plugin {
-       my $text = shift;
-       my ($cmd,@args_tmp) = split(/ /,$text);
-       my $args_txt = &Util::trim(join(" ",@args_tmp));
-       
-       my @ret_args;
-       my $tmp    = "";
-       my $escape = 0;
-       my $quote  = 0;
-       
-       for(my $i=0;$i<length($args_txt);$i++){
-               my $c = substr($args_txt,$i,1);
-               
-               if($quote!=1 && $c eq ","){
-                       if($tmp ne ""){
-                               push(@ret_args,$tmp);
-                               $tmp = "";
-                               $quote = 0;
-                       }
-               } elsif($quote==1 && $c eq "\\"){
-                       if($escape==0){
-                               $escape = 1;
-                       } else {
-                               $tmp .= $c;
-                               $escape = 0;
-                       }
-               } elsif($quote==0 && $c eq '"'){
-                       if($tmp eq ""){
-                               $quote = 1;
-                       } else {
-                               $tmp .= $c;
-                       }
-               } elsif($quote==1 && $c eq '"'){
-                       if($escape==1){
-                               $tmp .= $c;
-                               $escape = 0;
-                       } else {
-                               $quote = 2;
-                       }
-               } elsif($quote==2){
-                       return {error=>"¥¤¥ó¥é¥¤¥ó¥×¥é¥°¥¤¥ó¤Î¹½Ê¸¤¬ÉÔÀµ¤Ç¤¹¡£"};
-               } else {
-                       $tmp .= $c;
-               }
+sub smartphone {
+       my $ua = $ENV{'HTTP_USER_AGENT'};
+       if(!defined($ua)){
+               return 0;
        }
-       
-       if($tmp ne ""){
-               push(@ret_args,$tmp);
+       if($ua =~ /Android/ || $ua =~ /iPhone/){
+               return 1;
+       } else {
+               return 0;
        }
-       
-       return {command=>$cmd,args=>\@ret_args};
 }
 
 1;
index e9a93b9..dd19487 100644 (file)
@@ -13,6 +13,8 @@ $THEME_URL       = './theme/default/default.css';
 $ADMIN_MAIL      = '';
 $SEND_MAIL       = '';
 $WIKI_NAME       = 0;
+$BR_MODE         = 0;
+$DISPLAY_IMAGE   = 1;
 $MAIN_SCRIPT     = 'wiki.cgi';
 $EDIT_SCRIPT     = 'edit.cgi';
 $CATEGORY_SCRIPT = 'category.cgi';
@@ -22,7 +24,7 @@ $SITE_TITLE      = 'FSWikiLite';
 #===============================================================================
 # ¥×¥í¥À¥¯¥È¾ðÊó
 #===============================================================================
-$VERSION         = '0.0.12';
+$VERSION         = '0.1.0';
 $SITE_URL        = 'http://fswiki.osdn.jp/cgi-bin/wiki.cgi';
 
 #===============================================================================
index 5206f68..5bebe4f 100644 (file)
@@ -16,9 +16,14 @@ BEGIN {
        $main::P_PLUGIN->{search}        = \&Wiki::Plugin::search;
        
        # ¥¤¥ó¥é¥¤¥ó¥×¥é¥°¥¤¥ó¤Î¥¨¥ó¥È¥ê
-       $main::I_PLUGIN->{category}     = \&Wiki::Plugin::category;
-       $main::I_PLUGIN->{lastmodified} = \&Wiki::Plugin::lastmodified;
-       $main::I_PLUGIN->{ref}          = \&Wiki::Plugin::ref;
+       $main::I_PLUGIN->{category}      = \&Wiki::Plugin::category;
+       $main::I_PLUGIN->{lastmodified}  = \&Wiki::Plugin::lastmodified;
+       $main::I_PLUGIN->{ref}           = \&Wiki::Plugin::ref;
+       $main::I_PLUGIN->{raw}           = \&Wiki::Plugin::raw;
+       
+       # ¥Ö¥í¥Ã¥¯¥×¥é¥°¥¤¥ó¤Î¥¨¥ó¥È¥ê
+       $main::B_PLUGIN->{pre}           = \&Wiki::Plugin::pre;
+       $main::B_PLUGIN->{bq}            = \&Wiki::Plugin::bq;
 }
 
 #==============================================================================
@@ -26,21 +31,48 @@ BEGIN {
 #==============================================================================
 sub recent {
        my $max = shift;
-       $max = 0 if($max eq "");
+       my $way = shift;
+       
+       # É½¼¨Êý¼°¤ò·èÄê
+       if($way eq ""){
+               $way = "H";
+       }
+       if($max eq "V" || $max eq "v"){
+               $way = "V";
+               $max = 0;
+       } elsif($max eq "H" || $max eq "h"){
+               $way = "H";
+               $max = 0;
+       } elsif($max eq ""){
+               $max = 0;
+       }
+       
+       # É½¼¨ÆâÍƤòºîÀ®
        my $buf = "";
+       my $content = "";
        
        my @pages = &Wiki::get_page_list();
        my $count = 0;
        
-       $buf .= "<ul>\n";
        foreach my $page (@pages){
-               $buf .= "<li><a href=\"$main::MAIN_SCRIPT?p=".&Util::url_encode($page->{NAME})."\">".
-                       &Util::escapeHTML($page->{NAME})."</a></li>\n";
+               $content = "<a href=\"".&Wiki::create_url({p=>$page->{NAME}})."\">".&Util::escapeHTML($page->{NAME})."</a>";
+               if($way eq "H" || $way eq "h"){
+                       if($count!=0){
+                               $buf .= " / ";
+                       }
+                       $buf .= $content;
+               } else {
+                       if($count==0){
+                               $buf .= "<ul>\n";
+                       }
+                       $buf .= "<li>".$content."</li>\n";
+               }
                $count++;
                last if($count==$max && $max!=0);
        }
-       $buf .= "</ul>\n";
-       
+       if($count>0 && $way ne "H" && $way ne "h"){
+               $buf .= "</ul>\n";
+       }
        return $buf;
 }
 
@@ -79,7 +111,7 @@ sub recentdays {
                        $buf .= "<ul>\n";
                }
                
-               $buf .= "<li><a href=\"$main::MAIN_SCRIPT?p=".&Util::url_encode($page->{NAME})."\">".
+               $buf .= "<li><a href=\"".&Wiki::create_url({p=>$page->{NAME}})."\">".
                        &Util::escapeHTML($page->{NAME})."</a></li>\n";
        }
        
@@ -96,9 +128,9 @@ sub recentdays {
 sub category {
        my $category = shift;
        if($category eq ""){
-               return "¥«¥Æ¥´¥ê¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£";
+               return "<span class=\"error\">¥«¥Æ¥´¥ê¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£</span>";
        } else {
-               return "[<a href=\"$main::CATEGORY_SCRIPT?c=".&Util::url_encode($category)."\">".
+               return "[<a href=\"".&Wiki::create_url({c=>$category},$main::CATEGORY_SCRIPT)."\">".
                       "¥«¥Æ¥´¥ê:".&Util::escapeHTML($category)."</a>]";
        }
 }
@@ -107,8 +139,8 @@ sub category {
 # ¥Ú¡¼¥¸¤ÎºÇ½ª¹¹¿·Æü»þ¤òɽ¼¨¤¹¤ë¥×¥é¥°¥¤¥ó¡£
 #=============================================================================
 sub lastmodified {
-       my $page = $main::in{"p"};
-       if(&Wiki::exists_page($page)){
+       my $page = shift || $main::in{"p"};
+       if(&Wiki::page_exists($page)){
                return  "ºÇ½ª¹¹¿·»þ´Ö¡§".&Util::format_date(&Wiki::get_last_modified($page));
        } else {
                return undef;
@@ -136,7 +168,7 @@ sub category_list {
                                
                                # ¥«¥Æ¥´¥ê¤Ë¥Þ¥Ã¥Á¤·¤¿¤é¥ê¥¹¥Æ¥£¥ó¥°
                                if($line =~ /{{category\s+$category}}/){
-                                       $buf .= "<li><a href=\"$main::MAIN_SCRIPT?p=".&Util::url_encode($page->{NAME})."\">".
+                                       $buf .= "<li><a href=\"".&Wiki::create_url({p=>$page->{NAME}})."\">".
                                                &Util::escapeHTML($page->{NAME})."</a></li>";
                                        last;
                                }
@@ -156,7 +188,7 @@ sub category_list {
                                next if($line =~ /^(\t| |\/\/)/);
                                
                                # ¥«¥Æ¥´¥ê¤Ë¥Þ¥Ã¥Á¤·¤¿¤é¥ê¥¹¥Æ¥£¥ó¥°
-                               while($line =~ /{{category\s+(.+?)}}/g){
+                               while($line =~ /\{\{category\s+(.+?)\}\}/g){
                                        $category->{$1}->{$page->{NAME}} = 1;
                                }
                        }
@@ -166,7 +198,7 @@ sub category_list {
                        $buf .= "<h2>".&Util::escapeHTML($name)."</h2>\n";
                        $buf .= "<ul>\n";
                        foreach my $page (sort(keys(%{$category->{$name}}))){
-                               $buf .= "<li><a href=\"$main::MAIN_SCRIPT?p=".&Util::url_encode($page)."\">".
+                               $buf .= "<li><a href=\"".&Wiki::create_url({p=>$page})."\">".
                                      &Util::escapeHTML($page)."</a></li>\n";
                        }
                        $buf .= "</ul>\n";
@@ -179,59 +211,81 @@ sub category_list {
 # ÅºÉÕ¥Õ¥¡¥¤¥ë¤Ø¤Î¥ê¥ó¥¯¤òɽ¼¨¤¹¤ë¤¿¤á¤Î¥×¥é¥°¥¤¥ó¡£
 #=============================================================================
 sub ref {
-       my $page = $main::in{"p"};
-       my $file = shift;
+       my $file  = shift;
+       my $page  = shift;
+       my $alias = shift;
        
        if($file eq ""){
-               return "¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£";
+               return "<p class=\"error\">¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£</p>\n";
+       }
+       if(!defined($page) || $page eq ""){
+               $page = $main::in{"p"};
+       }
+       if(!defined($alias) || $alias eq ""){
+               $alias = $file;
        }
        
        my $filename = sprintf("$main::ATTACH_DIR/%s.%s",
                                                   &Util::url_encode($page),&Util::url_encode($file));
        unless(-e $filename){
-               return "¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Þ¤»¤ó¡£";
+               return "<p class=\"error\">¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Þ¤»¤ó¡£</p>\n";
        }
        
-       return sprintf("<a href=\"$main::DOWNLOAD_SCRIPT?p=%s&f=%s\">%s</a>",
-                      &Util::url_encode($page),&Util::url_encode($file),$file);
+       return "<a href=\"".&Wiki::create_url({p=>$page,f=>$file},$main::DOWNLOAD_SCRIPT)."\">".&Util::escapeHTML($alias)."</a>";
 }
 
 #=============================================================================
 # ÅºÉÕ¥Õ¥¡¥¤¥ë¤ò²èÁü¤È¤·¤Æɽ¼¨¤¹¤ë¤¿¤á¤Î¥×¥é¥°¥¤¥ó¡£
 #=============================================================================
 sub ref_image {
-       my $page = $main::in{"p"};
-       my $file = shift;
+       my $file    = shift;
+       my $page = "";
+       
+       my @options = @_;
+       my $width  = "";
+       my $height = "";
        
        if($file eq ""){
-               return "¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£";
+               return "<p class=\"error\">¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£</p>\n";
+       }
+       foreach my $option (@options){
+               if($option =~ /^w([0-9]+)$/){
+                       $width = $1;
+               } elsif($option =~ /^h([0-9]+)$/){
+                       $height = $1;
+               } else {
+                       $page = $option;
+               }
+       }
+       if($page eq ""){
+               $page = $main::in{"p"};
        }
        
        my $filename = sprintf("$main::ATTACH_DIR/%s.%s",
                                                   &Util::url_encode($page),&Util::url_encode($file));
        unless(-e $filename){
-               return "<p>¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Þ¤»¤ó¡£</p>\n";
+               return "<p class=\"error\">¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Þ¤»¤ó¡£</p>\n";
        }
        
-       return sprintf("<div><img src=\"$main::DOWNLOAD_SCRIPT?p=%s&f=%s\"></div>",
-                      &Util::url_encode($page),&Util::url_encode($file));
+       &Wiki::get_current_parser()->l_image($page, $file, $width, $height);
+       return undef;
 }
 
 #=============================================================================
 # ÅºÉÕ¥Õ¥¡¥¤¥ë¤ò²èÁü¤È¤·¤Æɽ¼¨¤¹¤ë¤¿¤á¤Î¥×¥é¥°¥¤¥ó¡£
 #=============================================================================
 sub ref_text {
-       my $page = $main::in{"p"};
        my $file = shift;
+       my $page = shift || $main::in{"p"};
        
        if($file eq ""){
-               return "¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£";
+               return "<p class=\"error\">¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£</p>\n";
        }
        
        my $filename = sprintf("$main::ATTACH_DIR/%s.%s",
                                                   &Util::url_encode($page),&Util::url_encode($file));
        unless(-e $filename){
-               return "<p>¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Þ¤»¤ó¡£</p>\n";
+               return "<p class=\"error\">¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Þ¤»¤ó¡£</p>\n";
        }
        
        my $text = "";
@@ -256,11 +310,24 @@ sub ref_text {
 # ½ÐÎϤµ¤ì¤ëHTML¤Ï¤Á¤ç¤Ã¤È¼êÈ´¤­¤Ç¤¹¡Ä
 #=============================================================================
 sub outline {
-       my $page   = $main::in{'p'};
-       my $source = &Wiki::get_page($page);
+       my $page   = shift;
+       my $url    = "";
+       
+       if (!defined($page)) {
+               $page = $main::in{'p'};
+       } else {
+               $url  = &Wiki::create_url({p=>$page});
+       }
+       
+       my $source = "";
        my $level  = 0;
        my $count  = 0;
        my $buf    = "";
+       
+       if(&Wiki::page_exists($page)){
+               $source = &Wiki::get_page($page);
+       }
+       
        foreach my $line (split(/\n/,$source)){
                if($line=~/^(!{1,3})(.+)$/){
                        my $find_level = 4 - length($1);
@@ -276,7 +343,7 @@ sub outline {
                        }
                        my $section = &Util::delete_tag(&Wiki::process_wiki($2));
                        
-                       $buf .= "<li><a href=\"#p$count\">$section</a></li>\n";
+                       $buf .= "<li><a href=\"".$url."#p$count\">$section</a></li>\n";
                        $count++;
                }
        }
@@ -291,11 +358,62 @@ sub outline {
 # ¸¡º÷¥Õ¥©¡¼¥à¤òɽ¼¨¤¹¤ë¤¿¤á¤Î¥×¥é¥°¥¤¥ó
 #=============================================================================
 sub search {
-       return "<form action=\"$main::MAIN_SCRIPT\" method=\"GET\">\n".
+       my $way  = shift;
+       my $or_checked = $main::in{'t'} eq 'or';
+       my $with_content = $main::in{'c'} eq 'true';
+       return "<form action=\"".&Wiki::create_url({},$main::MAIN_SCRIPT)."\" method=\"GET\">\n".
               "  ¥­¡¼¥ï¡¼¥É <input type=\"text\" name=\"w\" size=\"20\" value=\"".&Util::escapeHTML($main::in{'w'})."\">\n".
+              ($way eq "v" ? "<br>" : "").
+              "  <input type=\"radio\" name=\"t\" id=\"and\" value=\"and\"".(!$or_checked?" checked":"")."><label for=\"and\">AND</label>".
+              "  <input type=\"radio\" name=\"t\" id=\"or\" value=\"or\"".($or_checked?" checked":"")."><label for=\"or\">OR</label>".
+              ($way eq "v" ? "<br>" : "").
+              "  <input type=\"checkbox\" name=\"c\" id=\"contents\" value=\"true\"".($with_content?" checked":"")."><label for=\"contents\">¥Ú¡¼¥¸ÆâÍƤâ´Þ¤á¤ë</label>".
               "  <input type=\"submit\" value=\" ¸¡ º÷ \">\n".
               "  <input type=\"hidden\" name=\"a\" value=\"search\">\n".
               "</form>\n";
 }
 
+#=============================================================================
+# °ú¿ô¤Ç»ØÄꤷ¤¿Ê¸»úÎó¤ò¤½¤Î¤Þ¤Þɽ¼¨¤¹¤ë¥¤¥ó¥é¥¤¥ó¥×¥é¥°¥¤¥ó
+#=============================================================================
+sub raw {
+       my $text = shift;
+       return &Util::escapeHTML($text);
+}
+
+#=============================================================================
+# pre¥¿¥°¤ò½ÐÎϤ¹¤ëÊ£¿ô¹Ô¥×¥é¥°¥¤¥ó
+#=============================================================================
+sub pre {
+       my $text = shift;
+       my $option = shift;
+       
+       my $count = 1;
+       my $buf = "<pre>";
+       my @lines = split(/\n/, $text);
+       my $len = length($#lines + 1);
+       foreach my $line (@lines){
+               if($option eq "num"){
+                       $buf .= sprintf("%0${len}d", $count) . "|";
+               }
+               $buf .= Util::escapeHTML($line) . "\n";
+               $count++;
+       }
+       
+       return $buf . "</pre>";
+}
+
+#=============================================================================
+# blockquote¥¿¥°¤ò½ÐÎϤ¹¤ëÊ£¿ô¹Ô¥×¥é¥°¥¤¥ó
+#=============================================================================
+sub bq {
+       my $text = shift;
+       my $buf = "<blockquote>";
+       foreach my $line (split(/(\r\n)|\n|\r/,&Util::escapeHTML($text))){
+               $buf .= "<p>$line<p>";
+       }
+       $buf .= "</blockquote>";
+       return $buf;
+}
+
 1;
index 3bffab1..65f48ce 100644 (file)
--- a/wiki.cgi
+++ b/wiki.cgi
@@ -33,7 +33,7 @@ sub list_page {
        &print_header("°ìÍ÷");
        print "<ul>\n";
        foreach my $page (@pages){
-               print "<li><a href=\"$MAIN_SCRIPT?p=".&Util::url_encode($page->{NAME})."\">".
+               print "<li><a href=\"".&Wiki::create_page_url($page->{NAME})."\">".
                      &Util::escapeHTML($page->{NAME})."</a>".
                      " - ".&Util::format_date($page->{TIME})."</li>\n";
        }
@@ -46,7 +46,7 @@ sub list_page {
 #-------------------------------------------------------------------------------
 sub show_page {
        
-       unless(&Wiki::exists_page($in{"p"})){
+       unless(&Wiki::page_exists($in{"p"})){
                undef %in;
                $in{"a"} = "edit";
                require $EDIT_SCRIPT;
@@ -58,7 +58,7 @@ sub show_page {
        
        &print_header($in{"p"},1);
        
-       if(&Wiki::exists_page("Header")){
+       if(&Wiki::page_exists("Header")){
                print "<div class=\"header\">\n";
                print &Wiki::process_wiki(&Wiki::get_page("Header"));
                print "</div>\n";
@@ -68,7 +68,7 @@ sub show_page {
        print $html;
        print "</div>\n";
        
-       if(&Wiki::exists_page("Footer")){
+       if(&Wiki::page_exists("Footer")){
                print "<div class=\"comment\">\n";
                print &Wiki::process_wiki(&Wiki::get_page("Footer"));
                print "</div>\n";
@@ -83,29 +83,85 @@ sub show_page {
 sub search_page {
        
        &print_header("¸¡º÷");
-       print "<form action=\"$MAIN_SCRIPT\" method=\"GET\">\n";
-       print "  ¥­¡¼¥ï¡¼¥É <input type=\"text\" name=\"w\" size=\"20\" value=\"".&Util::escapeHTML($in{'w'})."\">\n";
-       print "  <input type=\"submit\" value=\" ¸¡ º÷ \">\n";
-       print "  <input type=\"hidden\" name=\"a\" value=\"search\">\n";
-       print "</form>\n";
+       print &Wiki::Plugin::search();
        
-       if($in{'w'} ne ""){
-               my @pages = &Wiki::get_page_list();
-               my $find  = 0;
-               print "<ul>\n";
-               foreach my $page (@pages){
-                       my $source = $page->{NAME}."\n".&Wiki::get_page($page->{NAME});
-                       if(index($source,$in{'w'})!=-1){
-                               print "  <li><a href=\"$MAIN_SCRIPT?p=".&Util::url_encode($page->{NAME})."\">".&Util::escapeHTML($page->{NAME})."</a></li>\n";
-                               $find = 1;
+       my $buf          = "";
+       my $or_search    = $in{'t'} eq 'or';
+       my $with_content = $in{'c'} eq 'true';
+       my $word = &Util::trim($in{'w'});
+       
+       my $ignore_case = 1;
+       my $conv_upper_case = ($ignore_case and $word =~ /[A-Za-z]/);
+       
+       $word = uc $word if ($conv_upper_case);
+       my @words = grep { $_ ne '' } split(/ +|¡¡+/, $word);
+       if (@words) {
+       #---------------------------------------------------------------------------
+       # ¸¡º÷¼Â¹Ô
+       my @list = &Wiki::get_page_list();
+       my $res = '';
+       PAGE:
+       foreach my $page (@list){
+               my $name = $page->{NAME};
+               # ¥Ú¡¼¥¸Ì¾¤â¸¡º÷Âоݤˤ¹¤ë
+               my $page = $name;
+               $page .= "\n".&Wiki::get_page($name) if ($with_content);
+               my $pageref = ($conv_upper_case) ? \(my $page2 = uc $page) : \$page;
+               my $index;
+
+               if ($or_search) {
+                       # OR¸¡º÷ -------------------------------------------------------
+                       WORD:
+                       foreach(@words){
+                               next WORD if (($index = index $$pageref, $_) == -1);
+                               $res .= "<li>".
+                                           "<a href=\"".&Wiki::create_page_url($name)."\">".&Util::escapeHTML($name)."</a>".
+                                               " - ".
+                                               &Util::escapeHTML(&get_match_content($page, $index)).
+                                               "</li>\n";
+                               next PAGE;
                        }
+               } else {
+                       # AND¸¡º÷ ------------------------------------------------------
+                       WORD:
+                       foreach(@words){
+                               next PAGE if (($index = index $$pageref, $_) == -1);
+                       }
+                       $res .= "<li>".
+                                       "<a href=\"".&Wiki::create_page_url($name)."\">".Util::escapeHTML($name)."</a>".
+                                       " - ".
+                                       Util::escapeHTML(&get_match_content($page, $index)).
+                                       "</li>\n";
                }
-               if($find==0){
-                       print "<li>³ºÅö¤¹¤ë¥Ú¡¼¥¸¤Ï¸ºß¤·¤Þ¤»¤ó¡£</li>\n";
-               }
-               print "</ul>\n";
+       }
+       print "$buf<ul>\n$res</ul>\n" if ($res ne '');
        }
        
        &print_footer();
 }
 
+#-------------------------------------------------------------------------------
+# ¸¡º÷¤Ë¥Þ¥Ã¥Á¤·¤¿¹Ô¤ò¼è¤ê½Ð¤¹´Ø¿ô
+#-------------------------------------------------------------------------------
+sub get_match_content {
+       my $content = shift;
+       my $index   = shift;
+
+       # ¸¡º÷¤Ë¥Þ¥Ã¥Á¤·¤¿¹Ô¤ÎÀèƬʸ»ú¤Î°ÌÃÖ¤òµá¤á¤ë¡£
+       # ¡¦$content ¤Î $index ÈÖÌܤÎʸ»ú¤«¤éÀèƬÊý¸þ¤Ë²þ¹Ôʸ»ú¤òõ¤¹¡£
+       # ¡¦$index ¤Î°ÌÃÖ¤ò´Þ¤à¹Ô¤ÎÀèƬʸ»ú¤Î°ÌÃ֤ϲþ¹Ôʸ»ú¤Î¼¡¤Ê¤Î¤Ç +1 ¤¹¤ë¡£
+       # ¡¦ÀèƬÊý¸þ¤Ë²þ¹Ôʸ»ú¤¬Ìµ¤«¤Ã¤¿¤éºÇ½é¤Î¹Ô¤Ê¤Î¤Ç¡¢·ë²Ì¤Ï 0(ÀèƬ)¡£
+       #   (¸«¤Ä¤«¤é¤Ê¤¤¤È rindex() = -1 ¤Ë¤Ê¤ë¤Î¤Ç¡¢+1 ¤·¤Æ¤Á¤ç¤¦¤É 0)
+       my $pre_index = rindex($content, "\n", $index) + 1;
+
+       # ¸¡º÷¤Ë¥Þ¥Ã¥Á¤·¤¿¹Ô¤ÎËöÈøʸ»ú¤Î°ÌÃÖ¤òµá¤á¤ë¡£
+       # ¡¦$content ¤Î $index ÈÖÌܤÎʸ»ú¤«¤éËöÈøÊý¸þ¤Ë²þ¹Ôʸ»ú¤òõ¤¹¡£
+       my $post_index = index($content, "\n", $index);
+
+       # ËöÈøÊý¸þ¤Ë²þ¹Ôʸ»ú¤¬¤Ê¤«¤Ã¤¿¤éºÇ½ª¹Ô¤Ê¤Î¤Ç $pre_index °Ê¹ßÁ´¤Æ¤òÊֵѡ£
+       return substr($content, $pre_index) if ($post_index == -1);
+
+       # ¸«¤Ä¤«¤Ã¤¿²þ¹Ôʸ»ú¤Ë¶´¤Þ¤ì¤¿Ê¸»úÎó¤òÊֵѡ£
+       return substr($content, $pre_index, $post_index - $pre_index);
+}
+