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> |
|
|
> ���Ƭ�˽ȡ� |
|
|
����ʸ���ޤ��� |
|
|
> �ο���¿���ȥ���ǥ�Ȥ������ʤ�ޤ���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|<|<|g; |
|
|
$line =~ s|>|>|g; |
|
|
$line =~ s|"|"|g; |
|
|
# $line =~ s|\&|&|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��ɽ������ӥץ�ӥ塼�������� < �� > �� < �� > ���Ѵ����� |
|
|
(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$ |