/[pub]/suikawiki/script/wiki.cgi
Suika

Diff of /suikawiki/script/wiki.cgi

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.3 by wakaba, Mon Feb 4 14:36:18 2002 UTC revision 1.54 by wakaba, Wed Aug 6 03:04:22 2003 UTC
# Line 1  Line 1 
1  #!/usr/bin/perl  #!/usr/bin/perl
2  use lib "../lib";  ## wiki.cgi --- This is SuikaWiki, yet another WikiEngine
 use CGI::Carp 'fatalsToBrowser';  
 use Algorithm::Diff qw(traverse_sequences);  
 # use strict;  
 #  
 # yukiwiki.cgi - Yet another WikiWikiWeb clone.  
 #  
 # Copyright (C) 2000,2001 by Hiroshi Yuki.  
 # <hyuki@hyuki.com>  
 # http://www.hyuki.com/yukiwiki/  
 #  
 # This program is free software; you can redistribute it and/or modify  
 # it under the terms of the GNU General Public License as published by  
 # the Free Software Foundation; either version 2 of the License, or  
 # (at your option) any later version.  
 #  
 # This program is distributed in the hope that it will be useful,  
 # but WITHOUT ANY WARRANTY; without even the implied warranty of  
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
 # GNU General Public License for more details.  
 #  
 # $Id$  
 ##############################  
 my $version = "1.6.6";  
 ##############################  
 # ñ�ȥƥ��ȤΤȤ��ˤ� 1 �ˤ��롣  
 my $testing = 0;  
 ##############################  
 # �����饤�֥��  
 my $jcodelib = 'jcode.pl';  
 ##############################  
 # ��¸��ɽ���δ���������  
 my $kanjicode = 'euc';     # 'sjis' 'euc'  
 my $charset = 'euc-jisx0213';  # 'Shift_JIS' 'EUC-JP'  
 ##############################  
 # dbmopen���Ȥ���ʤ�1���Ȥ��ʤ��ʤ�0  
 my $dbmopen = 0;  
 ##############################  
 # �ǡ����١���̾��.pag, .dir, .db�ʤɤ����ס�  
 # $dbmopen = 1�ΤȤ��ϥǡ����١���̾��  
 # $dbmopen = 0�ΤȤ��ϥǥ��쥯�ȥ�̾�ˤʤ롣  
 my $dbname = './wikidata';  
 my $diffdbname = './wikidiff';  
 ##############################  
 # �����Ԥλ�̾�ʼ�ͳ���ѹ����Ƥ���������  
 my $modifier = 'suika';  
 ##############################  
 # �����Ԥ�Web�ڡ����ʼ�ͳ���ѹ����Ƥ���������  
 my $modifierlink = 'http://suika.fam.cx/';  
 ##############################  
 # ���Υڡ�����URL  
 my $thisurl = 'wiki';  
 ##############################  
 # ���ϥڡ���̾  
 my $toppage = 'HomePage';  
 ##############################  
 # �ǽ������ڡ���̾  
 my $whatsnew = 'RecentChanges';  
 ##############################  
 # �ǽ������˷Ǻܤ���ڡ�����  
 my $maxnew = 50;  
 ##############################  
 # ��������ե�����̾�ʥ��顼�ǡ�  
 my $iconfile = '';  
 ##############################  
 # ��������ե�����̾�ʥ�Υ����ǡ�  
 # my $iconfile = '';  
 ##############################  
 # �ڡ������ѹ������Ȥ���touch����ե������''�ʤ鲿�⤷�ʤ���  
 my $touchfile = 'touch.txt';  
 ##############################  
 # �ץ�ӥ塼�Ѥ��طʿ�  
 my $preview_color = '#FFCCCC';  
 ##############################  
 # ���ڡ����Υ�������  
 my $style = <<'EOD';  
 pre, dl, ul, ol, p, blockquote { line-height:120%; }  
 a { text-decoration: none; }  
 a:link { color: #0000FF; background-color: #FFFFFF; }  
 a:visited { color: #9900CC; background-color: #FFFFFF; }  
 a:hover { text-decoration: underline; }  
 EOD  
 ##############################  
 # �ƥ�����������ʬ���礭��  
 my $cols = 80;  
 my $rows = 20;  
 ##############################  
 my %form = ();  
 my %database = ();  
 my %diffbase = ();  
 my $diff_text = '';  
 my @diff_added = ();  
 my @diff_deleted = ();  
 my $msgrefA;  
 my $msgrefB;  
 ##############################  
 # �Խ��Բĥڡ���̾����  
 my @uneditable = ( $whatsnew );  
 ##############################  
 # ����Ѥ�����ɽ��  
 # YukiWiki�Υ�󥯤�2���ढ�롣  
 #  
 # (1) WikiName (RecentChanges�Ȥ�FrontPage�Τ褦�ʤ��)  
 # (2) BracketName ([[����]]�Ȥ�[[�ȥ�֥륷�塼��]]�Τ褦�ʤ��)  
 #  
 # �����ե�JIS��2�Х����ܤˤ� ']' ���褦��Τǡ�  
 # ʸ��']'��1��¿���Ȥ�褦�ˤ��Ƥ��롣  
 #  
 my $WikiName = '([A-Z][a-z]+([A-Z][a-z]+)+)';  
 my $BracketName = '\[\[([^>\s]+?\]?)\]\]';  
3    
4  # ����������ʬ�Υ���  use strict;
5  my $IconTag = ''; #<<"EOD";  use CGI::Carp qw(fatalsToBrowser);
6  #<a href="http://www.hyuki.com/yukiwiki/"><img src="$iconfile"  require 'wikidata/suikawiki-config.ph'; ## the site configuration script
7  # border="0" width="80" height="80" alt="[YukiWiki]" /></a>  require 'suikawiki.pl'; ## the main script
 #EOD  
8    
9  require "$jcodelib";  package SuikaWiki;
10    our $VERSION = '2.2';
 &init_form($kanjicode);  
   
 if ($testing) {  
     %form = (  
         # 'mycmd' => 'write',  
         'mycmd' => 'read',  
         #'mycmd' => 'search',  
         #'mycmd' => 'edit',  
         'mymsg' => <<"EOD",  
 �Ϥ���ޤ��ơ�  
 ���줫�餤�������񤭹��ߤޤ��͡�  
 LinkPage�⸫�Ƥ���������  
 TestPage�Ϥɤ��Ǥ��礦����  
 �ɤ������������  
 http://www.hyuki.com/  
 [[����]]  
 EOD  
         'mypage' => '<����>',  
         'myword' => '��',  
         # '3C8C8B8FE98D5F3E' => '',  
         # 'TestPage' => '',  
     );  
 }  
 &main;  
 exit(0);  
   
 # �ᥤ��  
 sub main {  
     &normalize_form;  
     if ($dbmopen) {  
         if (!dbmopen(%database, $dbname, 0666)) {  
             &print_error("(dbmopen) $dbname �����ޤ���");  
         }  
     } else {  
         if (!tie(%database, "YukiWikiDB", $dbname)) {  
             &print_error("(tie error)");  
         }  
     }  
   
     # myspecial�б�  
     foreach (keys %form) {  
         if (/^myspecial_(.*)/) {  
             $form{mycmd} = $1;  
             last;  
         }  
     }  
   
     if ($form{mycmd} eq 'read') {  
         &do_read;  
     } elsif ($form{mycmd} eq 'preview') {  
         &do_preview;  
     } elsif ($form{mycmd} eq 'write') {  
         &do_write;  
     } elsif ($form{mycmd} eq 'edit') {  
         &do_edit;  
     } elsif ($form{mycmd} eq 'reedit') {  
         &do_reedit;  
     } elsif ($form{mycmd} eq 'search') {  
         &do_search;  
     } elsif ($form{mycmd} eq 'list') {  
         &do_list;  
     } elsif ($form{mycmd} eq 'diff') {  
         &do_diff;  
     } else {  
         $form{mypage} = $toppage;  
         &do_read;  
     }  
     if ($dbmopen) {  
         dbmclose(%database);  
     } else {  
         untie(%database);  
     }  
 }  
   
 # �ڡ�����ɽ��  
 sub do_read {  
     my $page_name = $form{mypage};  
     my $percent_name = &encode_percent($page_name);  
     &print_header($page_name);  
     print qq|<h1>$IconTag<a href="$thisurl?mycmd=search;myword=$percent_name">$page_name</a></h1>\n|;  
     &print_toolbar($page_name);  
     print &convert_html(&get_page($page_name));  
     &print_footer;  
 }  
   
 # �ڡ������Խ�  
 sub do_edit {  
     if (not &is_editable($form{mypage})) {  
         # �Խ��Բĥڡ�����ɽ���Τ�  
         &do_read;  
         return;  
     }  
     &editpage(&get_page($form{mypage}));  
 }  
   
 # �ڡ����κ��Խ�  
 sub do_reedit {  
     if (not &is_editable($form{mypage})) {  
         # �Խ��Բĥڡ�����ɽ���Τ�  
         &do_read;  
     } else {  
         &editpage($form{mymsg});  
     }  
 }  
   
 sub editpage {  
     my $page_msg = shift;  
     my $page_name = $form{mypage};  
     my $digest = &calc_message_digest($page_msg);  
     &print_header($page_name);  
     print qq|<h1>$IconTag${page_name}���Խ�</h1>\n|;  
     &print_toolbar($page_name);  
     $page_msg = &escape($page_msg);  
     print <<"EOD";  
 <form action="$thisurl" method="post">  
 <input type="hidden" name="mycmd" value="preview">  
 <input type="hidden" name="mypage" value="$page_name">  
 <input type="hidden" name="mydigest" value="$digest">  
 <textarea cols="$cols" rows="$rows" name="mymsg" wrap="virtual">$page_msg</textarea><br>  
 <input type="submit" value="�ץ�ӥ塼">  
 </form>  
 <hr>  
 <h3>�ƥ����������Υ롼��</h3>  
   
 <p>�̾�����Ϥ���ʸ�������Τޤ޽��Ϥ���ޤ�����  
 �ʲ��Υ롼��˽��äƥƥ�����������Ԥ����Ȥ��Ǥ��ޤ���</p>  
   
 <ul>  
 <li>  
 ���Ԥ�����ζ��ڤ�Ȥʤ�ޤ���  
   
 <li>  
 HTML�Υ����Ͻ񤱤ޤ���  
   
 <li>  
 ''��Ĵ''�Τ褦�˥��󥰥륯��������ĤǤϤ���ȡ���Ĵ�ˤʤ�ޤ���  
   
 <li>  
 '''���˶�Ĵ'''�Τ褦�˥��󥰥륯�����Ȼ��ĤǤϤ���ȡ����˶�Ĵ�ˤʤ�ޤ���  
   
 <li>  
 ----�Τ褦�˥ޥ��ʥ�4�Ĥ�����ȡ���ʿ���ˤʤ�ޤ���  
   
 <li>  
 *���Ƭ�˽񤯤��縫�Ф��ˤʤ�ޤ���  
   
 <li>  
 **���Ƭ�˽񤯤Ⱦ����Ф��ˤʤ�ޤ���  
   
 <li>  
 -���Ƭ�˽񤯤Ȳվ�񤭤ˤʤ�ޤ���- -- --- ��3��٥뤬����ޤ���  
   
 <li>  
 :���Ƭ�˽񤯤��Ѹ�Ȳ���ʸ�����ޤ���  
   
 <pre>  
     :�Ѹ�1:���������񤤤�����ʸ1  
     :�Ѹ�2:���������񤤤�����ʸ2  
     :�Ѹ�3:���������񤤤�����ʸ3  
 </pre>  
   
 <li>  
 http://www.hyuki.com/ �Τ褦��URL�ϼ�ưŪ�˥�󥯤ˤʤ�ޤ���  
   
 <li>  
 YukiWiki�Τ褦����ʸ����ʸ���򺮤�����ʸ�����񤯤ȡ�  
 YukiWiki�Υڡ���̾�ˤʤ�ޤ���  
   
 <li>  
 [[����]]�Τ褦����Ť��礫�ä�[[ ]]�Ǥ����ä�ʸ�����񤯤ȡ�  
 YukiWiki�Υڡ���̾�ˤʤ�ޤ���  
 �礫�ä�����ˤϥ��ڡ�����ޤ�ƤϤ����ޤ���  
 ���ܸ��Ȥ��ޤ���  
   
 <li>  
 ��Ƭ�����ڡ����ǻϤޤäƤ���ȡ�  
 ��������������Ѥ߰����ޤ���  
 �ץ�������񤭹���Ȥ��˻Ȥ��������Ǥ���  
   
 <li>  
 &gt; ���Ƭ�˽񤯤ȡ�  
 ����ʸ���񤱤ޤ���  
 &gt; �ο���¿���ȥ���ǥ�Ȥ������ʤ�ޤ���3��٥�ޤǡˡ�  
   
 </ul>  
 EOD  
     &print_footer;  
 }  
   
 # �ڡ����θ���  
 sub do_search {  
     if ($form{myword}) {  
         &print_header('�������');  
         print qq|<h1>$IconTag$form{myword}�θ������</h1>\n|;  
         &print_toolbar();  
         print qq|<ul>\n|;  
         my $count = 0;  
         foreach my $page_name (sort keys %database) {    # sort����Τ�̵�Ť���  
             if ($database{$page_name} =~ /\Q$form{'myword'}\E/) {  
                 my $encoded = &encode_percent($page_name);  
                 print qq|<li><a href="$thisurl?mycmd=read;mypage=$encoded">$page_name</a>\n|;  
                 $count++;  
             }  
         }  
         print qq|</ul>\n|;  
         if ($count > 0) {  
             print qq|<p><strong>$form{myword}</strong>��ޤ�ڡ����ϡ���˼���<strong>$count</strong> �ڡ����Ǥ���</p>\n|;  
         } else {  
             print qq|<p><strong>$form{myword}</strong>��ޤ�ڡ����ϸ��Ĥ���ޤ���</p>\n|;  
         }  
     } else {  
         &print_header('ñ�측��');  
         print qq|<h1>$IconTagñ�측��</h1>\n|;  
         &print_toolbar();  
     }  
     print <<"EOD";  
 <p>  
 <form action="$thisurl" method="post">  
 <input type="hidden" name="mycmd" value="search">  
 <input type="text" name="myword" size="20" value="$form{myword}">  
 <input type="submit" value="ñ�측��">  
 </form>  
 </p>  
 EOD  
     &print_footer;  
 }  
   
 # �ڡ����ΰ���  
 sub do_list {  
     &print_header('�ڡ�������');  
     print qq|<h1>$IconTag �ڡ�������</h1>\n|;  
     &print_toolbar();  
     print qq|<ul>\n|;  
     foreach my $page_name (sort keys %database) {    # sort����Τ�̵�Ť���  
         my $encoded = &encode_percent($page_name);  
         print qq|<li><a href="$thisurl?mycmd=read;mypage=$encoded">$page_name</a>\n|  
     }  
     print qq|</ul>\n|;  
     &print_footer;  
 }  
   
 # �ץ�ӥ塼  
 sub do_preview {  
     my $page_name = $form{mypage};  
     my $escapedmsg = &escape($form{mymsg});  
     &print_header($page_name);  
     print qq|<h1>$IconTag${page_name}�Υץ�ӥ塼</h1>\n|;  
     &print_toolbar($page_name);  
     # local $percent_name = &encode_percent($page_name);  
     print qq|<p>�ʲ��Υץ�ӥ塼���ǧ���ơ��褱��Хڡ��������Υܥ���ǹ������Ƥ���������</p>\n|;  
     if ($form{mymsg}) {  
         print qq|<table width="100%" bgcolor="$preview_color" ><tr><td>\n|;  
         # print &convert_html($escapedmsg);  
         print &convert_html($form{mymsg});  
         print qq|</td></tr></table>\n|;  
     } else {  
         print qq|<p>�ʥڡ��������Ƥ϶��Ǥ�����������Ȥ��Υڡ�����<strong>���</strong>����ޤ�����</p>\n|;  
     }  
     &print_preview_buttons($page_name, $escapedmsg, $form{mydigest});  
     &print_footer;  
 }  
   
 sub print_preview_buttons {  
     my ($page_name, $escapedmsg, $digest) = @_;  
     print <<"EOD";  
     <form action="$thisurl" method="post">  
     <textarea cols="$cols" rows="$rows" name="mymsg" wrap="virtual">$escapedmsg</textarea>  
     <br />  
     <input type="hidden" name="mypage" value="$page_name">  
     <input type="hidden" name="mydigest" value="$digest">  
     <input type="submit" name="myspecial_preview" value="���٥ץ�ӥ塼">  
     <input type="submit" name="myspecial_write" value="�ڡ����ι���">  
     </form>  
 EOD  
 }  
   
 # �񤭹���  
 sub do_write {  
     if (not &is_editable($form{mypage})) {  
         # �Խ��Բĥڡ�����ɽ���Τ�  
         &do_read;  
         return;  
     }  
   
     my $page_name = $form{mypage};  
   
     # digest��Ȥäơ������ξ��ͥ����å�  
     my $original_digest = &calc_message_digest(&get_page($page_name));  
     if ($form{mydigest} ne $original_digest) {  
         &print_header($page_name);  
         print qq|<h1>$IconTag${page_name}�ǡڹ����ξ��ۤ͡������ޤ���</h1>\n|;  
         print <<"EOD";  
 <p>���ʤ������Υڡ������Խ����Ƥ���֤ˡ�  
 ¾�οͤ�Ʊ���ڡ����򹹿����Ƥ��ޤä��褦�Ǥ���  
 </p><p>  
 �ʲ��ˡ����ʤ����Խ������ƥ����Ȥ�����ޤ��Τǡ�  
 ���ʤ����Խ����Ƥ������ʤ��褦�ˡ�  
 ���ޤ��������Ģ�ʤɤ˥��ԡ����ڡ����Ȥ��Ƥ���������  
 </p><p>  
 ���ԡ����ڡ����Ȥ��Ѥ�Ǥ��顢  
 �ǿ������Ƥ򸫤ƺ����Խ���ľ���Ƥ���������  
 �ǿ������Ƥ�  
 <a target="_blank" href="$thisurl?mycmd=read;mypage=$form{mypage}">$form{mypage}</a>  
 �Ǹ��뤳�Ȥ��Ǥ��ޤ���  
 </p>  
 EOD  
         # &print_toolbar($page_name);  
         &print_preview_buttons($page_name, &escape($form{mymsg}), $form{mydigest});  
         &print_footer;  
         return;  
     }  
   
     # diff����  
     {  
         &opendiff;  
         my @msg1 = split(/\n/, &get_page($page_name));  
         my @msg2 = split(/\n/, $form{mymsg});  
         $msgrefA = \@msg1;  
         $msgrefB = \@msg2;  
         &diff_check;  
         $diffbase{$form{mypage}} = $diff_text;  
         $diff_text = '';  
         &closediff;  
     }  
   
     &print_header($page_name);  
     &set_page($page_name, $form{mymsg});  
     if ($form{mymsg}) {  
         print qq|<h1>$IconTag${page_name}�򹹿����ޤ���</h1>\n|;  
         &print_toolbar($page_name);  
         print &convert_html(&get_page($page_name));  
     } else {  
         print qq|<h1>$IconTag${page_name}�������ޤ���</h1>\n|;  
         &print_toolbar($page_name);  
         print qq|<p>${page_name}�������ޤ�����</p>\n|;  
     }  
     &print_footer;  
     # �������줿�Τǥ��å����Ƥ�����  
     if ($touchfile) {  
         open(FILE, "> $touchfile");  
         print FILE "\n";  
         close(FILE);  
     }  
 }  
   
 # �ڡ������ѹ���  
 sub do_diff {  
     if (not &is_editable($form{mypage})) {  
         # �Խ��Բĥڡ�����ɽ���Τ�  
         &do_read;  
         return;  
     }  
     &opendiff;  
     &print_header($form{mypage} . '���ѹ���');  
     print qq|<h1>$IconTag <a href="$thisurl?mycmd=read&mypage=$form{mypage}">$form{mypage}</a>���ѹ���</h1>\n|;  
     &print_toolbar();  
     $_ = &escape($diffbase{$form{mypage}});  
     print <<"EOD";  
 <ul>  
 <li>�ɲä��줿�Ԥ�<ins>�Ŀ�</ins>�Ǥ���  
 <li>������줿�Ԥ�<del>�ֿ�</del>�Ǥ���  
 <li><a href="$thisurl?mycmd=read;mypage=$form{mypage}">$form{mypage}</a>�عԤ���  
 </ul>  
 <hr />  
 EOD  
     print qq|<pre>\n|;  
     foreach (split(/\n/, $_)) {  
         if (/^\+(.*)/) {  
             print qq|<ins>$1</ins>\n|;  
         } elsif (/^\-(.*)/) {  
             print qq|<del>$1</del>\n|;  
         } elsif (/^\=(.*)/) {  
             print qq|$1\n|;  
         } else {  
             print qq|??? $_\n|;  
         }  
     }  
     print qq|</pre>\n|;  
     &print_footer;  
     &closediff;  
 }  
   
 sub opendiff {  
     if ($dbmopen) {  
         if (!dbmopen(%diffbase, $diffdbname, 0666)) {  
             &print_error("(dbmopen) $diffdbname �����ޤ���");  
         }  
     } else {  
         if (!tie(%diffbase, "YukiWikiDB", $diffdbname)) {  
             &print_error("(tie error)");  
         }  
     }  
 }  
   
 sub closediff {  
     if ($dbmopen) {  
         dbmclose(%diffbase);  
     } else {  
         untie(%diffbase);  
     }  
 }  
   
 # �ե����फ��ξ����Ϣ������ %form �������  
 # &init_form('euc');  
 sub init_form {  
     my ($charcode) = @_;  
     my $query;  
     if ($ENV{REQUEST_METHOD} =~ /^post$/i) {  
         read(STDIN, $query, $ENV{CONTENT_LENGTH});  
     } else {  
         $query = $ENV{QUERY_STRING};  
     }  
     my @assocarray = split(/[&;]/, $query);  
     foreach my $assoc (@assocarray) {  
         my ($property, $value) = split(/=/, $assoc);  
         $value =~ tr/+/ /;  
         $value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;  
         &jcode::convert(\$value, $charcode);  
         $form{$property} = $value;  
     }  
 }  
   
 # ���顼�ڡ�������Ϥ���  
 sub print_error {  
     my ($msg) = @_;  
     &print_header('Error');  
     print "<h1>$IconTag$msg</h1></body></html>";  
     exit(0);  
 }  
   
 sub escape {  
     my ($line) = shift;  
     $line =~ s|<|&lt;|g;  
     $line =~ s|>|&gt;|g;  
     $line =~ s|"|&quot;|g;  
     # $line =~ s|\&|&amp;|g;  
     return $line;  
 }  
   
 sub inline {  
     my ($line) = shift;  
     $line = &escape($line);  
     $line =~ s|'''([^']+?)'''|<strong>$1</strong>|g;  
     $line =~ s|''([^']+?)''|<em>$1</em>|g;            
     $line =~ s!  
                 (  
                     ((mailto|http|https|ftp):[\x21-\x7E]*) # Direct http://...  
                         |  
                     ($WikiName)                         # LocalLinkLikeThis  
                         |  
                     ($BracketName)                      # [[���ܸ���]]  
                 )  
             !  
                 &make_link($1)  
             !gex;  
     return $line;  
 }  
   
 # �ڡ����Υ����ȥ뤫��ڡ��������Ƥ�����  
 sub get_page {  
     my $page_name = shift;  
     return $database{$page_name};  
 }  
   
 # �ڡ��������Ƥ�Ϳ����  
 # &set_page($title, $txt)  
 sub set_page {  
     # �ڡ����򹹿�����  
     my $title = $_[0];  
     $database{$title} = $_[1];  
     # ���ڡ����ʤ�������  
     unless ($database{$title}) {  
         delete $database{$title};  
     }  
     # RecentChanges�򹹿�����  
     my $delim = ' - ';  
     my @pages = split(/\n/, $database{$whatsnew});  
     my $datestr = &get_current_datestr;  
     unshift(@pages, qq|-$datestr$delim$title|);  
     # Ʊ��ڡ����ι����Ϻǿ��Τ�ΤΤߤˤ���  
     # ¸�ߤ��ʤ��ڡ����ϥ����åפ��롣  
     my %count;  
     my @newpages;  
     foreach my $line (@pages) {  
         my ($prefix, $title) = split(/$delim/, $line);  
         $count{$title}++;  
         if ($count{$title} == 1 and exists($database{$title})) {  
             push(@newpages, qq|$prefix - $title|);  
         }  
     }  
     # �����������˹���  
     $database{$whatsnew} = join("\n", splice(@newpages, 0, $maxnew));  
 }  
   
 # �ڡ����Υإå������  
 sub print_header {  
     my $title = shift;  
     print <<"EOD";  
 Content-type: text/html  
   
 <html><head>  
 <title>$title</title>  
 <style type="text/css">  
 $style  
 </style>  
 </head>  
 <body>  
 EOD  
 }  
   
 # �ġ���С������  
 sub print_toolbar {  
     my $page_name = shift;  
     my $percent_name = &encode_percent($page_name);  
     my $editlink = '';  
     if ($page_name ne '' and &is_editable($page_name)) {  
         $editlink = <<"EOD";  
 <a href="$thisurl?mycmd=edit;mypage=$percent_name">�Խ�</a> |  
 <a href="$thisurl?mycmd=diff;mypage=$percent_name">��ʬ</a> |  
 EOD  
     }  
     print <<"EOD";  
 <p>  
  [  
 <a href="$thisurl?mycmd=read;mypage=$toppage">�ȥå�</a> |  
 <a href="$thisurl?mycmd=list">����</a> |  
 $editlink  
 <a href="$thisurl?mycmd=search">ñ�측��</a> |  
 <a href="$thisurl?mycmd=read;mypage=$whatsnew">�ǽ�����</a>  
  ]  
 </p>  
 EOD  
 }  
   
 # �ڡ����Υեå������  
 sub print_footer {  
     print <<"EOD";  
 <address>  
 <a href="http://www.hyuki.com/yukiwiki/">YukiWiki</a> 1.6.6 Copyright (C) 2000,2001 by <a href="http://www.hyuki.com/">Hiroshi Yuki.</a>  
 + <a href="$modifierlink">$modifier</a> ${version}.  
 [<a href="/" title="���Υ����С��μ���">/</a>  
 <a href="/map" title="���Υ����С��ΰ���">�Ͽ�</a>  
 <a href="/search/" title="���Υ����С��θ���">����</a>]  
 </address>  
 </body></html>  
 EOD  
 }  
   
 # URL��ڡ�����̾�������󥯤���  
 sub make_link {  
     my $name = shift;  
     if ($name =~ /^(http|https|ftp).*?(\.gif|\.png|\.jpeg|\.jpg)?$/) {  
         if ($2) {  
             return qq|<a href="$name"><img border="0" src="$name" /></a>|;  
         } else {  
             return qq|<a href="$name">$name</a>|;  
         }  
     } elsif ($name =~ /^mailto:(.*)/) {  
         my $address = $1;  
         return qq|<a href="$name">$address</a>|;  
     } elsif ($database{$name}) {  
         my $percent_name = &encode_percent($name);  
         return qq|<a href="$thisurl?mycmd=read;mypage=$percent_name">$name</a>|;  
     } else {  
         my $percent_name = &encode_percent($name);  
         return qq|$name<a href="$thisurl?mycmd=edit;mypage=$percent_name">?</a>|;  
     }  
 }  
   
 # %xx �η����˥��󥳡��ɤ���  
 # ����ϡ�  
 # http://www.hyuki.com/yukiwiki/yukiwiki.cgi?mycmd=read&mypage=%3C%8C%8B%8F%E9%8D_%3E  
 # �Ȥ��������Τ���˻Ȥ��롣  
 # '<����>' �� '%3C%8C%8B%8F%E9%8D_%3E'  
 sub encode_percent {  
     my $name = shift;  
     my $encoded = '';  
     foreach my $ch (split(//, $name)) {  
         if ($ch =~ /[A-Za-z0-9_]/) {  
             $encoded .= $ch;  
         } else {  
             $encoded .= '%' . sprintf("%02X", ord($ch));  
         }  
     }  
     return $encoded;  
 }  
   
 # �ƥ��������Τ�HTML���Ѵ�����  
 sub convert_html {  
     my ($txt) = shift;  
     my (@txt) = split(/\n/, $txt);  
     foreach (@txt) {  
         chomp;  
         if (/^\*\*(.*)/) {  
             push(@result, splice(@saved), '<h3>' . &inline($1) . '</h3>');  
         } elsif (/^\*(.*)/) {  
             push(@result, splice(@saved), '<h2>' . &inline($1) . '</h2>');  
         } elsif (/^----/) {  
             push(@result, splice(@saved), '<hr>');  
         } elsif (/^(-{1,3})(.*)/) {  
             &back_push('ul', length($1));  
             push(@result, '<li>' . &inline($2) . '</li>');  
         } elsif (/^:([^:]+):(.*)/) {  
             &back_push('dl', 1);  
             push(@result, '<dt>' . &inline($1) . '</dt>', '<dd>' . &inline($2) . '</dd>');  
         } elsif (/^(>{1,3})(.*)/) {  
             &back_push('blockquote', length($1));  
             push(@result, &inline($2));  
         } elsif (/^\s*$/) {  
             push(@result, splice(@saved));  
             unshift(@saved, "</p>");  
             push(@result, "<p>");  
         } elsif (/^(\s+.*)$/) {  
             &back_push('pre', 1);  
             push(@result, &escape($1)); # Not &inline, but &escape  
         } else {  
             push(@result, &inline($_));  
         }  
     }  
     push(@result, splice(@saved));  
     return join("\n", @result);  
 }  
   
 # &back_push($tag, $count)  
 # $tag�Υ�����$level��٥�ޤǵͤ�롣  
 sub back_push {  
     my ($tag, $level) = @_;  
     while (@saved > $level) {  
         push(@result, shift(@saved));  
     }  
     if ($saved[0] ne "</$tag>") {  
         push(@result, splice(@saved));  
     }  
     while (@saved < $level) {  
         unshift(@saved, "</$tag>");  
         push(@result, "<$tag>");  
     }  
 }  
   
 # �Խ���ǽ�ڡ�������  
 sub is_editable {  
     my ($pagename) = @_;  
     foreach (@uneditable) {  
         if ($pagename eq $_) {  
             return 0;  
         }  
     }  
     if (&is_valid_name($pagename)) {  
         return 1;  
     }  
     return 0;  
 }  
   
 # Valid��̾������  
 sub is_valid_name {  
     my ($pagename) = @_;  
     if ($pagename =~ /^$WikiName$/) {  
         return 1;  
     } elsif ($pagename =~ /^$BracketName$/) {  
         return 1;  
     } else {  
         return 0;  
     }  
 }  
   
 # ���߻����ʸ���������  
 sub get_current_datestr {  
     my (@wdays) = ( "��", "��", "��", "��", "��", "��", "��" );  
     my ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time);  
     return sprintf("%4d-%02d-%02d (%s) %02d:%02d:%02d",  
         $year + 1900, $mon + 1, $mday, $wdays[$wday], $hour, $min, $sec);  
 }  
   
 # URL?SomePage�䡢  
 # URL?[[����]]�η������ä���硢(not yet)  
 # ����Ū��mycmd��read�ˤ���$form�����Ƥ����ꤹ�롣  
 sub normalize_form {  
     foreach my $key (keys %form) {  
         if ($key =~ /^$WikiName$/) {  
             $form{mycmd} = 'read';  
             $form{mypage} = $1;  
             last;  
         } elsif ($key =~ /^$BracketName$/) {  
             $form{mycmd} = 'read';  
             $form{mypage} = $1;  
             last;  
         }  
     }  
 }  
   
 # �Ѵ��ƥ��Ȥ�Ԥʤ��Ȥ��Υ���ץ�  
 sub print_sample {  
     my $txt = &convert_html(<<"EOD");  
 *�縫�Ф�1  
 **�����Ф�1-1  
 -����1  
 -����2  
 -����3  
 ����1����1����1����1����1����1����1����1����1����1����1����1  
 ����1����1����1����1����1����''��Ĵ''1����1����1����1����1����1  
 ����1����1����1����1����1����1����1����1����1����1����1����1  
   
 ����2����2����2����2����2����2����2����2����2����2����2����2  
 ����2����2����2����2����2����2����2����2����2����2����2����2  
 ����2����2����2����2����2����2����2����2����2����2����2����2  
 **�����Ф�1-2  
 :�Ѹ�1:���������񤤤�����ʸ1��''��Ĵñ��''  
 ����1����1����1����1����1����1����1����1����1����1����1����1  
 ����1����1����1����1����1����1����1����1����1����1����1����1  
 ����1����1����1����1����1����1����1����1����1����1����1����1  
 :�Ѹ�2:���������񤤤�����ʸ2  
 :�Ѹ�3:���������񤤤�����ʸ3  
 ----  
 *�縫�Ф�2  
 **�����Ф�2-1  
 http://www.hyuki.com/  
 **�����Ф�2-2  
   
 [[����]]  
   
 ����1����1����1����1����1����1����1����1����1����1����1����1  
 ����1����1����1����'''��Ĵ'''1����1����1����1����1����1����1����1  
 ����1����1����1����'''''������Ĵ'''''1����1����1����1����1����1����1����1����1  
 >����2����2����2����2����2����2����2����2����2����2����2����2  
 >����2����2����2����2����2����2����2����2����2����2����2����2  
 >����2����2����2����2����2����2����2����2����2����2����2����2  
   
 ��٥�0��٥�0��٥�0��٥�0��٥�0��٥�0  
   
 >��٥�1  
 >��٥�1  
 >��٥�1  
 >>��٥�2  
 >>��٥�2  
 >>��٥�2  
 >>>��٥�3  
 -�Ϥ�1  
 --�Ϥ�2  
 ��������2  
 ---�Ϥ�3  
 --�Ϥ�2  
 ---�Ϥ�3  
 --�Ϥ�2  
 ---�Ϥ�3  
 >>>��٥�3  
 >>>��٥�3  
 >>>��٥�3  
 EOD  
     print $txt;  
     exit;  
 }  
   
 sub diff_check {  
     traverse_sequences(  
             $msgrefA, $msgrefB,  
             {  
                 MATCH => \&df_match,  
                 DISCARD_A => \&df_delete,  
                 DISCARD_B => \&df_add,  
             }  
     );  
     &diff_flush;  
 }  
   
 sub diff_flush {  
     $diff_text .= join('', map { "-$_\n" } splice(@diff_deleted));  
     $diff_text .= join('', map { "+$_\n" } splice(@diff_added));  
 }  
   
 sub df_match {  
     my ($a, $b) = @_;  
     &diff_flush;  
     $diff_text .= "=$msgrefA->[$a]\n";  
 }  
   
 sub df_delete {  
     my ($a, $b) = @_;  
     push(@diff_deleted, $msgrefA->[$a]);  
 }  
   
 sub df_add {  
     my ($a, $b) = @_;  
     push(@diff_added, $msgrefB->[$b]);  
 }  
   
 sub calc_message_digest {   # You have to use MD5...  
     my $text = shift;  
     my @text = split(//, $text);  
     my $len = length($text);  
     my $checksum = 0;  
     foreach (@text) {  
         $checksum += ord($_);  
         $checksum = ($checksum * 2) % 65536 + (($checksum & 32768) ? 1 : 0); # 16bit rotate  
     }  
     return "$len:$checksum";  
 }  
   
 # Definition of YukiWikiDB  
 package YukiWikiDB;  
   
 my $debug = 1;  
   
 # Constructor  
 sub new {  
     return shift->TIEHASH(@_);  
 }  
   
 # tying  
 sub TIEHASH {  
     my ($class, $dbname) = @_;  
     my $self = {  
         dir => $dbname,  
         keys => [],  
     };  
     if (not -d $self->{dir}) {  
         if (!mkdir($self->{dir}, 0777)) {  
             print "mkdir(" . $self->{dir} . ") fail\n" if ($debug);  
             return undef;  
         }  
     }  
     return bless($self, $class);  
 }  
   
 # Store  
 sub STORE {  
     my ($self, $key, $val) = @_;  
     my $file = &make_filename($self, $key);  
     if (open(FILE,"> $file")) {  
         binmode(FILE);  
         print FILE $val;  
         close(FILE);  
         return $self->{$key} = $val;  
     } else {  
         print "$file create error.";  
     }  
 }  
   
 # Fetch  
 sub FETCH {  
     my ($self, $key) = @_;  
     my $file = &make_filename($self, $key);  
     if (open(FILE, $file)) {  
         local $/;  
         $self->{$key} = <FILE>;  
         close(FILE);  
     }  
     return $self->{$key};  
 }  
   
 # Exists  
 sub EXISTS {  
     my ($self, $key) = @_;  
     my $file = &make_filename($self, $key);  
     return -e($file);  
 }  
   
 # Delete  
 sub DELETE {  
     my ($self, $key) = @_;  
     my $file = &make_filename($self, $key);  
     unlink $file;  
     return delete $self->{$key};  
 }  
   
 sub FIRSTKEY {  
     my ($self) = @_;  
     opendir(DIR, $self->{dir}) or die $self->{dir};  
     @{$self->{keys}} = grep /\.txt$/, readdir(DIR);  
     foreach my $name (@{$self->{keys}}) {  
         $name =~ s/\.txt$//;  
         $name =~ s/[0-9A-F][0-9A-F]/pack("C", hex($&))/eg;  
     }  
     return shift @{$self->{keys}};  
 }  
   
 sub NEXTKEY {  
     my ($self) = @_;  
     return shift @{$self->{keys}};  
 }  
   
 sub make_filename {  
     my ($self, $key) = @_;  
     my $enkey = '';  
     foreach my $ch (split(//, $key)) {  
         $enkey .= sprintf("%02X", ord($ch));  
     }  
     return $self->{dir} . "/$enkey.txt";  
 }  
 __END__  
11    
12  =head1 NAME  =head1 NAME
13    
14  YukiWiki - ��ͳ�˥ڡ������ɲá�������Խ��Ǥ���Web�ڡ�������CGI  wiki.cgi --- SuikaWiki: Yet yet another WikiEngine
   
     Copyright (C) 2000,2001 by Hiroshi Yuki.  
     ���� <hyuki@hyuki.com>  
     http://www.hyuki.com/  
     http://www.hyuki.com/yukiwiki/  
   
 =head1 SYNOPSIS  
   
     http://www.hyuki.com/yukiwiki/yukiwiki.cgi  
   
 =head1 DESCRIPTION  
   
 YukiWiki�ʷ�륦�������ˤϻ��üԤ���ͳ�˥ڡ������ɲá�������Խ��Ǥ���  
 �Ի׵Ĥ�Web�ڡ���������CGI�Ǥ���  
 Web��ư���Ǽ��ĤȤ���äȻ��Ƥ��ޤ�����  
 Web�Ǽ��Ĥ�ñ�˥�å��������ɲä�������ʤΤ��Ф��ơ�  
 YukiWiki�ϡ�Web�ڡ������Τ�ͳ���ѹ����뤳�Ȥ��Ǥ��ޤ���  
   
 YukiWiki�ϡ�Cunningham & Cunningham��WikiWikiWeb��  
 ���ͤ򻲹ͤˤ����ȼ��˺���ޤ�����  
   
 YukiWiki��Perl�ǽ񤫤줿CGI������ץȤȤ��Ƽ¸�����Ƥ��ޤ��Τǡ�  
 Perl��ư���Web�����Фʤ�����Ū�ưפ����֤Ǥ��ޤ���  
   
 ���Ȥ�dbmopen���Ȥ���Ķ��ʤ�����֤Ǥ��ޤ�(Version 1.5.0�ʹߤʤ�dbmopen���Ȥ��ʤ��Ƥ����֤Ǥ��ޤ�)��  
   
   
 YukiWiki�ϥե꡼���եȤǤ���  
 ����ͳ�ˤ��Ȥ�����������  
   
 =head1 ������ˡ  
   
 =head2 ����  
   
 YukiWiki�κǿ��Ǥϡ�  
 http://www.hyuki.com/yukiwiki/  
 ��������Ǥ��ޤ���  
   
 =head2 �ե��������  
   
     readme.txt      �ɥ������  
     yukiwiki.cgi    YukiWiki����  
     yukiwiki.gif    �����ʥ��顼�ǡ�  
     yukimono.gif    �����ʥ�Υ����ǡ�  
     jcode.pl        ���������ɥ饤�֥��  
   
 =head2 ���󥹥ȡ���  
   
 =over 4  
   
 =item 1.  
   
 ���������֤�򤯡�  
   
 =item 2.  
   
 yukiwiki.cgi�ΤϤ�������ˤ���������ǧ���ޤ���  
 �̾�ϲ��⤷�ʤ��Ƥ褤����  
 �Ϥ����$touchfile��''�ˤ��������褤�Ǥ��礦��  
   
 =item 3.  
   
 yukiwiki.cgi��jcode.pl��Ʊ���Ȥ��������֤��ޤ���  
   
 =item 4.  
   
 ������0��yukiwiki.db�Ȥ����ե���������֤��ޤ���  
 ��Perl�����ƥ�ˤ�äƤ�yukiwiki.pag, yukiwiki.dir��  
   
 =item 5.  
   
 yukiwiki.cgi�˥֥饦�����饢���������ޤ���  
   
 =back  
   
 =head2 �ѡ��ߥå����  
   
         �ե�����        �ѡ��ߥå����      ž���⡼��  
         yukiwiki.cgi    755                 ASCII  
         yukiwiki.gif    644                 BINARY  
         yukimono.gif    644                 BINARY  
         jcode.pl        644                 ASCII  
   
     $dbmopen = 1; �ˤ������:  
         yukiwiki.db     666                 BINARY  
         (yukiwiki.pag, yukiwiki.dir�ξ��⤢���  
   
     $dbmopen = 0; �ˤ������: (�����ȥǥ��쥯�ȥ��777�ˤ��Ƥ���)  
         .               777                 (ž�����ʤ�)  
   
 =head1 �ǡ����ΥХå����å���ˡ  
   
 $dbmopen = 1;�ξ��ϡ�  
 �ǡ����Ϥ��٤�yukiwiki.db(.dir, .pag)�����롣  
 �����Хå����åפ���Ф褤��  
   
 $dbmopen = 0;�ξ��ϡ�  
 yukiwiki�Ȥ����ǥ��쥯�ȥ꤬�Ǥ���Τǡ�  
 ����ʲ���Хå����åפ���Ф褤��  
   
 =head1 �������ڡ����κ����  
   
 =over 4  
   
 =item 1.  
   
 �ޤ���Ŭ���ʥڡ������㤨��FrontPage�ˤ����ӡ�  
 �ڡ����β��ˤ�����Խ��ץ�󥯤򤿤ɤ�ޤ���  
   
 =item 2.  
   
 ����ȥƥ��������Ϥ��Ǥ�����֤ˤʤ�Τǡ�  
 ������NewPage�Τ褦��ñ��  
 ����ʸ����ʸ�����ߤ��Ƥ����ʸ�����  
 ��񤤤ơ���¸�פ��ޤ���  
   
 =item 3.  
   
 ��¸����ȡ�FrontPage�Υڡ������񤭴���ꡢ  
 ���ʤ����񤤤�NewPage�Ȥ���ʸ����θ���� ? �Ȥ�����󥯤�ɽ������ޤ���  
 ���� ? �Ϥ��Υڡ������ޤ�¸�ߤ��ʤ����Ȥ򼨤����Ǥ���  
   
 =item 4.  
15    
16  ���� ? �򥯥�å�����ȿ������ڡ���NewPage���Ǥ��ޤ��Τǡ�  =head1 SEE ALSO
 ���ʤ��ι�����ʸ�Ϥ򤽤ο������ڡ����˽񤤤���¸���ޤ���  
17    
18  =item 5.  <IW:SuikaWiki:SuikaWiki>
19    
20  NewPage�ڡ������Ǥ����FrontPage�� ? �Ͼä��ơ���󥯤Ȥʤ�ޤ���  =head1 LICENSE
21    
22  =back  Copyright 2002-2003 Wakaba <w@suika.fam.cx>
23    
24  =head1 �ƥ����������Υ롼��  This program is free software; you can redistribute it and/or
25    modify it under the same terms as Perl itself.
 =over 4  
   
 =item *  
   
 Ϣ³����ʣ���Ԥϥե��뤵���ɽ������ޤ���  
   
 =item *  
   
 ���Ԥ�����C<< <p> >>�ζ��ڤ�Ȥʤ�ޤ���  
   
 =item *  
   
 HTML�Υ����Ͻ񤱤ޤ���  
   
 =item *  
   
 B<''�ܡ����''>�Τ褦�˥��󥰥륯��������ĤǤϤ���ȡ�  
 �ܡ����C<< <b> >>�ˤʤ�ޤ���  
   
 =item *  
   
 B<'''������å�'''>�Τ褦�˥��󥰥륯�����Ȼ��ĤǤϤ���ȡ�  
 ������å�C<< <i> >>�ˤʤ�ޤ���  
   
 =item *  
   
 B<---->�Τ褦�˥ޥ��ʥ�4�Ĥ�����ȡ�  
 ��ʿ��C<< <hr> >>�ˤʤ�ޤ���  
   
 =item *  
   
 �Ԥ�B<*>�ǤϤ����ȡ�  
 �縫�Ф�C<< <h2> >>�ˤʤ�ޤ���  
   
 =item *  
   
 �Ԥ�B<**>�ǤϤ����ȡ�  
 �����Ф�C<< <h3> >>�ˤʤ�ޤ���  
   
 =item *  
   
 �Ԥ�ޥ��ʥ�-�ǤϤ����ȡ�  
 �վ��C<< <ul> >>�ˤʤ�ޤ���  
 �ޥ��ʥ��ο���������ȥ�٥뤬������ޤ���3��٥�ޤǡ�  
   
     -����1  
     --����1-1  
     --����1-2  
     -����2  
     -����3  
     --����3-1  
     ---����3-1-1  
     ---����3-1-2  
     --����3-2  
   
 =item *  
   
 �������Ȥ��ȡ�  
 �Ѹ�Ȳ���ʸ�Υꥹ��C<< <dl> >>���񤱤ޤ���  
   
     :�Ѹ�1:���������񤤤�����ʸ1  
     :�Ѹ�2:���������񤤤�����ʸ2  
     :�Ѹ�3:���������񤤤�����ʸ3  
   
 =item *  
   
 ���  
   
 =over 4  
   
 =item *  
   
 LinkToSomePage��FrontPage�Τ褦�ˡ�  
 ��ñ��κǽ�ΰ�ʸ������ʸ���ˤ�����Τ�  
 ��İʾ�Ϣ³������Τ�YukiWiki�Υڡ���̾�Ȥʤꡢ  
 ���줬ʸ����˴ޤޤ��ȥ�󥯤ˤʤ�ޤ���  
   
 =item *  
   
 http://www.hyuki.com/ �Τ褦��URL�ϼ�ưŪ�˥�󥯤ˤʤ�ޤ���  
   
 =item *  
   
 ��Ť��礫�ä�[[ ]]�Ǥ����ä�ʸ����⡢  
 YukiWiki�Υڡ���̾�ˤʤ�ޤ���  
 �礫�ä�����ˤϥ��ڡ�����ޤ�ƤϤ����ޤ���  
 ���ܸ��Ȥ��ޤ���  
   
 =back  
   
 =item *  
   
 ��Ƭ�����ڡ����䥿�֤ǻϤޤäƤ���ȡ�  
 ����������Ѥߤ�����C<< <pre> >>�Ȥ��ư����ޤ���  
 �ץ�������ɽ���ʤɤ˻Ȥ��������Ǥ���  
   
   
 =item *  
   
 �Ԥ� > �ǤϤ����ȡ�  
 ����ʸC<< <blockquote> >>���񤱤ޤ���  
 >�ο���¿���ȥ���ǥ�Ȥ������ʤ�ޤ���3��٥�ޤǡˡ�  
   
     >ʸ��  
     >ʸ��  
     >>����ʤ����  
     >ʸ��  
   
 =back  
   
 =head1 ��������  
   
 =over 4  
   
 =item *  
   
 2001ǯ10��20����Version 1.6.6��  
   
 �����ξ����к���  
 ���ڡ����δ�ñ�ʥ����å�������äƤ�����  
 �������˥����å��������Ӥ��롣  
 �����Ľ��digest�Ȥ���ʸ����򸡺������ʬ���롣  
 �����MD5�ʤɤǤ����Ȥ�ä����������Τ�����ɡ�  
   
 ���ͻ���ɽ��������å������ʤɤϡֶ˰��פ���Υڡ����򻲹ͤˤ�����  
   
 =item *  
   
 2001ǯ10��17����Version 1.6.5��  
   
 �ץ�ӥ塼���̤ǡ������ܥ���򲡤����Ȥ������������  
 ��å����������Ƥ�input���Ǥ�type="hidden"��Ȥä�������Τ���롣  
 ����ˡ�textarea���Ǥ�Ȥ���  
 �ƥץ�ӥ塼�Ѥ�myspecial_��Ƴ�����Ǥ⤭�줤���к��ǤϤʤ���  
   
 =item *  
   
 2001ǯ8��30����Version 1.6.4��  
   
 URL�ǥ����쥯�Ȥ˥ڡ���̾����ꤷ�Ƥ⡢  
 $WikiName��$BracketName�ʳ��Υڡ�������ʤ��褦�ˤ�����  
 (is_valid_name��is_editable����)��  
   
 =item *  
   
 2001ǯ8��30����Version 1.6.3��  
   
 RecentChanges���Խ������Խ��ԲĤȤ�����  
 �Խ��Բĥڡ�����@uneditable�˥ڡ���̾������롣  
   
 =item *  
   
 2001ǯ2��25����Version 1.6.1, 1.6.2��  
   
 ��ʬ��ǽ�ΥХ�������  
 do_preview��'>'�������ʤ��Х�����  
 �ʥ桼������λ�Ŧ�ˡ�  
   
 =item *  
   
 2001ǯ2��22����Version 1.6.0��  
 ��ʬ��ǽ�����������  
   
 =item *  
   
 2001ǯ2��19����Version 1.5.4��  
 �����ե�����ؤΥ�󥯤ϲ����ˤ��Ƥߤ���  
   
 =item *  
   
 2001ǯ2��19����Version 1.5.3��  
 RecentChanges����˺�������ڡ���������Τ��᤿��  
 use strict;�ǰ��ä�������ʬ�򾯤�����(�����ǤϤʤ�)��  
   
 =item *  
   
 2001ǯ2��16����Version 1.5.2��  
 textarea��ɽ������ӥץ�ӥ塼�������� < �� > �� &lt; �� &gt; ���Ѵ�����  
 (do_preview, editpage, print_preview_buttons)��  
   
 =item *  
   
 2000ǯ12��27����Version 1.5.1��  
 �ץ�ӥ塼���̤�����������  
   
 =item *  
   
 2000ǯ12��22����Version 1.5.0��  
 ����Ū�ˤ����֤��ľ������  
 ���������Ӻ�������褦�ˤ���(do_list)��  
 �񤭹������˳�ǧ���̤�Ф��褦�ˤ���(do_preview)��  
 �ƥ����Ȥν������Խ����̤����줿(do_edit, do_reedit)��  
 WhatsNew��RecentChanges��TopPage��FrontPage���ѹ�������  
   
 =item *  
   
 2000ǯ12��20����Version 1.1.0��  
 tie�����Ѥ��ơ�dbmopen���Ȥ��ʤ����Ǥ�ư���褦�˽�����  
 ���ѼԤ�1�ͤǤ���ֶ˰��פ��󤫤�  
 ���äƤ��������������ɤ򸵤ˤ��Ƥ��ޤ���  
   
 =item *  
   
 2000ǯ9��5����Version 1.0.2��  
  <body color=...> �� <body bgcolor=...>  
 ���ѼԤ���λ�Ŧ�ˤ�롣���ա�  
   
 =item *  
   
 2000ǯ8��6����Version 1.0.1�������  
 C MAGAZINE�ʥ��եȥХ󥯥ѥ֥�å��󥰡�  
 2000ǯ10���Ϣ�ܵ������������ǡ�  
 [[ ]] �κǸ夬��˾�פΤ褦�˥��ե�JIS��  
 0x5D�ˤʤ���β����Ԥʤä���  
   
 =item *  
   
 2000ǯ8��5����Version 1.0.0�������  
   
 =item *  
   
 2000ǯ7��23����Version 0.82�������  
 �Խ����Υ�󥯥ߥ���  
 <textarea>��°���ѹ���  
   
 =item *  
   
 2000ǯ7��22����Version 0.81�������  
 �������Ȥ߹��ࡣ  
   
 =item *  
   
 2000ǯ7��21����Version 0.80�������  
 POD��CGI��˽񤭹��ࡣ  
   
 =item *  
   
 2000ǯ7��19����Version 0.70�������  
 '''������å�'''�䡢--��---��>>��>>>�ʤɤ������  
   
 =item *  
   
 2000ǯ7��18����Version 0.60�������  
 *����*��''����''���ѹ�  
   
 =item *  
   
 2000ǯ7��17����Version 0.50�������  
   
 =item *  
   
 2000ǯ7��17��������ˤ��������ɲä��롣  
   
 =item *  
   
 2000ǯ7��16�������������ɲá�  
   
 =item *  
   
 2000ǯ7��15����������  
   
 =back  
   
 =head1 TODO  
   
     - �ƥ�����ɽ���⡼��  
     - Charset��������  
     - textarea����Ĥ������б�  
     - ��˥塼�αѸ�ɽ���յ�  
     - �ץ�ӥ塼�Υܥ���ǡ�mymsg��input��value������Ƥ��뤬�����Ԥ򤽤Τޤ�value�ˤ���ƤϤ����ʤ��ΤǤϤʤ�����  
     - �ֺ��Խ��פε�ǽ�ϥ֥饦���� back �ǽ�ʬ�ǤϤʤ������ץ�ӥ塼�Ϥ�äȥ���ץ�ˡ�  
     - �ڡ��������ȥ��Wikiname�ˤ������ˤ�����褦�ˤ��롣  
     - InterWiki���ε�ǽ��URL�򱣤��Ĥġ���󥯤�ĥ���  
   
 =head1 ���  
   
     Copyright (C) 2000 by Hiroshi Yuki.  
     ���� <hyuki@hyuki.com>  
     http://www.hyuki.com/  
     http://www.hyuki.com/yukiwiki/  
   
 ���䡢�ո����Х����� hyuki@hyuki.com �˥᡼�뤷�Ƥ���������  
   
 =head1 ���۾��  
   
 YukiWiki�ϡ�  
 GNU General Public License�ˤƸ������ޤ���  
   
 YukiWiki�ϥե꡼���եȤǤ���  
 ����ͳ�ˤ��Ȥ�����������  
 ��ʬ���ߤ�YukiWiki������褦�˥���ץ�ˤ��Ƥ���ޤ���  
   
 =head1 �ռ�  
   
 �ܲȤ�WikiWiki���ä�Cunningham & Cunningham, Inc.��  
 ���դ��ޤ���  
   
 YukiWiki��ڤ���ǻȤäƤ�������  
 �ͥåȾ�������˴��դ��ޤ���  
   
 YukiWiki�Υ�����ǥ����󤷤Ƥ������ä��������व��  
 http://city.hokkai.or.jp/~reina/  
 �˴��դ��ޤ���  
   
 tie��Ȥä��Ǥθ��ˤʤ륳���ɤ����äƤ������ä�  
 �ֶ˰��פ���˴��դ��ޤ���  
   
 =head1 ���ȥ��  
   
 =over 4  
   
 =item *  
   
 YukiWiki�ۡ���ڡ���  
 http://www.hyuki.com/yukiwiki/  
   
 =item *  
   
 �ܲȤ�WikiWiki  
 http://c2.com/cgi/wiki?WikiWikiWeb  
   
 =item *  
   
 �ܲȤ�WikiWiki�κ��(Cunningham & Cunningham, Inc.)  
 http://c2.com/  
   
 =item *  
   
 YukiWiki�Υ����ǥ�����򤷤Ƥ������ä��������व��Υڡ���  
 http://city.hokkai.or.jp/~reina/  
   
 =back  
26    
27  =cut  =cut
28    
29    1; # $Date$

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.54

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24  
Google Analytics is used in this page; Cookies are used. 忍者AdMax is used in this page; Cookies are used. Privacy policy.