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

Contents of /suikawiki/script/wiki.cgi

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations) (download)
Mon Feb 4 13:19:08 2002 UTC (24 years, 5 months ago) by wakaba
Branch: MAIN
Branch point for: walwiki
2002-02-02  wakaba <wakaba@suika.fam.cx>

	* wiki.cgi: New file.
	* ChangeLog: Likewise.

1 wakaba 1.1 #!/usr/local/bin/perl
2     use lib "../lib";
3     use CGI::Carp 'fatalsToBrowser';
4     use Algorithm::Diff qw(traverse_sequences);
5     # use strict;
6     #
7     # yukiwiki.cgi - Yet another WikiWikiWeb clone.
8     #
9     # Copyright (C) 2000,2001 by Hiroshi Yuki.
10     # <[email protected]>
11     # http://www.hyuki.com/yukiwiki/
12     #
13     # This program is free software; you can redistribute it and/or modify
14     # it under the terms of the GNU General Public License as published by
15     # the Free Software Foundation; either version 2 of the License, or
16     # (at your option) any later version.
17     #
18     # This program is distributed in the hope that it will be useful,
19     # but WITHOUT ANY WARRANTY; without even the implied warranty of
20     # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21     # GNU General Public License for more details.
22     #
23     # $Id: yukiwiki.cgi,v 1.1.1.1 2002/02/04 13:13:24 wakaba Exp $
24     ##############################
25     my $version = "1.6.6";
26     ##############################
27     # �P�ƃe�X�g�̂Ƃ��ɂ� 1 �ɂ���B
28     my $testing = 0;
29     ##############################
30     # �������C�u����
31     my $jcodelib = 'jcode.pl';
32     ##############################
33     # �ۑ��E�\���̊����R�[�h
34     my $kanjicode = 'sjis'; # 'sjis' 'euc'
35     my $charset = 'Shift_JIS'; # 'Shift_JIS' 'EUC-JP'
36     ##############################
37     # dbmopen���g����Ȃ�1�A�g���Ȃ��Ȃ�0
38     my $dbmopen = 0;
39     ##############################
40     # �f�[�^�x�[�X���i.pag, .dir, .db�Ȃǂ͕s�v�j
41     # $dbmopen = 1�̂Ƃ��̓f�[�^�x�[�X���A
42     # $dbmopen = 0�̂Ƃ��̓f�B���N�g�����ɂȂ�B
43     my $dbname = './yukiwiki';
44     my $diffdbname = './yukidiff';
45     ##############################
46     # �C���҂̎����i���R�ɕύX���Ă��������j
47     my $modifier = 'Hiroshi Yuki';
48     ##############################
49     # �C���҂�Web�y�[�W�i���R�ɕύX���Ă��������j
50     my $modifierlink = 'http://www.hyuki.com/';
51     ##############################
52     # ���̃y�[�W��URL
53     my $thisurl = 'yukiwiki.cgi';
54     ##############################
55     # �J�n�y�[�W��
56     my $toppage = 'FrontPage';
57     ##############################
58     # �ŏI�X�V�y�[�W��
59     my $whatsnew = 'RecentChanges';
60     ##############################
61     # �ŏI�X�V�Ɍf�ڂ���y�[�W��
62     my $maxnew = 50;
63     ##############################
64     # �A�C�R���t�@�C�����i�J���[�Łj
65     my $iconfile = 'yukiwiki.gif';
66     ##############################
67     # �A�C�R���t�@�C�����i���m�N���Łj
68     # my $iconfile = 'yukimono.gif';
69     ##############################
70     # �y�[�W��ύX�����Ƃ���touch����t�@�C���i''�Ȃ牽�����Ȃ��j
71     my $touchfile = 'touch.txt';
72     ##############################
73     # �v���r���[�p�̔w�i�F
74     my $preview_color = '#FFCCCC';
75     ##############################
76     # �S�y�[�W�̃X�^�C��
77     my $style = <<'EOD';
78     pre, dl, ul, ol, p, blockquote { line-height:120%; }
79     a { text-decoration: none; }
80     a:link { color: #0000FF; background-color: #FFFFFF; }
81     a:visited { color: #9900CC; background-color: #FFFFFF; }
82     a:hover { text-decoration: underline; }
83     EOD
84     ##############################
85     # �e�L�X�g���͕����̑傫��
86     my $cols = 80;
87     my $rows = 20;
88     ##############################
89     my %form = ();
90     my %database = ();
91     my %diffbase = ();
92     my $diff_text = '';
93     my @diff_added = ();
94     my @diff_deleted = ();
95     my $msgrefA;
96     my $msgrefB;
97     ##############################
98     # �ҏW�s�ƒy�[�W���ꗗ
99     my @uneditable = ( $whatsnew );
100     ##############################
101     # �����N�p�̐��K�\��
102     # YukiWiki�̃����N��2��ނ���B
103     #
104     # (1) WikiName (RecentChanges�Ƃ�FrontPage�̂悤�Ȃ���)
105     # (2) BracketName ([[����_]]�Ƃ�[[�g���u���V���[�g]]�̂悤�Ȃ���)
106     #
107     # ���V�t�gJIS��2�o�C�g�ڂɂ� ']' ��������̂ŁA
108     # ����']'��1�‘����Ƃ�悤�ɂ��Ă���B
109     #
110     my $WikiName = '([A-Z][a-z]+([A-Z][a-z]+)+)';
111     my $BracketName = '\[\[([^>\s]+?\]?)\]\]';
112    
113     # �A�C�R�������̃^�O
114     my $IconTag = <<"EOD";
115     <a href="http://www.hyuki.com/yukiwiki/"><img src="$iconfile"
116     border="0" width="80" height="80" alt="[YukiWiki]" /></a>
117     EOD
118    
119     require "$jcodelib";
120    
121     &init_form($kanjicode);
122    
123     if ($testing) {
124     %form = (
125     # 'mycmd' => 'write',
126     'mycmd' => 'read',
127     #'mycmd' => 'search',
128     #'mycmd' => 'edit',
129     'mymsg' => <<"EOD",
130     �͂��߂܂��āB
131     ���ꂩ�炢�낢�돑�����݂܂��ˁB
132     LinkPage�����Ă��������B
133     TestPage�͂ǂ��ł��傤���B
134     �ǂ�����낵���B
135     http://www.hyuki.com/
136     [[����_]]
137     EOD
138     'mypage' => '<����_>',
139     'myword' => '��',
140     # '3C8C8B8FE98D5F3E' => '',
141     # 'TestPage' => '',
142     );
143     }
144     &main;
145     exit(0);
146    
147     # ���C��
148     sub main {
149     &normalize_form;
150     if ($dbmopen) {
151     if (!dbmopen(%database, $dbname, 0666)) {
152     &print_error("(dbmopen) $dbname �����܂���B");
153     }
154     } else {
155     if (!tie(%database, "YukiWikiDB", $dbname)) {
156     &print_error("(tie error)");
157     }
158     }
159    
160     # myspecial�Ή�
161     foreach (keys %form) {
162     if (/^myspecial_(.*)/) {
163     $form{mycmd} = $1;
164     last;
165     }
166     }
167    
168     if ($form{mycmd} eq 'read') {
169     &do_read;
170     } elsif ($form{mycmd} eq 'preview') {
171     &do_preview;
172     } elsif ($form{mycmd} eq 'write') {
173     &do_write;
174     } elsif ($form{mycmd} eq 'edit') {
175     &do_edit;
176     } elsif ($form{mycmd} eq 'reedit') {
177     &do_reedit;
178     } elsif ($form{mycmd} eq 'search') {
179     &do_search;
180     } elsif ($form{mycmd} eq 'list') {
181     &do_list;
182     } elsif ($form{mycmd} eq 'diff') {
183     &do_diff;
184     } else {
185     $form{mypage} = $toppage;
186     &do_read;
187     }
188     if ($dbmopen) {
189     dbmclose(%database);
190     } else {
191     untie(%database);
192     }
193     }
194    
195     # �y�[�W�̕\��
196     sub do_read {
197     my $page_name = $form{mypage};
198     my $percent_name = &encode_percent($page_name);
199     &print_header($page_name);
200     print qq|<h1>$IconTag<a href="$thisurl?mycmd=search&myword=$percent_name">$page_name</a></h1>\n|;
201     &print_toolbar($page_name);
202     print &convert_html(&get_page($page_name));
203     &print_footer;
204     }
205    
206     # �y�[�W�̕ҏW
207     sub do_edit {
208     if (not &is_editable($form{mypage})) {
209     # �ҏW�s�ƒy�[�W�͕\���̂�
210     &do_read;
211     return;
212     }
213     &editpage(&get_page($form{mypage}));
214     }
215    
216     # �y�[�W�̍ĕҏW
217     sub do_reedit {
218     if (not &is_editable($form{mypage})) {
219     # �ҏW�s�ƒy�[�W�͕\���̂�
220     &do_read;
221     } else {
222     &editpage($form{mymsg});
223     }
224     }
225    
226     sub editpage {
227     my $page_msg = shift;
228     my $page_name = $form{mypage};
229     my $digest = &calc_message_digest($page_msg);
230     &print_header($page_name);
231     print qq|<h1>$IconTag${page_name}�̕ҏW</h1>\n|;
232     &print_toolbar($page_name);
233     $page_msg = &escape($page_msg);
234     print <<"EOD";
235     <form action="$thisurl" method="post">
236     <input type="hidden" name="mycmd" value="preview">
237     <input type="hidden" name="mypage" value="$page_name">
238     <input type="hidden" name="mydigest" value="$digest">
239     <textarea cols="$cols" rows="$rows" name="mymsg" wrap="virtual">$page_msg</textarea><br>
240     <input type="submit" value="�v���r���[">
241     </form>
242     <hr>
243     <h3>�e�L�X�g���`�̃��[��</h3>
244    
245     <p>�ʏ�͓��͂������������̂܂܏o�͂���܂����A
246     �ȉ��̃��[���ɏ]���ăe�L�X�g���`���s�����Ƃ��ł��܂��B</p>
247    
248     <ul>
249     <li>
250     ��s�͒i���̋�؂�ƂȂ�܂��B
251    
252     <li>
253     HTML�̃^�O�͏����܂���B
254    
255     <li>
256     ''�{�[���h''�̂悤�ɃV���O���N�H�[�g��‚ł͂��ނƁA�{�[���h�ɂȂ�܂��B
257    
258     <li>
259     '''�C�^���b�N'''�̂悤�ɃV���O���N�H�[�g�O�‚ł͂��ނƁA�C�^���b�N�ɂȂ�܂��B
260    
261     <li>
262     ----�̂悤�Ƀ}�C�i�X4�‚�����ƁA�������ɂȂ�܂��B
263    
264     <li>
265     *���s���ɏ����Ƒ匩�o���ɂȂ�܂��B
266    
267     <li>
268     **���s���ɏ����Ə����o���ɂȂ�܂��B
269    
270     <li>
271     -���s���ɏ����Ɖӏ������ɂȂ�܂��B- -- --- ��3���x��������܂��B
272    
273     <li>
274     :���s���ɏ����Ɨp��Ɖ���������܂��B
275    
276     <pre>
277     :�p��1:���낢�돑���������1
278     :�p��2:���낢�돑���������2
279     :�p��3:���낢�돑���������3
280     </pre>
281    
282     <li>
283     http://www.hyuki.com/ �̂悤��URL�͎����I�Ƀ����N�ɂȂ�܂��B
284    
285     <li>
286     YukiWiki�̂悤�ɑ啶�����������������p������������ƁA
287     YukiWiki�̃y�[�W���ɂȂ�܂��B
288    
289     <li>
290     [[����_]]�̂悤�ɓ�d�̑傩����[[ ]]�ł�������������������ƁA
291     YukiWiki�̃y�[�W���ɂȂ�܂��B
292     �傩�����̒��ɂ̓X�y�[�X���܂߂Ă͂����܂���B
293     ���{����g���܂��B
294    
295     <li>
296     �s�����X�y�[�X�Ŏn�܂��Ă���ƁA
297     ���̒i���͐��`�ς݈����܂��B
298     �v���O�������������ނƂ��Ɏg���ƕ֗��ł��B
299    
300     <li>
301     > ���s���ɏ����ƁA
302     ���p���������܂��B
303     >�̐��������ƃC���f���g���[���Ȃ�܂��i3���x���܂Łj�B
304    
305     </ul>
306     EOD
307     &print_footer;
308     }
309    
310     # �y�[�W�̌���
311     sub do_search {
312     if ($form{myword}) {
313     &print_header('��������');
314     print qq|<h1>$IconTag$form{myword}�̌�������</h1>\n|;
315     &print_toolbar();
316     print qq|<ul>\n|;
317     my $count = 0;
318     foreach my $page_name (sort keys %database) { # sort����͖̂��d����
319     if ($database{$page_name} =~ /\Q$form{'myword'}\E/) {
320     my $encoded = &encode_percent($page_name);
321     print qq|<li><a href="$thisurl?mycmd=read&mypage=$encoded">$page_name</a>\n|;
322     $count++;
323     }
324     }
325     print qq|</ul>\n|;
326     if ($count > 0) {
327     print qq|<p><b>$form{myword}</b>���܂ރy�[�W�́A��Ɏ���<b>$count</b>�y�[�W�ł��B</p>\n|;
328     } else {
329     print qq|<p><b>$form{myword}</b>���܂ރy�[�W�͌��‚���܂���B</p>\n|;
330     }
331     } else {
332     &print_header('�P�ꌟ��');
333     print qq|<h1>$IconTag�P�ꌟ��</h1>\n|;
334     &print_toolbar();
335     }
336     print <<"EOD";
337     <p>
338     <form action="$thisurl" method="post">
339     <input type="hidden" name="mycmd" value="search">
340     <input type="text" name="myword" size="20" value="$form{myword}">
341     <input type="submit" value="�P�ꌟ��">
342     </form>
343     </p>
344     EOD
345     &print_footer;
346     }
347    
348     # �y�[�W�̈ꗗ
349     sub do_list {
350     &print_header('�y�[�W�ꗗ');
351     print qq|<h1>$IconTag �y�[�W�ꗗ</h1>\n|;
352     &print_toolbar();
353     print qq|<ul>\n|;
354     foreach my $page_name (sort keys %database) { # sort����͖̂��d����
355     my $encoded = &encode_percent($page_name);
356     print qq|<li><a href="$thisurl?mycmd=read&mypage=$encoded">$page_name</a>\n|
357     }
358     print qq|</ul>\n|;
359     &print_footer;
360     }
361    
362     # �v���r���[
363     sub do_preview {
364     my $page_name = $form{mypage};
365     my $escapedmsg = &escape($form{mymsg});
366     &print_header($page_name);
367     print qq|<h1>$IconTag${page_name}�̃v���r���[</h1>\n|;
368     &print_toolbar($page_name);
369     # local $percent_name = &encode_percent($page_name);
370     print qq|<p>�ȉ��̃v���r���[���m�F���āA�悯��΃y�[�W�����̃{�^���ōX�V���Ă��������B</p>\n|;
371     if ($form{mymsg}) {
372     print qq|<table width="100%" bgcolor="$preview_color" ><tr><td>\n|;
373     # print &convert_html($escapedmsg);
374     print &convert_html($form{mymsg});
375     print qq|</td></tr></table>\n|;
376     } else {
377     print qq|<p>�i�y�[�W�̓��e�͋�ł��B�X�V����Ƃ��̃y�[�W��<b>�폜</b>����܂��B�j</p>\n|;
378     }
379     &print_preview_buttons($page_name, $escapedmsg, $form{mydigest});
380     &print_footer;
381     }
382    
383     sub print_preview_buttons {
384     my ($page_name, $escapedmsg, $digest) = @_;
385     print <<"EOD";
386     <form action="$thisurl" method="post">
387     <textarea cols="$cols" rows="$rows" name="mymsg" wrap="virtual">$escapedmsg</textarea>
388     <br />
389     <input type="hidden" name="mypage" value="$page_name">
390     <input type="hidden" name="mydigest" value="$digest">
391     <input type="submit" name="myspecial_preview" value="�ēx�v���r���[">
392     <input type="submit" name="myspecial_write" value="�y�[�W�̍X�V">
393     </form>
394     EOD
395     }
396    
397     # ��������
398     sub do_write {
399     if (not &is_editable($form{mypage})) {
400     # �ҏW�s�ƒy�[�W�͕\���̂�
401     &do_read;
402     return;
403     }
404    
405     my $page_name = $form{mypage};
406    
407     # digest���g���āA�X�V�̏Փ˃`�F�b�N
408     my $original_digest = &calc_message_digest(&get_page($page_name));
409     if ($form{mydigest} ne $original_digest) {
410     &print_header($page_name);
411     print qq|<h1>$IconTag${page_name}�Ły�X�V�̏Փˁz���N���܂���</h1>\n|;
412     print <<"EOD";
413     <p>���Ȃ������̃y�[�W��ҏW���Ă���ԂɁA
414     ���̐l�������y�[�W���X�V���Ă��܂����悤�ł��B
415     </p><p>
416     �ȉ��ɁA���Ȃ��̕ҏW�����e�L�X�g������܂��̂ŁA
417     ���Ȃ��̕ҏW���e�������Ȃ��悤�ɁA
418     ���܂����A�������ȂǂɃR�s�[���y�[�X�g���Ă��������B
419     </p><p>
420     �R�s�[���y�[�X�g���ς�ł���A
421     �ŐV�̓��e�����čēx�ҏW�������Ă��������B
422     �ŐV�̓��e��
423     <a target="_blank" href="$thisurl?mycmd=read&mypage=$form{mypage}">$form{mypage}</a>
424     �Ō��邱�Ƃ��ł��܂��B
425     </p>
426     EOD
427     # &print_toolbar($page_name);
428     &print_preview_buttons($page_name, &escape($form{mymsg}), $form{mydigest});
429     &print_footer;
430     return;
431     }
432    
433     # diff����
434     {
435     &opendiff;
436     my @msg1 = split(/\n/, &get_page($page_name));
437     my @msg2 = split(/\n/, $form{mymsg});
438     $msgrefA = \@msg1;
439     $msgrefB = \@msg2;
440     &diff_check;
441     $diffbase{$form{mypage}} = $diff_text;
442     $diff_text = '';
443     &closediff;
444     }
445    
446     &print_header($page_name);
447     &set_page($page_name, $form{mymsg});
448     if ($form{mymsg}) {
449     print qq|<h1>$IconTag${page_name}���X�V���܂���</h1>\n|;
450     &print_toolbar($page_name);
451     print &convert_html(&get_page($page_name));
452     } else {
453     print qq|<h1>$IconTag${page_name}���폜���܂���</h1>\n|;
454     &print_toolbar($page_name);
455     print qq|<p>${page_name}���폜���܂����B</p>\n|;
456     }
457     &print_footer;
458     # �X�V���ꂽ�̂Ń^�b�`���Ă����B
459     if ($touchfile) {
460     open(FILE, "> $touchfile");
461     print FILE "\n";
462     close(FILE);
463     }
464     }
465    
466     # �y�[�W�̕ύX�_
467     sub do_diff {
468     if (not &is_editable($form{mypage})) {
469     # �ҏW�s�ƒy�[�W�͕\���̂�
470     &do_read;
471     return;
472     }
473     &opendiff;
474     &print_header($form{mypage} . '�̕ύX�_');
475     print qq|<h1>$IconTag <a href="$thisurl?mycmd=read&mypage=$form{mypage}">$form{mypage}</a>�̕ύX�_</h1>\n|;
476     &print_toolbar();
477     $_ = &escape($diffbase{$form{mypage}});
478     print <<"EOD";
479     <ul>
480     <li>�lj����ꂽ�s��<font color="blue">�F</font>�ł��B
481     <li>�폜���ꂽ�s��<font color="red">�ԐF</font>�ł��B
482     <li><a href="$thisurl?mycmd=read&mypage=$form{mypage}">$form{mypage}</a>�֍s���B
483     </ul>
484     <hr />
485     EOD
486     print qq|<pre>\n|;
487     foreach (split(/\n/, $_)) {
488     if (/^\+(.*)/) {
489     print qq|<font color="blue">$1</font>\n|;
490     } elsif (/^\-(.*)/) {
491     print qq|<font color="red">$1</font>\n|;
492     } elsif (/^\=(.*)/) {
493     print qq|$1\n|;
494     } else {
495     print qq|??? $_\n|;
496     }
497     }
498     print qq|</pre>\n|;
499     &print_footer;
500     &closediff;
501     }
502    
503     sub opendiff {
504     if ($dbmopen) {
505     if (!dbmopen(%diffbase, $diffdbname, 0666)) {
506     &print_error("(dbmopen) $diffdbname �����܂���B");
507     }
508     } else {
509     if (!tie(%diffbase, "YukiWikiDB", $diffdbname)) {
510     &print_error("(tie error)");
511     }
512     }
513     }
514    
515     sub closediff {
516     if ($dbmopen) {
517     dbmclose(%diffbase);
518     } else {
519     untie(%diffbase);
520     }
521     }
522    
523     # �t�H�[������̏���A�z�z�� %form �ɓ����
524     # &init_form('euc');
525     sub init_form {
526     my ($charcode) = @_;
527     my $query;
528     if ($ENV{REQUEST_METHOD} =~ /^post$/i) {
529     read(STDIN, $query, $ENV{CONTENT_LENGTH});
530     } else {
531     $query = $ENV{QUERY_STRING};
532     }
533     my @assocarray = split(/&/, $query);
534     foreach my $assoc (@assocarray) {
535     my ($property, $value) = split(/=/, $assoc);
536     $value =~ tr/+/ /;
537     $value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;
538     &jcode::convert(\$value, $charcode);
539     $form{$property} = $value;
540     }
541     }
542    
543     # �G���[�y�[�W���o�͂���
544     sub print_error {
545     my ($msg) = @_;
546     &print_header('Error');
547     print "<h1>$IconTag$msg</h1></body></html>";
548     exit(0);
549     }
550    
551     sub escape {
552     my ($line) = shift;
553     $line =~ s|<|&lt;|g;
554     $line =~ s|>|&gt;|g;
555     $line =~ s|"|&quot;|g;
556     # $line =~ s|\&|&amp;|g;
557     return $line;
558     }
559    
560     sub inline {
561     my ($line) = shift;
562     $line = &escape($line);
563     $line =~ s|'''([^']+?)'''|<i>$1</i>|g; # Italic
564     $line =~ s|''([^']+?)''|<b>$1</b>|g; # Bold
565     $line =~ s!
566     (
567     ((mailto|http|https|ftp):[\x21-\x7E]*) # Direct http://...
568     |
569     ($WikiName) # LocalLinkLikeThis
570     |
571     ($BracketName) # [[���{�ꃊ���N]]
572     )
573     !
574     &make_link($1)
575     !gex;
576     return $line;
577     }
578    
579     # �y�[�W�̃^�C�g������y�[�W�̓��e�𓾂�
580     sub get_page {
581     my $page_name = shift;
582     return $database{$page_name};
583     }
584    
585     # �y�[�W�̓��e��^����
586     # &set_page($title, $txt)
587     sub set_page {
588     # �y�[�W���X�V����
589     my $title = $_[0];
590     $database{$title} = $_[1];
591     # ��y�[�W�Ȃ�폜����
592     unless ($database{$title}) {
593     delete $database{$title};
594     }
595     # RecentChanges���X�V����
596     my $delim = ' - ';
597     my @pages = split(/\n/, $database{$whatsnew});
598     my $datestr = &get_current_datestr;
599     unshift(@pages, qq|-$datestr$delim$title|);
600     # ����y�[�W�̍X�V�͍ŐV�̂��݂̂̂ɂ��A
601     # ���݂��Ȃ��y�[�W�̓X�L�b�v����B
602     my %count;
603     my @newpages;
604     foreach my $line (@pages) {
605     my ($prefix, $title) = split(/$delim/, $line);
606     $count{$title}++;
607     if ($count{$title} == 1 and exists($database{$title})) {
608     push(@newpages, qq|$prefix - $title|);
609     }
610     }
611     # �����Ŗ{���ɍX�V
612     $database{$whatsnew} = join("\n", splice(@newpages, 0, $maxnew));
613     }
614    
615     # �y�[�W�̃w�b�_���o��
616     sub print_header {
617     my $title = shift;
618     print <<"EOD";
619     Content-type: text/html
620    
621     <html><head>
622     <title>$title</title>
623     <style type="text/css">
624     <!--
625     $style
626     -->
627     </style>
628     </head>
629     <body bgcolor="white">
630     EOD
631     }
632    
633     # �c�[���o�[���o��
634     sub print_toolbar {
635     my $page_name = shift;
636     my $percent_name = &encode_percent($page_name);
637     my $editlink = '';
638     if ($page_name ne '' and &is_editable($page_name)) {
639     $editlink = <<"EOD";
640     <a href="$thisurl?mycmd=edit&mypage=$percent_name">�ҏW</a> |
641     <a href="$thisurl?mycmd=diff&mypage=$percent_name">����</a> |
642     EOD
643     }
644     print <<"EOD";
645     <p>
646     [
647     <a href="$thisurl?mycmd=read&mypage=$toppage">�g�b�v</a> |
648     <a href="$thisurl?mycmd=list">�ꗗ</a> |
649     $editlink
650     <a href="$thisurl?mycmd=search">�P�ꌟ��</a> |
651     <a href="$thisurl?mycmd=read&mypage=$whatsnew">�ŏI�X�V</a>
652     ]
653     </p>
654     EOD
655     }
656    
657     # �y�[�W�̃t�b�^���o��
658     sub print_footer {
659     print <<"EOD";
660     <hr>
661     <p>
662     <a href="http://www.hyuki.com/yukiwiki/">YukiWiki</a> $version Copyright (C) 2000,2001 by <a href="http://www.hyuki.com/">Hiroshi Yuki.</a><br />
663     Modified by <a href="$modifierlink">$modifier</a>.<br/>
664     </p>
665     </body></html>
666     EOD
667     }
668    
669     # URL��y�[�W�̖��O���烊���N�����
670     sub make_link {
671     my $name = shift;
672     if ($name =~ /^(http|https|ftp).*?(\.gif|\.png|\.jpeg|\.jpg)?$/) {
673     if ($2) {
674     return qq|<a href="$name"><img border="0" src="$name" /></a>|;
675     } else {
676     return qq|<a href="$name">$name</a>|;
677     }
678     } elsif ($name =~ /^mailto:(.*)/) {
679     my $address = $1;
680     return qq|<a href="$name">$address</a>|;
681     } elsif ($database{$name}) {
682     my $percent_name = &encode_percent($name);
683     return qq|<a href="$thisurl?mycmd=read&mypage=$percent_name">$name</a>|;
684     } else {
685     my $percent_name = &encode_percent($name);
686     return qq|$name<a href="$thisurl?mycmd=edit&mypage=$percent_name">?</a>|;
687     }
688     }
689    
690     # %xx �̌`���ɃG���R�[�h����
691     # ����́A
692     # http://www.hyuki.com/yukiwiki/yukiwiki.cgi?mycmd=read&mypage=%3C%8C%8B%8F%E9%8D_%3E
693     # �Ƃ����`���̂��߂Ɏg����B
694     # '<����_>' �� '%3C%8C%8B%8F%E9%8D_%3E'
695     sub encode_percent {
696     my $name = shift;
697     my $encoded = '';
698     foreach my $ch (split(//, $name)) {
699     if ($ch =~ /[A-Za-z0-9_]/) {
700     $encoded .= $ch;
701     } else {
702     $encoded .= '%' . sprintf("%02X", ord($ch));
703     }
704     }
705     return $encoded;
706     }
707    
708     # �e�L�X�g�{�̂�HTML�ɕϊ�����
709     sub convert_html {
710     my ($txt) = shift;
711     my (@txt) = split(/\n/, $txt);
712     foreach (@txt) {
713     chomp;
714     if (/^\*\*(.*)/) {
715     push(@result, splice(@saved), '<h3>' . &inline($1) . '</h3>');
716     } elsif (/^\*(.*)/) {
717     push(@result, splice(@saved), '<h2>' . &inline($1) . '</h2>');
718     } elsif (/^----/) {
719     push(@result, splice(@saved), '<hr>');
720     } elsif (/^(-{1,3})(.*)/) {
721     &back_push('ul', length($1));
722     push(@result, '<li>' . &inline($2) . '</li>');
723     } elsif (/^:([^:]+):(.*)/) {
724     &back_push('dl', 1);
725     push(@result, '<dt>' . &inline($1) . '</dt>', '<dd>' . &inline($2) . '</dd>');
726     } elsif (/^(>{1,3})(.*)/) {
727     &back_push('blockquote', length($1));
728     push(@result, &inline($2));
729     } elsif (/^\s*$/) {
730     push(@result, splice(@saved));
731     unshift(@saved, "</p>");
732     push(@result, "<p>");
733     } elsif (/^(\s+.*)$/) {
734     &back_push('pre', 1);
735     push(@result, &escape($1)); # Not &inline, but &escape
736     } else {
737     push(@result, &inline($_));
738     }
739     }
740     push(@result, splice(@saved));
741     return join("\n", @result);
742     }
743    
744     # &back_push($tag, $count)
745     # $tag�̃^�O��$level���x���܂ŋl�߂�B
746     sub back_push {
747     my ($tag, $level) = @_;
748     while (@saved > $level) {
749     push(@result, shift(@saved));
750     }
751     if ($saved[0] ne "</$tag>") {
752     push(@result, splice(@saved));
753     }
754     while (@saved < $level) {
755     unshift(@saved, "</$tag>");
756     push(@result, "<$tag>");
757     }
758     }
759    
760     # �ҏW�”\�y�[�W���H
761     sub is_editable {
762     my ($pagename) = @_;
763     foreach (@uneditable) {
764     if ($pagename eq $_) {
765     return 0;
766     }
767     }
768     if (&is_valid_name($pagename)) {
769     return 1;
770     }
771     return 0;
772     }
773    
774     # Valid�Ȗ��O���H
775     sub is_valid_name {
776     my ($pagename) = @_;
777     if ($pagename =~ /^$WikiName$/) {
778     return 1;
779     } elsif ($pagename =~ /^$BracketName$/) {
780     return 1;
781     } else {
782     return 0;
783     }
784     }
785    
786     # ���ݎ����̕�����𓾂�
787     sub get_current_datestr {
788     my (@wdays) = ( "��", "��", "��", "��", "��", "��", "�y" );
789     my ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time);
790     return sprintf("%4d-%02d-%02d (%s) %02d:%02d:%02d",
791     $year + 1900, $mon + 1, $mday, $wdays[$wday], $hour, $min, $sec);
792     }
793    
794     # URL?SomePage��A
795     # URL?[[����_]]�̌`���������ꍇ�A(not yet)
796     # �����I��mycmd��read�ɂ���$form�̓��e��ݒ肷��B
797     sub normalize_form {
798     foreach my $key (keys %form) {
799     if ($key =~ /^$WikiName$/) {
800     $form{mycmd} = 'read';
801     $form{mypage} = $1;
802     last;
803     } elsif ($key =~ /^$BracketName$/) {
804     $form{mycmd} = 'read';
805     $form{mypage} = $1;
806     last;
807     }
808     }
809     }
810    
811     # �ϊ��e�X�g���s�Ȃ��Ƃ��̃T���v��
812     sub print_sample {
813     my $txt = &convert_html(<<"EOD");
814     *�匩�o��1
815     **�����o��1-1
816     -����1
817     -����2
818     -����3
819     �i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1
820     �i��1�i��1�i��1�i��1�i��1�i��''����''1�i��1�i��1�i��1�i��1�i��1
821     �i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1
822    
823     �i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2
824     �i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2
825     �i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2
826     **�����o��1-2
827     :�p��1:���낢�돑���������1��''�����P��''
828     �i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1
829     �i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1
830     �i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1
831     :�p��2:���낢�돑���������2
832     :�p��3:���낢�돑���������3
833     ----
834     *�匩�o��2
835     **�����o��2-1
836     http://www.hyuki.com/
837     **�����o��2-2
838    
839     [[����_]]
840    
841     �i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1
842     �i��1�i��1�i��1�i��'''�C�^���b�N'''1�i��1�i��1�i��1�i��1�i��1�i��1�i��1
843     �i��1�i��1�i��1�i��'''''�C�^�{�[���h'''''1�i��1�i��1�i��1�i��1�i��1�i��1�i��1�i��1
844     >�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2
845     >�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2
846     >�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2�i��2
847    
848     ���x��0���x��0���x��0���x��0���x��0���x��0
849    
850     >���x��1
851     >���x��1
852     >���x��1
853     >>���x��2
854     >>���x��2
855     >>���x��2
856     >>>���x��3
857     -�͂�1
858     --�͂�2
859     �����2
860     ---�͂�3
861     --�͂�2
862     ---�͂�3
863     --�͂�2
864     ---�͂�3
865     >>>���x��3
866     >>>���x��3
867     >>>���x��3
868     EOD
869     print $txt;
870     exit;
871     }
872    
873     sub diff_check {
874     traverse_sequences(
875     $msgrefA, $msgrefB,
876     {
877     MATCH => \&df_match,
878     DISCARD_A => \&df_delete,
879     DISCARD_B => \&df_add,
880     }
881     );
882     &diff_flush;
883     }
884    
885     sub diff_flush {
886     $diff_text .= join('', map { "-$_\n" } splice(@diff_deleted));
887     $diff_text .= join('', map { "+$_\n" } splice(@diff_added));
888     }
889    
890     sub df_match {
891     my ($a, $b) = @_;
892     &diff_flush;
893     $diff_text .= "=$msgrefA->[$a]\n";
894     }
895    
896     sub df_delete {
897     my ($a, $b) = @_;
898     push(@diff_deleted, $msgrefA->[$a]);
899     }
900    
901     sub df_add {
902     my ($a, $b) = @_;
903     push(@diff_added, $msgrefB->[$b]);
904     }
905    
906     sub calc_message_digest { # You have to use MD5...
907     my $text = shift;
908     my @text = split(//, $text);
909     my $len = length($text);
910     my $checksum = 0;
911     foreach (@text) {
912     $checksum += ord($_);
913     $checksum = ($checksum * 2) % 65536 + (($checksum & 32768) ? 1 : 0); # 16bit rotate
914     }
915     return "$len:$checksum";
916     }
917    
918     # Definition of YukiWikiDB
919     package YukiWikiDB;
920    
921     my $debug = 1;
922    
923     # Constructor
924     sub new {
925     return shift->TIEHASH(@_);
926     }
927    
928     # tying
929     sub TIEHASH {
930     my ($class, $dbname) = @_;
931     my $self = {
932     dir => $dbname,
933     keys => [],
934     };
935     if (not -d $self->{dir}) {
936     if (!mkdir($self->{dir}, 0777)) {
937     print "mkdir(" . $self->{dir} . ") fail\n" if ($debug);
938     return undef;
939     }
940     }
941     return bless($self, $class);
942     }
943    
944     # Store
945     sub STORE {
946     my ($self, $key, $val) = @_;
947     my $file = &make_filename($self, $key);
948     if (open(FILE,"> $file")) {
949     binmode(FILE);
950     print FILE $val;
951     close(FILE);
952     return $self->{$key} = $val;
953     } else {
954     print "$file create error.";
955     }
956     }
957    
958     # Fetch
959     sub FETCH {
960     my ($self, $key) = @_;
961     my $file = &make_filename($self, $key);
962     if (open(FILE, $file)) {
963     local $/;
964     $self->{$key} = <FILE>;
965     close(FILE);
966     }
967     return $self->{$key};
968     }
969    
970     # Exists
971     sub EXISTS {
972     my ($self, $key) = @_;
973     my $file = &make_filename($self, $key);
974     return -e($file);
975     }
976    
977     # Delete
978     sub DELETE {
979     my ($self, $key) = @_;
980     my $file = &make_filename($self, $key);
981     unlink $file;
982     return delete $self->{$key};
983     }
984    
985     sub FIRSTKEY {
986     my ($self) = @_;
987     opendir(DIR, $self->{dir}) or die $self->{dir};
988     @{$self->{keys}} = grep /\.txt$/, readdir(DIR);
989     foreach my $name (@{$self->{keys}}) {
990     $name =~ s/\.txt$//;
991     $name =~ s/[0-9A-F][0-9A-F]/pack("C", hex($&))/eg;
992     }
993     return shift @{$self->{keys}};
994     }
995    
996     sub NEXTKEY {
997     my ($self) = @_;
998     return shift @{$self->{keys}};
999     }
1000    
1001     sub make_filename {
1002     my ($self, $key) = @_;
1003     my $enkey = '';
1004     foreach my $ch (split(//, $key)) {
1005     $enkey .= sprintf("%02X", ord($ch));
1006     }
1007     return $self->{dir} . "/$enkey.txt";
1008     }
1009     __END__
1010    
1011     =head1 NAME
1012    
1013     YukiWiki - ���R�Ƀy�[�W��lj��E�폜�E�ҏW�ł���Web�y�[�W�\�zCGI
1014    
1015     Copyright (C) 2000,2001 by Hiroshi Yuki.
1016     ����_ <[email protected]>
1017     http://www.hyuki.com/
1018     http://www.hyuki.com/yukiwiki/
1019    
1020     =head1 SYNOPSIS
1021    
1022     http://www.hyuki.com/yukiwiki/yukiwiki.cgi
1023    
1024     =head1 DESCRIPTION
1025    
1026     YukiWiki�i����E�B�L�B�j�͎Q���҂����R�Ƀy�[�W��lj��E�폜�E�ҏW�ł���
1027     �s�v�c��Web�y�[�W�Q�����CGI�ł��B
1028     Web�œ��삷��f���‚Ƃ�����Ǝ��Ă��܂����A
1029     Web�f���‚��P�Ƀ��b�Z�[�W��lj����邾���Ȃ̂ɑ΂��āA
1030     YukiWiki�́AWeb�y�[�W�S�̂����R�ɕύX���邱�Ƃ��ł��܂��B
1031    
1032     YukiWiki�́ACunningham & Cunningham��WikiWikiWeb��
1033     �d�l���Q�l�ɂ��ēƎ��ɍ���܂����B
1034    
1035     YukiWiki��Perl�ŏ����ꂽCGI�X�N���v�g�Ƃ��Ď�������Ă��܂��̂ŁA
1036     Perl�����삷��Web�T�[�o�Ȃ�Δ�r�I�e�Ղɐݒu�ł��܂��B
1037    
1038     ���Ƃ�dbmopen���g����‹��Ȃ�ΐݒu�ł��܂�(Version 1.5.0�ȍ~�Ȃ�dbmopen���g���Ȃ��Ă��ݒu�ł��܂�)�B
1039    
1040    
1041     YukiWiki�̓t���[�\�t�g�ł��B
1042     �����R�ɂ��g�����������B
1043    
1044     =head1 �ݒu���@
1045    
1046     =head2 ����
1047    
1048     YukiWiki�̍ŐV�ł́A
1049     http://www.hyuki.com/yukiwiki/
1050     �������ł��܂��B
1051    
1052     =head2 �t�@�C���ꗗ
1053    
1054     readme.txt �h�L�������g
1055     yukiwiki.cgi YukiWiki�{��
1056     yukiwiki.gif ���S�i�J���[�Łj
1057     yukimono.gif ���S�i���m�N���Łj
1058     jcode.pl �����R�[�h���C�u����
1059    
1060     =head2 �C���X�g�[��
1061    
1062     =over 4
1063    
1064     =item 1.
1065    
1066     �A�[�J�C�u�������B
1067    
1068     =item 2.
1069    
1070     yukiwiki.cgi�̂͂��߂̕��ɂ���ݒ���m�F���܂��B
1071     �ʏ�͉������Ȃ��Ă悢���A
1072     �͂��߂�$touchfile��''�ɂ��������悢�ł��傤�B
1073    
1074     =item 3.
1075    
1076     yukiwiki.cgi��jcode.pl�𓯂��Ƃ���ɐݒu���܂��B
1077    
1078     =item 4.
1079    
1080     �T�C�Y0��yukiwiki.db�Ƃ����t�@�C����ݒu���܂��B
1081     �iPerl�V�X�e���ɂ���Ă�yukiwiki.pag, yukiwiki.dir�j
1082    
1083     =item 5.
1084    
1085     yukiwiki.cgi�Ƀu���E�U����A�N�Z�X���܂��B
1086    
1087     =back
1088    
1089     =head2 �p�[�~�b�V����
1090    
1091     �t�@�C�� �p�[�~�b�V���� �]�����[�h
1092     yukiwiki.cgi 755 ASCII
1093     yukiwiki.gif 644 BINARY
1094     yukimono.gif 644 BINARY
1095     jcode.pl 644 ASCII
1096    
1097     $dbmopen = 1; �ɂ����ꍇ:
1098     yukiwiki.db 666 BINARY
1099     (yukiwiki.pag, yukiwiki.dir�̏ꍇ������j
1100    
1101     $dbmopen = 0; �ɂ����ꍇ: (�J�����g�f�B���N�g����777�ɂ��Ă���)
1102     . 777 (�]�����Ȃ�)
1103    
1104     =head1 �f�[�^�̃o�b�N�A�b�v���@
1105    
1106     $dbmopen = 1;�̏ꍇ�́A
1107     �f�[�^�͂��ׂ�yukiwiki.db(.dir, .pag)�ɓ���B
1108     ������o�b�N�A�b�v����΂悢�B
1109    
1110     $dbmopen = 0;�̏ꍇ�́A
1111     yukiwiki�Ƃ����f�B���N�g�����ł���̂ŁA
1112     ����ȉ����o�b�N�A�b�v����΂悢�B
1113    
1114     =head1 �V�����y�[�W�̍���
1115    
1116     =over 4
1117    
1118     =item 1.
1119    
1120     �܂��A�K���ȃy�[�W�i�Ⴆ��FrontPage�j��I�сA
1121     �y�[�W�̉��ɂ���u�ҏW�v�����N�����ǂ�܂��B
1122    
1123     =item 2.
1124    
1125     ����ƃe�L�X�g���͂��ł����ԂɂȂ�̂ŁA
1126     ������NewPage�̂悤�ȒP��
1127     �i�啶�����������݂��Ă���p������j
1128     �������āu�ۑ��v���܂��B
1129    
1130     =item 3.
1131    
1132     �ۑ�����ƁAFrontPage�̃y�[�W�����������A
1133     ���Ȃ���������NewPage�Ƃ���������̌��� ? �Ƃ��������N���\������܂��B
1134     ���� ? �͂��̃y�[�W���܂����݂��Ȃ����Ƃ�������ł��B
1135    
1136     =item 4.
1137    
1138     ���� ? ���N���b�N����ƐV�����y�[�WNewPage���ł��܂��̂ŁA
1139     ���Ȃ��̍D���ȕ��͂����̐V�����y�[�W�ɏ����ĕۑ����܂��B
1140    
1141     =item 5.
1142    
1143     NewPage�y�[�W���ł����FrontPage�� ? �͏����āA�����N�ƂȂ�܂��B
1144    
1145     =back
1146    
1147     =head1 �e�L�X�g���`�̃��[��
1148    
1149     =over 4
1150    
1151     =item *
1152    
1153     �A�����������s�̓t�B������ĕ\������܂��B
1154    
1155     =item *
1156    
1157     ��s�͒i��C<< <p> >>�̋�؂�ƂȂ�܂��B
1158    
1159     =item *
1160    
1161     HTML�̃^�O�͏����܂���B
1162    
1163     =item *
1164    
1165     B<''�{�[���h''>�̂悤�ɃV���O���N�H�[�g��‚ł͂��ނƁA
1166     �{�[���hC<< <b> >>�ɂȂ�܂��B
1167    
1168     =item *
1169    
1170     B<'''�C�^���b�N'''>�̂悤�ɃV���O���N�H�[�g�O�‚ł͂��ނƁA
1171     �C�^���b�NC<< <i> >>�ɂȂ�܂��B
1172    
1173     =item *
1174    
1175     B<---->�̂悤�Ƀ}�C�i�X4�‚�����ƁA
1176     ������C<< <hr> >>�ɂȂ�܂��B
1177    
1178     =item *
1179    
1180     �s��B<*>�ł͂��߂�ƁA
1181     �匩�o��C<< <h2> >>�ɂȂ�܂��B
1182    
1183     =item *
1184    
1185     �s��B<**>�ł͂��߂�ƁA
1186     �����o��C<< <h3> >>�ɂȂ�܂��B
1187    
1188     =item *
1189    
1190     �s���}�C�i�X-�ł͂��߂�ƁA
1191     �ӏ�����C<< <ul> >>�ɂȂ�܂��B
1192     �}�C�i�X�̐���������ƃ��x����������܂��i3���x���܂Łj
1193    
1194     -����1
1195     --����1-1
1196     --����1-2
1197     -����2
1198     -����3
1199     --����3-1
1200     ---����3-1-1
1201     ---����3-1-2
1202     --����3-2
1203    
1204     =item *
1205    
1206     �R�������g���ƁA
1207     �p��Ɖ�����̃��X�gC<< <dl> >>�������܂��B
1208    
1209     :�p��1:���낢�돑���������1
1210     :�p��2:���낢�돑���������2
1211     :�p��3:���낢�돑���������3
1212    
1213     =item *
1214    
1215     �����N
1216    
1217     =over 4
1218    
1219     =item *
1220    
1221     LinkToSomePage��FrontPage�̂悤�ɁA
1222     �p�P��̍ŏ��̈ꕶ����啶���ɂ������̂�
1223     ��ˆȏ�A���������̂�YukiWiki�̃y�[�W���ƂȂ�A
1224     ���ꂪ���͒��Ɋ܂܂��ƃ����N�ɂȂ�܂��B
1225    
1226     =item *
1227    
1228     http://www.hyuki.com/ �̂悤��URL�͎����I�Ƀ����N�ɂȂ�܂��B
1229    
1230     =item *
1231    
1232     ��d�̑傩����[[ ]]�ł���������������A
1233     YukiWiki�̃y�[�W���ɂȂ�܂��B
1234     �傩�����̒��ɂ̓X�y�[�X���܂߂Ă͂����܂���B
1235     ���{����g���܂��B
1236    
1237     =back
1238    
1239     =item *
1240    
1241     �s�����X�y�[�X��^�u�Ŏn�܂��Ă���ƁA
1242     ����͐��`�ς݂̒i��C<< <pre> >>�Ƃ��Ĉ����܂��B
1243     �v���O�����̕\���ȂǂɎg���ƕ֗��ł��B
1244    
1245    
1246     =item *
1247    
1248     �s�� > �ł͂��߂�ƁA
1249     ���p��C<< <blockquote> >>�������܂��B
1250     >�̐��������ƃC���f���g���[���Ȃ�܂��i3���x���܂Łj�B
1251    
1252     >����
1253     >����
1254     >>����Ȃ���p
1255     >����
1256    
1257     =back
1258    
1259     =head1 �X�V����
1260    
1261     =over 4
1262    
1263     =item *
1264    
1265     2001�N10��20���AVersion 1.6.6�B
1266    
1267     �X�V�̏Փˑ΍�B
1268     ���y�[�W�̊ȒP�ȃ`�F�b�N�T��������Ă����A
1269     �X�V�O�Ƀ`�F�b�N�T�����r����B
1270     �C������digest�Ƃ������������������Ε�����B
1271     �{����MD5�Ȃǂł����Ƃ�������������̂�����ǁB
1272    
1273     �Փˎ��ɕ\������郁�b�Z�[�W�Ȃǂ́u�Ɉ��v����̃y�[�W���Q�l�ɂ����B
1274    
1275     =item *
1276    
1277     2001�N10��17���AVersion 1.6.5�B
1278    
1279     �v���r���[��ʂŁA�X�V�{�^�����������Ƃ��ɑ��M�����
1280     ���b�Z�[�W�̓��e��input�v�f��type="hidden"���g���Ė��ߍ��ނ̂���߂�B
1281     ����ɁAtextarea�v�f���g���B
1282     �ăv���r���[�p��myspecial_�𓱓��B�ł����ꂢ�ȑ΍�ł͂Ȃ��B
1283    
1284     =item *
1285    
1286     2001�N8��30���AVersion 1.6.4�B
1287    
1288     URL�Ń_�C���N�g�Ƀy�[�W�����w�肵�Ă��A
1289     $WikiName��$BracketName�ȊO�̃y�[�W�����Ȃ��悤�ɂ����B
1290     (is_valid_name��is_editable�Q��)�B
1291    
1292     =item *
1293    
1294     2001�N8��30���AVersion 1.6.3�B
1295    
1296     RecentChanges��ҏW�E�ĕҏW�s�‚Ƃ����B
1297     �ҏW�s�ƒy�[�W��@uneditable�Ƀy�[�W��������B
1298    
1299     =item *
1300    
1301     2001�N2��25���AVersion 1.6.1, 1.6.2�B
1302    
1303     �����@�\�̃o�O�C���B
1304     do_preview��'>'�������Ȃ��o�O���C��
1305     �i���[�U����̎w�E�j�B
1306    
1307     =item *
1308    
1309     2001�N2��22���AVersion 1.6.0�B
1310     �����@�\�����������B
1311    
1312     =item *
1313    
1314     2001�N2��19���AVersion 1.5.4�B
1315     �摜�t�@�C���ւ̃����N�͉摜�ɂ��Ă݂��B
1316    
1317     =item *
1318    
1319     2001�N2��19���AVersion 1.5.3�B
1320     RecentChanges�̒��ɍ폜�����y�[�W������̂���߂��B
1321     use strict;�ň��������镔������������(���S�ł͂Ȃ�)�B
1322    
1323     =item *
1324    
1325     2001�N2��16���AVersion 1.5.2�B
1326     textarea�ɕ\������уv���r���[����O�� < �� > �� &lt; �� &gt; �ɕϊ�����
1327     (do_preview, editpage, print_preview_buttons)�B
1328    
1329     =item *
1330    
1331     2000�N12��27���AVersion 1.5.1�B
1332     �v���r���[��ʂ𐮗������B
1333    
1334     =item *
1335    
1336     2000�N12��22���AVersion 1.5.0�B
1337     �S�̓I�ɂ����Ԃ񏑂��������B
1338     �ꗗ��ʓr�쐬����悤�ɂ���(do_list)�B
1339     �������ޑO�Ɋm�F��ʂ��o���悤�ɂ���(do_preview)�B
1340     �e�L�X�g�̏�������ҏW��ʂɓ��ꂽ(do_edit, do_reedit)�B
1341     WhatsNew��RecentChanges�ATopPage��FrontPage�ɕύX�����B
1342    
1343     =item *
1344    
1345     2000�N12��20���AVersion 1.1.0�B
1346     tie�𗘗p���āAdbmopen���g���Ȃ��ꍇ�ł����삷��悤�ɏC���B
1347     ���p�҂�1�l�ł���u�Ɉ��v���񂩂�
1348     �����Ă����������R�[�h�����ɂ��Ă��܂��B
1349    
1350     =item *
1351    
1352     2000�N9��5���AVersion 1.0.2�B
1353     <body color=...> �� <body bgcolor=...>
1354     ���p�҂���̎w�E�ɂ��B���ӁB
1355    
1356     =item *
1357    
1358     2000�N8��6���AVersion 1.0.1�����J�B
1359     C MAGAZINE�i�\�t�g�o���N�p�u���b�V���O�j
1360     2000�N10�����A�ڋL���������J�ŁB
1361     [[ ]] �̍Ōオ�u�]�v�̂悤�ɃV�t�gJIS��
1362     0x5D�ɂȂ�ꍇ�̉�����s�Ȃ����B
1363    
1364     =item *
1365    
1366     2000�N8��5���AVersion 1.0.0�����J�B
1367    
1368     =item *
1369    
1370     2000�N7��23���AVersion 0.82�����J�B
1371     �ҏW���̃����N�~�X�B
1372     <textarea>�̑����ύX�B
1373    
1374     =item *
1375    
1376     2000�N7��22���AVersion 0.81�����J�B
1377     ���S��g�ݍ��ށB
1378    
1379     =item *
1380    
1381     2000�N7��21���AVersion 0.80�����J�B
1382     POD��CGI���ɏ������ށB
1383    
1384     =item *
1385    
1386     2000�N7��19���AVersion 0.70�����J�B
1387     '''�C�^���b�N'''��A--�A---�A>>�A>>>�Ȃǂ������B
1388    
1389     =item *
1390    
1391     2000�N7��18���AVersion 0.60�����J�B
1392     *����*��''����''�ɕύX
1393    
1394     =item *
1395    
1396     2000�N7��17���AVersion 0.50�����J�B
1397    
1398     =item *
1399    
1400     2000�N7��17���A����ɂ��낢��lj�����B
1401    
1402     =item *
1403    
1404     2000�N7��16���A���낢��lj��B
1405    
1406     =item *
1407    
1408     2000�N7��15���A���J�B
1409    
1410     =back
1411    
1412     =head1 TODO
1413    
1414     - �e�L�X�g�\�����[�h
1415     - Charset�𖾎��B
1416     - textarea���̕‚��^�O�Ή�
1417     - ���j���[�̉p��\�L�t�L
1418     - �v���r���[�̃{�^���ŁAmymsg��input��value�ɓ���Ă��邪�A���s�����̂܂�value�ɂ���Ă͂����Ȃ��̂ł͂Ȃ����B
1419     - �u�ĕҏW�v�̋@�\�̓u���E�U�� back �ŏ[���ł͂Ȃ����B�v���r���[�͂����ƃV���v���ɁB
1420     - �y�[�W�^�C�g���iWikiname�j�������ɂ�����悤�ɂ���B
1421     - InterWiki���̋@�\�uURL���B���‚A�����N�𒣂�v
1422    
1423     =head1 ���
1424    
1425     Copyright (C) 2000 by Hiroshi Yuki.
1426     ����_ <[email protected]>
1427     http://www.hyuki.com/
1428     http://www.hyuki.com/yukiwiki/
1429    
1430     ����A�ӌ��A�o�O�񍐂� [email protected] �Ƀ��[�����Ă��������B
1431    
1432     =head1 �z�z����
1433    
1434     YukiWiki�́A
1435     GNU General Public License�ɂČ��J���܂��B
1436    
1437     YukiWiki�̓t���[�\�t�g�ł��B
1438     �����R�ɂ��g�����������B
1439     �����D�݂�YukiWiki������悤�ɃV���v���ɂ��Ă���܂��B
1440    
1441     =head1 �ӎ�
1442    
1443     �{�Ƃ�WikiWiki�������Cunningham & Cunningham, Inc.��
1444     ���ӂ��܂��B
1445    
1446     YukiWiki���y����Ŏg���Ă�������
1447     �l�b�g��̕��X�Ɋ��ӂ��܂��B
1448    
1449     YukiWiki�̃��S���f�U�C�����Ă������������{��ނ���
1450     http://city.hokkai.or.jp/~reina/
1451     �Ɋ��ӂ��܂��B
1452    
1453     tie���g�����ł̌��ɂȂ�R�[�h�𑗂��Ă���������
1454     �u�Ɉ��v����Ɋ��ӂ��܂��B
1455    
1456     =head1 �Q�ƃ����N
1457    
1458     =over 4
1459    
1460     =item *
1461    
1462     YukiWiki�z�[���y�[�W
1463     http://www.hyuki.com/yukiwiki/
1464    
1465     =item *
1466    
1467     �{�Ƃ�WikiWiki
1468     http://c2.com/cgi/wiki?WikiWikiWeb
1469    
1470     =item *
1471    
1472     �{�Ƃ�WikiWiki�̍��(Cunningham & Cunningham, Inc.)
1473     http://c2.com/
1474    
1475     =item *
1476    
1477     YukiWiki�̃��S�f�U�C�������Ă������������{��ނ���̃y�[�W
1478     http://city.hokkai.or.jp/~reina/
1479    
1480     =back
1481    
1482     =cut

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24