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

Contents of /suikawiki/script/wiki.cgi

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.9 - (show annotations) (download)
Sun Mar 24 00:55:15 2002 UTC (24 years, 7 months ago) by wakaba
Branch: MAIN
Changes since 1.8: +1491 -1491 lines
Change newline from 0x0D0A to 0x0A.

1 #!/usr/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: wiki.cgi,v 1.7 2002/02/04 15:27:22 wakaba Exp $
24 ##############################
25 my $version = "1.6.6";
26 ##############################
27 # ñ�ȥƥ��ȤΤȤ��ˤ� 1 �ˤ��롣
28 my $testing = 0;
29 ##############################
30 # �����饤�֥��
31 my $jcodelib = 'jcode.pl';
32 ##############################
33 # ��¸��ɽ���δ���������
34 my $kanjicode = 'euc'; # 'sjis' 'euc'
35 my $charset = 'euc-jisx0213'; # 'Shift_JIS' 'EUC-JP'
36 ##############################
37 # dbmopen���Ȥ���ʤ�1���Ȥ��ʤ��ʤ�0
38 my $dbmopen = 0;
39 ##############################
40 # �ǡ����١���̾��.pag, .dir, .db�ʤɤ����ס�
41 # $dbmopen = 1�ΤȤ��ϥǡ����١���̾��
42 # $dbmopen = 0�ΤȤ��ϥǥ��쥯�ȥ�̾�ˤʤ롣
43 my $dbname = './wikidata';
44 my $diffdbname = './wikidiff';
45 ##############################
46 # �����Ԥλ�̾�ʼ�ͳ���ѹ����Ƥ���������
47 my $modifier = 'suika';
48 ##############################
49 # �����Ԥ�Web�ڡ����ʼ�ͳ���ѹ����Ƥ���������
50 my $modifierlink = 'http://suika.fam.cx/';
51 ##############################
52 # ���Υڡ�����URL
53 my $thisurl = 'wiki';
54 ##############################
55 # ���ϥڡ���̾
56 my $toppage = 'HomePage';
57 ##############################
58 # �ǽ������ڡ���̾
59 my $whatsnew = 'RecentChanges';
60 ##############################
61 # �ǽ������˷Ǻܤ���ڡ�����
62 my $maxnew = 50;
63 ##############################
64 # ��������ե�����̾�ʥ��顼�ǡ�
65 my $iconfile = '';
66 ##############################
67 # ��������ե�����̾�ʥ�Υ����ǡ�
68 # my $iconfile = '';
69 ##############################
70 # �ڡ������ѹ������Ȥ���touch����ե������''�ʤ鲿�⤷�ʤ���
71 my $touchfile = 'touch.txt';
72 ##############################
73 # �ץ�ӥ塼�Ѥ��طʿ�
74 my $preview_color = '#FFCCCC';
75 ##############################
76 # ���ڡ����Υ�������
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 # �ƥ�����������ʬ���礭��
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 # �Խ��Բĥڡ���̾����
99 my @uneditable = ( $whatsnew );
100 ##############################
101 # ����Ѥ�����ɽ��
102 # YukiWiki�Υ�󥯤�2���ढ�롣
103 #
104 # (1) WikiName (RecentChanges�Ȥ�FrontPage�Τ褦�ʤ��)
105 # (2) BracketName ([[����]]�Ȥ�[[�ȥ�֥륷�塼��]]�Τ褦�ʤ��)
106 #
107 # �����ե�JIS��2�Х����ܤˤ� ']' ���褦��Τǡ�
108 # ʸ��']'��1��¿���Ȥ�褦�ˤ��Ƥ��롣
109 #
110 my $WikiName = '([A-Z][a-z]+([A-Z][a-z]+)+)';
111 my $BracketName = '\[\[([^>\x09]+?\]?)\]\]';
112
113 # ����������ʬ�Υ���
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 �Ϥ���ޤ��ơ�
131 ���줫�餤�������񤭹��ߤޤ��͡�
132 LinkPage�⸫�Ƥ���������
133 TestPage�Ϥɤ��Ǥ��礦����
134 �ɤ������������
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 # �ᥤ��
148 sub main {
149 &normalize_form;
150 if ($dbmopen) {
151 if (!dbmopen(%database, $dbname, 0666)) {
152 &print_error("(dbmopen) $dbname �����ޤ���");
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 # �ڡ�����ɽ��
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 # �ڡ������Խ�
207 sub do_edit {
208 if (not &is_editable($form{mypage})) {
209 # �Խ��Բĥڡ�����ɽ���Τ�
210 &do_read;
211 return;
212 }
213 &editpage(&get_page($form{mypage}));
214 }
215
216 # �ڡ����κ��Խ�
217 sub do_reedit {
218 if (not &is_editable($form{mypage})) {
219 # �Խ��Բĥڡ�����ɽ���Τ�
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}���Խ�</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" name="myspecial_preview" value="��ǧ">
241 <input type="submit" name="myspecial_write" value="��ǧ�����ѹ�">
242 </form>
243 <hr>
244 <h3>�ƥ����������Υ롼��</h3>
245
246 <p>�̾�����Ϥ���ʸ�������Τޤ޽��Ϥ���ޤ�����
247 �ʲ��Υ롼��˽��äƥƥ�����������Ԥ����Ȥ��Ǥ��ޤ���</p>
248
249 <ul>
250 <li>
251 ���Ԥ�����ζ��ڤ�Ȥʤ�ޤ���
252
253 <li>
254 HTML�Υ����Ͻ񤱤ޤ���
255
256 <li>
257 ''��Ĵ''�Τ褦�˥��󥰥륯��������ĤǤϤ���ȡ���Ĵ�ˤʤ�ޤ���
258
259 <li>
260 '''���˶�Ĵ'''�Τ褦�˥��󥰥륯�����Ȼ��ĤǤϤ���ȡ����˶�Ĵ�ˤʤ�ޤ���
261
262 <li>
263 ----�Τ褦�˥ޥ��ʥ�4�Ĥ�����ȡ���ʿ���ˤʤ�ޤ���
264
265 <li>
266 *���Ƭ�˽񤯤��縫�Ф��ˤʤ�ޤ���
267
268 <li>
269 **���Ƭ�˽񤯤Ⱦ����Ф��ˤʤ�ޤ���
270
271 <li>
272 -���Ƭ�˽񤯤Ȳվ�񤭤ˤʤ�ޤ���- -- --- ��3��٥뤬����ޤ���
273
274 <li>
275 :���Ƭ�˽񤯤��Ѹ�Ȳ���ʸ�����ޤ���
276
277 <pre>
278 :�Ѹ�1:���������񤤤�����ʸ1
279 :�Ѹ�2:���������񤤤�����ʸ2
280 :�Ѹ�3:���������񤤤�����ʸ3
281 </pre>
282
283 <li>
284 http://www.hyuki.com/ �Τ褦��URL�ϼ�ưŪ�˥�󥯤ˤʤ�ޤ���
285
286 <li>
287 YukiWiki�Τ褦����ʸ����ʸ���򺮤�����ʸ�����񤯤ȡ�
288 YukiWiki�Υڡ���̾�ˤʤ�ޤ���
289
290 <li>
291 [[����]]�Τ褦����Ť��礫�ä�[[ ]]�Ǥ����ä�ʸ�����񤯤ȡ�
292 YukiWiki�Υڡ���̾�ˤʤ�ޤ���
293 �礫�ä�����ˤϥ��ڡ�����ޤ�ƤϤ����ޤ���
294 ���ܸ��Ȥ��ޤ���
295
296 <li>
297 ��Ƭ�����ڡ����ǻϤޤäƤ���ȡ�
298 ��������������Ѥ߰����ޤ���
299 �ץ�������񤭹���Ȥ��˻Ȥ��������Ǥ���
300
301 <li>
302 &gt; ���Ƭ�˽񤯤ȡ�
303 ����ʸ���񤱤ޤ���
304 &gt; �ο���¿���ȥ���ǥ�Ȥ������ʤ�ޤ���3��٥�ޤǡˡ�
305
306 </ul>
307 EOD
308 &print_footer;
309 }
310
311 # �ڡ����θ���
312 sub do_search {
313 if ($form{myword}) {
314 &print_header('�������');
315 print qq|<h1>$IconTag$form{myword}������</h1>\n|;
316 &print_toolbar();
317 print qq|<ul>\n|;
318 my $count = 0;
319 foreach my $page_name (sort keys %database) { # sort����Τ�̵�Ť���
320 if ($database{$page_name} =~ /\Q$form{'myword'}\E/) {
321 my $encoded = &encode_percent($page_name);
322 print qq|<li><a href="$thisurl?mycmd=read;mypage=$encoded">$page_name</a>\n|;
323 $count++;
324 }
325 }
326 print qq|</ul>\n|;
327 if ($count > 0) {
328 print qq|<p><strong>$form{myword}</strong>��ޤ�ڡ����ϡ���˼���<strong>$count</strong> �ڡ����Ǥ���</p>\n|;
329 } else {
330 print qq|<p><strong>$form{myword}</strong>��ޤ�ڡ����ϸ��Ĥ���ޤ���</p>\n|;
331 }
332 } else {
333 &print_header('ñ�측��');
334 print qq|<h1>$IconTagñ�측��</h1>\n|;
335 &print_toolbar();
336 }
337 print <<"EOD";
338 <p>
339 <form action="$thisurl" method="post">
340 <input type="hidden" name="mycmd" value="search">
341 <input type="text" name="myword" size="20" value="$form{myword}">
342 <input type="submit" value="ñ�측��">
343 </form>
344 </p>
345 EOD
346 &print_footer;
347 }
348
349 # �ڡ����ΰ���
350 sub do_list {
351 &print_header('�ڡ�������');
352 print qq|<h1>$IconTag �ڡ�������</h1>\n|;
353 &print_toolbar();
354 print qq|<ul>\n|;
355 foreach my $page_name (sort keys %database) { # sort����Τ�̵�Ť���
356 my $encoded = &encode_percent($page_name);
357 print qq|<li><a href="$thisurl?mycmd=read;mypage=$encoded">$page_name</a>\n|
358 }
359 print qq|</ul>\n|;
360 &print_footer;
361 }
362
363 # �ץ�ӥ塼
364 sub do_preview {
365 my $page_name = $form{mypage};
366 my $escapedmsg = &escape($form{mymsg});
367 &print_header($page_name);
368 print qq|<h1>$IconTag${page_name}�Υץ�ӥ塼</h1>\n|;
369 &print_toolbar($page_name);
370 # local $percent_name = &encode_percent($page_name);
371 print qq|<p>�ʲ��Υץ�ӥ塼���ǧ���ơ��褱��Хڡ��������Υܥ���ǹ������Ƥ���������</p>\n|;
372 if ($form{mymsg}) {
373 print qq|<table width="100%" bgcolor="$preview_color" ><tr><td>\n|;
374 # print &convert_html($escapedmsg);
375 print &convert_html($form{mymsg});
376 print qq|</td></tr></table>\n|;
377 } else {
378 print qq|<p>�ʥڡ��������Ƥ϶��Ǥ�����������Ȥ��Υڡ�����<strong>���</strong>����ޤ�����</p>\n|;
379 }
380 &print_preview_buttons($page_name, $escapedmsg, $form{mydigest});
381 &print_footer;
382 }
383
384 sub print_preview_buttons {
385 my ($page_name, $escapedmsg, $digest) = @_;
386 print <<"EOD";
387 <form action="$thisurl" method="post">
388 <textarea cols="$cols" rows="$rows" name="mymsg" wrap="virtual">$escapedmsg</textarea>
389 <br />
390 <input type="hidden" name="mypage" value="$page_name">
391 <input type="hidden" name="mydigest" value="$digest">
392 <input type="submit" name="myspecial_preview" value="���٥ץ�ӥ塼">
393 <input type="submit" name="myspecial_write" value="�ڡ����ι���">
394 </form>
395 EOD
396 }
397
398 # �񤭹���
399 sub do_write {
400 if (not &is_editable($form{mypage})) {
401 # �Խ��Բĥڡ�����ɽ���Τ�
402 &do_read;
403 return;
404 }
405
406 my $page_name = $form{mypage};
407
408 # digest��Ȥäơ������ξ��ͥ����å�
409 my $original_digest = &calc_message_digest(&get_page($page_name));
410 if ($form{mydigest} ne $original_digest) {
411 &print_header($page_name);
412 print qq|<h1>$IconTag${page_name}�ǡڹ����ξ��ۤ͡������ޤ���</h1>\n|;
413 print <<"EOD";
414 <p>���ʤ������Υڡ������Խ����Ƥ���֤ˡ�
415 ¾�οͤ�Ʊ���ڡ����򹹿����Ƥ��ޤä��褦�Ǥ���
416 </p><p>
417 �ʲ��ˡ����ʤ����Խ������ƥ����Ȥ�����ޤ��Τǡ�
418 ���ʤ����Խ����Ƥ������ʤ��褦�ˡ�
419 ���ޤ��������Ģ�ʤɤ˥��ԡ����ڡ����Ȥ��Ƥ���������
420 </p><p>
421 ���ԡ����ڡ����Ȥ��Ѥ�Ǥ��顢
422 �ǿ������Ƥ򸫤ƺ����Խ���ľ���Ƥ���������
423 �ǿ������Ƥ�
424 <a target="_blank" href="$thisurl?mycmd=read;mypage=$form{mypage}">$form{mypage}</a>
425 �Ǹ��뤳�Ȥ��Ǥ��ޤ���
426 </p>
427 EOD
428 # &print_toolbar($page_name);
429 &print_preview_buttons($page_name, &escape($form{mymsg}), $form{mydigest});
430 &print_footer;
431 return;
432 }
433
434 # diff����
435 {
436 &opendiff;
437 my @msg1 = split(/\n/, &get_page($page_name));
438 my @msg2 = split(/\n/, $form{mymsg});
439 $msgrefA = \@msg1;
440 $msgrefB = \@msg2;
441 &diff_check;
442 $diffbase{$form{mypage}} = $diff_text;
443 $diff_text = '';
444 &closediff;
445 }
446
447 &print_header($page_name);
448 &set_page($page_name, $form{mymsg});
449 if ($form{mymsg}) {
450 print qq|<h1>$IconTag${page_name}�򹹿����ޤ���</h1>\n|;
451 &print_toolbar($page_name);
452 print &convert_html(&get_page($page_name));
453 } else {
454 print qq|<h1>$IconTag${page_name}�������ޤ���</h1>\n|;
455 &print_toolbar($page_name);
456 print qq|<p>${page_name}�������ޤ�����</p>\n|;
457 }
458 &print_footer;
459 # �������줿�Τǥ��å����Ƥ�����
460 if ($touchfile) {
461 open(FILE, "> $touchfile");
462 print FILE "\n";
463 close(FILE);
464 }
465 }
466
467 # �ڡ������ѹ���
468 sub do_diff {
469 if (not &is_editable($form{mypage})) {
470 # �Խ��Բĥڡ�����ɽ���Τ�
471 &do_read;
472 return;
473 }
474 &opendiff;
475 &print_header($form{mypage} . '���ѹ���');
476 print qq|<h1>$IconTag <a href="$thisurl?mycmd=read&mypage=$form{mypage}">$form{mypage}</a>���ѹ���</h1>\n|;
477 &print_toolbar();
478 $_ = &escape($diffbase{$form{mypage}});
479 print <<"EOD";
480 <ul>
481 <li>�ɲä��줿�Ԥ�<ins>�Ŀ�</ins>�Ǥ���
482 <li>������줿�Ԥ�<del>�ֿ�</del>�Ǥ���
483 <li><a href="$thisurl?mycmd=read;mypage=$form{mypage}">$form{mypage}</a>�عԤ���
484 </ul>
485 <hr />
486 EOD
487 print qq|<pre>\n|;
488 foreach (split(/\n/, $_)) {
489 if (/^\+(.*)/) {
490 print qq|<ins>$1</ins>\n|;
491 } elsif (/^\-(.*)/) {
492 print qq|<del>$1</del>\n|;
493 } elsif (/^\=(.*)/) {
494 print qq|$1\n|;
495 } else {
496 print qq|??? $_\n|;
497 }
498 }
499 print qq|</pre>\n|;
500 &print_footer;
501 &closediff;
502 }
503
504 sub opendiff {
505 if ($dbmopen) {
506 if (!dbmopen(%diffbase, $diffdbname, 0666)) {
507 &print_error("(dbmopen) $diffdbname �����ޤ���");
508 }
509 } else {
510 if (!tie(%diffbase, "YukiWikiDB", $diffdbname)) {
511 &print_error("(tie error)");
512 }
513 }
514 }
515
516 sub closediff {
517 if ($dbmopen) {
518 dbmclose(%diffbase);
519 } else {
520 untie(%diffbase);
521 }
522 }
523
524 # �ե����फ��ξ����Ϣ������ %form �������
525 # &init_form('euc');
526 sub init_form {
527 my ($charcode) = @_;
528 my $query;
529 if ($ENV{REQUEST_METHOD} =~ /^post$/i) {
530 read(STDIN, $query, $ENV{CONTENT_LENGTH});
531 } else {
532 $query = $ENV{QUERY_STRING};
533 }
534 my @assocarray = split(/[&;]/, $query);
535 foreach my $assoc (@assocarray) {
536 my ($property, $value) = split(/=/, $assoc);
537 $value =~ tr/+/ /;
538 $value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;
539 &jcode::convert(\$value, $charcode);
540 $form{$property} = $value;
541 }
542 }
543
544 # ���顼�ڡ�������Ϥ���
545 sub print_error {
546 my ($msg) = @_;
547 &print_header('Error');
548 print "<h1>$IconTag$msg</h1></body></html>";
549 exit(0);
550 }
551
552 sub escape {
553 my ($line) = shift;
554 $line =~ s|<|&lt;|g;
555 $line =~ s|>|&gt;|g;
556 $line =~ s|"|&quot;|g;
557 # $line =~ s|\&|&amp;|g;
558 return $line;
559 }
560
561 sub inline {
562 my ($line) = shift;
563 $line = &escape($line);
564 $line =~ s|'''([^']+?)'''|<strong>$1</strong>|g;
565 $line =~ s|''([^']+?)''|<em>$1</em>|g;
566 $line =~ s!
567 (
568 (?:&lt;(?:mailto|http|https|ftp|urn):[\x21-\x7E]*)&gt;
569 #| (?:$WikiName) # LocalLinkLikeThis
570 | (?:$BracketName) # [[���ܸ���]]
571 )
572 !
573 &make_link($1)
574 !gex;
575 return $line;
576 }
577
578 # �ڡ����Υ����ȥ뤫��ڡ��������Ƥ�����
579 sub get_page {
580 my $page_name = shift;
581 return $database{$page_name};
582 }
583
584 # �ڡ��������Ƥ�Ϳ����
585 # &set_page($title, $txt)
586 sub set_page {
587 # �ڡ����򹹿�����
588 my $title = $_[0];
589 $database{$title} = $_[1];
590 # ���ڡ����ʤ�������
591 unless ($database{$title}) {
592 delete $database{$title};
593 }
594 # RecentChanges�򹹿�����
595 my $delim = ' - ';
596 my @pages = split(/\n/, $database{$whatsnew});
597 my $datestr = &get_current_datestr;
598 unshift(@pages, qq|-$datestr$delim$title|);
599 # Ʊ��ڡ����ι����Ϻǿ��Τ�ΤΤߤˤ���
600 # ¸�ߤ��ʤ��ڡ����ϥ����åפ��롣
601 my %count;
602 my @newpages;
603 foreach my $line (@pages) {
604 my ($prefix, $title) = split(/$delim/, $line);
605 $count{$title}++;
606 if ($count{$title} == 1 and exists($database{$title})) {
607 push(@newpages, qq|$prefix - $title|);
608 }
609 }
610 # �����������˹���
611 $database{$whatsnew} = join("\n", splice(@newpages, 0, $maxnew));
612 }
613
614 # �ڡ����Υإå������
615 sub print_header {
616 my $title = shift;
617 print <<"EOD";
618 Content-type: text/html
619
620 <html><head>
621 <title>$title</title>
622 <style type="text/css">
623 $style
624 </style>
625 </head>
626 <body>
627 EOD
628 }
629
630 # �ġ���С������
631 sub print_toolbar {
632 my $page_name = shift;
633 my $percent_name = &encode_percent($page_name);
634 my $editlink = '';
635 if ($page_name ne '' and &is_editable($page_name)) {
636 $editlink = <<"EOD";
637 <a href="$thisurl?mycmd=edit;mypage=$percent_name">�Խ�</a> |
638 <a href="$thisurl?mycmd=diff;mypage=$percent_name">��ʬ</a> |
639 EOD
640 }
641 print <<"EOD";
642 <p>
643 [
644 <a href="$thisurl?mycmd=read;mypage=$toppage">�ȥå�</a> |
645 <a href="$thisurl?mycmd=list">����</a> |
646 $editlink
647 <a href="$thisurl?mycmd=search">ñ�측��</a> |
648 <a href="$thisurl?mycmd=read;mypage=$whatsnew">�ǽ�����</a>
649 ]
650 </p>
651 EOD
652 }
653
654 # �ڡ����Υեå������
655 sub print_footer {
656 print <<"EOD";
657 <address>
658 <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>
659 + <a href="$modifierlink">$modifier</a> ${version}.
660 [<a href="/" title="���Υ����С��μ���">/</a>
661 <a href="/map" title="���Υ����С��ΰ���">�Ͽ�</a>
662 <a href="/search/" title="���Υ����С��θ���">����</a>]
663 </address>
664 </body></html>
665 EOD
666 }
667
668 # URL��ڡ�����̾�������󥯤���
669 sub make_link {
670 my $name = shift;
671 $name =~ s/^&lt;(.*)&gt;$/$1/;
672 $name =~ s/^\[\[(.*)\]\]$/$1/;
673 if ($name =~ /^(http|https|ftp).*?(\.png|\.jpeg|\.jpg)?$/) {
674 if ($2) {
675 return qq|<a href="$name"><img border="0" src="$name" /></a>|;
676 } else {
677 return qq|&lt;<a href="$name">$name</a>&gt;|;
678 }
679 } elsif ($name =~ /^mailto:(.*)/) {
680 my $address = $1;
681 return qq|&lt;<a href="$name">$address</a>&gt;|;
682 } elsif ($name =~ /^urn:[0-9A-Za-z_:-]+/) {
683 return qq|&lt;<a href="/uri-res/N2L?${name}">$name</a>&gt;|;
684 } else {
685 my $name2 = $name; $name2 =~ tr/\x20/-/;
686 if ($database{$name2}) {
687 my $percent_name = &encode_percent($name2);
688 return qq|<a href="$thisurl?mycmd=read;mypage=$percent_name" class="wiki">$name</a>|;
689 } elsif ($database{'[['.$name2.']]'}) {
690 my $percent_name = &encode_percent('[['.$name2.']]');
691 return qq|<a href="$thisurl?mycmd=read;mypage=$percent_name" class="wiki">$name</a>|;
692 } else {
693 my $percent_name = &encode_percent($name2);
694 return qq|<a href="$thisurl?mycmd=edit;mypage=$percent_name" class="wiki newpage">$name?</a>|;
695 }
696 }
697 }
698
699 # %xx �η����˥��󥳡��ɤ���
700 # ����ϡ�
701 # http://www.hyuki.com/yukiwiki/yukiwiki.cgi?mycmd=read&mypage=%3C%8C%8B%8F%E9%8D_%3E
702 # �Ȥ��������Τ���˻Ȥ��롣
703 # '<����>' �� '%3C%8C%8B%8F%E9%8D_%3E'
704 sub encode_percent {
705 my $name = shift;
706 my $encoded = '';
707 foreach my $ch (split(//, $name)) {
708 if ($ch =~ /[A-Za-z0-9_]/) {
709 $encoded .= $ch;
710 } else {
711 $encoded .= '%' . sprintf("%02X", ord($ch));
712 }
713 }
714 return $encoded;
715 }
716
717 # �ƥ��������Τ�HTML���Ѵ�����
718 sub convert_html {
719 my ($txt) = shift;
720 my (@txt) = split(/\n/, $txt);
721 foreach (@txt) {
722 chomp;
723 if (/^\*\*(.*)/) {
724 push(@result, splice(@saved), '<h3>' . &inline($1) . '</h3>');
725 } elsif (/^\*(.*)/) {
726 push(@result, splice(@saved), '<h2>' . &inline($1) . '</h2>');
727 } elsif (/^----/) {
728 push(@result, splice(@saved), '<hr>');
729 } elsif (/^(-{1,3})(.*)/) {
730 &back_push('ul', length($1));
731 push(@result, '<li>' . &inline($2) . '</li>');
732 } elsif (/^:([^:]+):(.*)/) {
733 &back_push('dl', 1);
734 push(@result, '<dt>' . &inline($1) . '</dt>', '<dd>' . &inline($2) . '</dd>');
735 } elsif (/^(>{1,3})(.*)/) {
736 &back_push('blockquote', length($1));
737 push(@result, &inline($2));
738 } elsif (/^\s*$/) {
739 push(@result, splice(@saved));
740 unshift(@saved, "</p>");
741 push(@result, "<p>");
742 } elsif (/^(\s+.*)$/) {
743 &back_push('pre', 1);
744 push(@result, &escape($1)); # Not &inline, but &escape
745 } else {
746 push(@result, &inline($_));
747 }
748 }
749 push(@result, splice(@saved));
750 return join("\n", @result);
751 }
752
753 # &back_push($tag, $count)
754 # $tag�Υ�����$level��٥�ޤǵͤ�롣
755 sub back_push {
756 my ($tag, $level) = @_;
757 while (@saved > $level) {
758 push(@result, shift(@saved));
759 }
760 if ($saved[0] ne "</$tag>") {
761 push(@result, splice(@saved));
762 }
763 while (@saved < $level) {
764 unshift(@saved, "</$tag>");
765 push(@result, "<$tag>");
766 }
767 }
768
769 # �Խ���ǽ�ڡ�������
770 sub is_editable {
771 my ($pagename) = @_;
772 foreach (@uneditable) {
773 if ($pagename eq $_) {
774 return 0;
775 }
776 }
777 if (&is_valid_name($pagename)) {
778 return 1;
779 }
780 return 0;
781 }
782
783 # Valid��̾������
784 sub is_valid_name {
785 my ($pagename) = @_;
786 if ($pagename =~ /^$WikiName$/) {
787 return 1;
788 } elsif ($pagename =~ /^$BracketName$/) {
789 return 1;
790 } else {
791 return 0;
792 }
793 }
794
795 # ���߻����ʸ���������
796 sub get_current_datestr {
797 my (@wdays) = ( "��", "��", "��", "��", "��", "��", "��" );
798 my ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time);
799 return sprintf("%4d-%02d-%02d (%s) %02d:%02d:%02d",
800 $year + 1900, $mon + 1, $mday, $wdays[$wday], $hour, $min, $sec);
801 }
802
803 # URL?SomePage�䡢
804 # URL?[[����]]�η������ä���硢(not yet)
805 # ����Ū��mycmd��read�ˤ���$form�����Ƥ����ꤹ�롣
806 sub normalize_form {
807 foreach my $key (keys %form) {
808 if ($key =~ /^$WikiName$/) {
809 $form{mycmd} = 'read';
810 $form{mypage} = $1;
811 last;
812 } elsif ($key =~ /^$BracketName$/) {
813 $form{mycmd} = 'read';
814 $form{mypage} = $1;
815 last;
816 }
817 }
818 }
819
820 # �Ѵ��ƥ��Ȥ�Ԥʤ��Ȥ��Υ���ץ�
821 sub print_sample {
822 my $txt = &convert_html(<<"EOD");
823 *�縫�Ф�1
824 **������1-1
825 -����1
826 -����2
827 -����3
828 ����1����1����1����1����1����1����1����1����1����1����1����1
829 ����1����1����1����1����1����''��Ĵ''1����1����1����1����1����1
830 ����1����1����1����1����1����1����1����1����1����1����1����1
831
832 ����2����2����2����2����2����2����2����2����2����2����2����2
833 ����2����2����2����2����2����2����2����2����2����2����2����2
834 ����2����2����2����2����2����2����2����2����2����2����2����2
835 **������1-2
836 :�Ѹ�1:���������񤤤�����ʸ1��''��Ĵñ��''
837 ����1����1����1����1����1����1����1����1����1����1����1����1
838 ����1����1����1����1����1����1����1����1����1����1����1����1
839 ����1����1����1����1����1����1����1����1����1����1����1����1
840 :�Ѹ�2:���������񤤤�����ʸ2
841 :�Ѹ�3:���������񤤤�����ʸ3
842 ----
843 *�縫�Ф�2
844 **������2-1
845 &lt;http://suika.fam.cx/&gt;
846 **������2-2
847
848 [[����]]
849
850 ����1����1����1����1����1����1����1����1����1����1����1����1
851 ����1����1����1����'''��Ĵ'''1����1����1����1����1����1����1����1
852 ����1����1����1����'''''������Ĵ'''''1����1����1����1����1����1����1����1����1
853 >����2����2����2����2����2����2����2����2����2����2����2����2
854 >����2����2����2����2����2����2����2����2����2����2����2����2
855 >����2����2����2����2����2����2����2����2����2����2����2����2
856
857 ��٥�0��٥�0��٥�0��٥�0��٥�0��٥�0
858
859 >��٥�1
860 >��٥�1
861 >��٥�1
862 >>��٥�2
863 >>��٥�2
864 >>��٥�2
865 >>>��٥�3
866 -�Ϥ�1
867 --�Ϥ�2
868 ��������2
869 ---�Ϥ�3
870 --�Ϥ�2
871 ---�Ϥ�3
872 --�Ϥ�2
873 ---�Ϥ�3
874 >>>��٥�3
875 >>>��٥�3
876 >>>��٥�3
877 EOD
878 print $txt;
879 exit;
880 }
881
882 sub diff_check {
883 traverse_sequences(
884 $msgrefA, $msgrefB,
885 {
886 MATCH => \&df_match,
887 DISCARD_A => \&df_delete,
888 DISCARD_B => \&df_add,
889 }
890 );
891 &diff_flush;
892 }
893
894 sub diff_flush {
895 $diff_text .= join('', map { "-$_\n" } splice(@diff_deleted));
896 $diff_text .= join('', map { "+$_\n" } splice(@diff_added));
897 }
898
899 sub df_match {
900 my ($a, $b) = @_;
901 &diff_flush;
902 $diff_text .= "=$msgrefA->[$a]\n";
903 }
904
905 sub df_delete {
906 my ($a, $b) = @_;
907 push(@diff_deleted, $msgrefA->[$a]);
908 }
909
910 sub df_add {
911 my ($a, $b) = @_;
912 push(@diff_added, $msgrefB->[$b]);
913 }
914
915 sub calc_message_digest { # You have to use MD5...
916 my $text = shift;
917 my @text = split(//, $text);
918 my $len = length($text);
919 my $checksum = 0;
920 foreach (@text) {
921 $checksum += ord($_);
922 $checksum = ($checksum * 2) % 65536 + (($checksum & 32768) ? 1 : 0); # 16bit rotate
923 }
924 return "$len:$checksum";
925 }
926
927 # Definition of YukiWikiDB
928 package YukiWikiDB;
929
930 my $debug = 1;
931
932 # Constructor
933 sub new {
934 return shift->TIEHASH(@_);
935 }
936
937 # tying
938 sub TIEHASH {
939 my ($class, $dbname) = @_;
940 my $self = {
941 dir => $dbname,
942 keys => [],
943 };
944 if (not -d $self->{dir}) {
945 if (!mkdir($self->{dir}, 0777)) {
946 print "mkdir(" . $self->{dir} . ") fail\n" if ($debug);
947 return undef;
948 }
949 }
950 return bless($self, $class);
951 }
952
953 # Store
954 sub STORE {
955 my ($self, $key, $val) = @_;
956 my $file = &make_filename($self, $key);
957 if (open(FILE,"> $file")) {
958 binmode(FILE);
959 print FILE $val;
960 close(FILE);
961 return $self->{$key} = $val;
962 } else {
963 print "$file create error.";
964 }
965 }
966
967 # Fetch
968 sub FETCH {
969 my ($self, $key) = @_;
970 my $file = &make_filename($self, $key);
971 if (open(FILE, $file)) {
972 local $/;
973 $self->{$key} = <FILE>;
974 close(FILE);
975 }
976 return $self->{$key};
977 }
978
979 # Exists
980 sub EXISTS {
981 my ($self, $key) = @_;
982 my $file = &make_filename($self, $key);
983 return -e($file);
984 }
985
986 # Delete
987 sub DELETE {
988 my ($self, $key) = @_;
989 my $file = &make_filename($self, $key);
990 unlink $file;
991 return delete $self->{$key};
992 }
993
994 sub FIRSTKEY {
995 my ($self) = @_;
996 opendir(DIR, $self->{dir}) or die $self->{dir};
997 @{$self->{keys}} = grep /\.txt$/, readdir(DIR);
998 foreach my $name (@{$self->{keys}}) {
999 $name =~ s/\.txt$//;
1000 $name =~ s/[0-9A-F][0-9A-F]/pack("C", hex($&))/eg;
1001 }
1002 return shift @{$self->{keys}};
1003 }
1004
1005 sub NEXTKEY {
1006 my ($self) = @_;
1007 return shift @{$self->{keys}};
1008 }
1009
1010 sub make_filename {
1011 my ($self, $key) = @_;
1012 my $enkey = '';
1013 foreach my $ch (split(//, $key)) {
1014 $enkey .= sprintf("%02X", ord($ch));
1015 }
1016 return $self->{dir} . "/$enkey.txt";
1017 }
1018 __END__
1019
1020 =head1 NAME
1021
1022 YukiWiki - ��ͳ�˥ڡ������ɲá�������Խ��Ǥ���Web�ڡ�������CGI
1023
1024 Copyright (C) 2000,2001 by Hiroshi Yuki.
1025 ���� <[email protected]>
1026 http://www.hyuki.com/
1027 http://www.hyuki.com/yukiwiki/
1028
1029 =head1 SYNOPSIS
1030
1031 http://www.hyuki.com/yukiwiki/yukiwiki.cgi
1032
1033 =head1 DESCRIPTION
1034
1035 YukiWiki�ʷ�륦�������ˤϻ��üԤ���ͳ�˥ڡ������ɲá�������Խ��Ǥ���
1036 �Ի׵Ĥ�Web�ڡ���������CGI�Ǥ���
1037 Web��ư���Ǽ��ĤȤ���äȻ��Ƥ��ޤ�����
1038 Web�Ǽ��Ĥ�ñ�˥�å��������ɲä�������ʤΤ��Ф��ơ�
1039 YukiWiki�ϡ�Web�ڡ������Τ�ͳ���ѹ����뤳�Ȥ��Ǥ��ޤ���
1040
1041 YukiWiki�ϡ�Cunningham & Cunningham��WikiWikiWeb��
1042 ���ͤ򻲹ͤˤ����ȼ��˺���ޤ�����
1043
1044 YukiWiki��Perl�ǽ񤫤줿CGI������ץȤȤ��Ƽ¸�����Ƥ��ޤ��Τǡ�
1045 Perl��ư���Web�����Фʤ�����Ū�ưפ����֤Ǥ��ޤ���
1046
1047 ���Ȥ�dbmopen���Ȥ���Ķ��ʤ�����֤Ǥ��ޤ�(Version 1.5.0�ʹߤʤ�dbmopen���Ȥ��ʤ��Ƥ����֤Ǥ��ޤ�)��
1048
1049
1050 YukiWiki�ϥե꡼���եȤǤ���
1051 ����ͳ�ˤ��Ȥ�����������
1052
1053 =head1 ������ˡ
1054
1055 =head2 ����
1056
1057 YukiWiki�κǿ��Ǥϡ�
1058 http://www.hyuki.com/yukiwiki/
1059 ��������Ǥ��ޤ���
1060
1061 =head2 �ե��������
1062
1063 readme.txt �ɥ������
1064 yukiwiki.cgi YukiWiki����
1065 yukiwiki.gif �����ʥ��顼�ǡ�
1066 yukimono.gif �����ʥ�Υ����ǡ�
1067 jcode.pl ���������ɥ饤�֥��
1068
1069 =head2 ���󥹥ȡ���
1070
1071 =over 4
1072
1073 =item 1.
1074
1075 ���������֤�򤯡�
1076
1077 =item 2.
1078
1079 yukiwiki.cgi�ΤϤ�������ˤ���������ǧ���ޤ���
1080 �̾�ϲ��⤷�ʤ��Ƥ褤����
1081 �Ϥ����$touchfile��''�ˤ��������褤�Ǥ��礦��
1082
1083 =item 3.
1084
1085 yukiwiki.cgi��jcode.pl��Ʊ���Ȥ��������֤��ޤ���
1086
1087 =item 4.
1088
1089 ������0��yukiwiki.db�Ȥ����ե���������֤��ޤ���
1090 ��Perl�����ƥ�ˤ�äƤ�yukiwiki.pag, yukiwiki.dir��
1091
1092 =item 5.
1093
1094 yukiwiki.cgi�˥֥饦�����饢���������ޤ���
1095
1096 =back
1097
1098 =head2 �ѡ��ߥå����
1099
1100 �ե����� �ѡ��ߥå���� ž���⡼��
1101 yukiwiki.cgi 755 ASCII
1102 yukiwiki.gif 644 BINARY
1103 yukimono.gif 644 BINARY
1104 jcode.pl 644 ASCII
1105
1106 $dbmopen = 1; �ˤ������:
1107 yukiwiki.db 666 BINARY
1108 (yukiwiki.pag, yukiwiki.dir�ξ��⤢���
1109
1110 $dbmopen = 0; �ˤ������: (�����ȥǥ��쥯�ȥ��777�ˤ��Ƥ���)
1111 . 777 (ž�����ʤ�)
1112
1113 =head1 �ǡ����ΥХå����å���ˡ
1114
1115 $dbmopen = 1;�ξ��ϡ�
1116 �ǡ����Ϥ��٤�yukiwiki.db(.dir, .pag)�����롣
1117 �����Хå����åפ���Ф褤��
1118
1119 $dbmopen = 0;�ξ��ϡ�
1120 yukiwiki�Ȥ����ǥ��쥯�ȥ꤬�Ǥ���Τǡ�
1121 ����ʲ���Хå����åפ���Ф褤��
1122
1123 =head1 �������ڡ����κ����
1124
1125 =over 4
1126
1127 =item 1.
1128
1129 �ޤ���Ŭ���ʥڡ������㤨��FrontPage�ˤ����ӡ�
1130 �ڡ����β��ˤ�����Խ��ץ�󥯤򤿤ɤ�ޤ���
1131
1132 =item 2.
1133
1134 ����ȥƥ��������Ϥ��Ǥ�����֤ˤʤ�Τǡ�
1135 ������NewPage�Τ褦��ñ��
1136 ����ʸ����ʸ�����ߤ��Ƥ����ʸ�����
1137 ��񤤤ơ���¸�פ��ޤ���
1138
1139 =item 3.
1140
1141 ��¸����ȡ�FrontPage�Υڡ������񤭴���ꡢ
1142 ���ʤ����񤤤�NewPage�Ȥ���ʸ����θ���� ? �Ȥ�����󥯤�ɽ������ޤ���
1143 ���� ? �Ϥ��Υڡ������ޤ�¸�ߤ��ʤ����Ȥ򼨤����Ǥ���
1144
1145 =item 4.
1146
1147 ���� ? �򥯥�å�����ȿ������ڡ���NewPage���Ǥ��ޤ��Τǡ�
1148 ���ʤ��ι�����ʸ�Ϥ򤽤ο������ڡ����˽񤤤���¸���ޤ���
1149
1150 =item 5.
1151
1152 NewPage�ڡ������Ǥ����FrontPage�� ? �Ͼä��ơ���󥯤Ȥʤ�ޤ���
1153
1154 =back
1155
1156 =head1 �ƥ����������Υ롼��
1157
1158 =over 4
1159
1160 =item *
1161
1162 Ϣ³����ʣ���Ԥϥե��뤵���ɽ������ޤ���
1163
1164 =item *
1165
1166 ���Ԥ�����C<< <p> >>�ζ��ڤ�Ȥʤ�ޤ���
1167
1168 =item *
1169
1170 HTML�Υ����Ͻ񤱤ޤ���
1171
1172 =item *
1173
1174 B<''�ܡ����''>�Τ褦�˥��󥰥륯��������ĤǤϤ���ȡ�
1175 �ܡ����C<< <b> >>�ˤʤ�ޤ���
1176
1177 =item *
1178
1179 B<'''������å�'''>�Τ褦�˥��󥰥륯�����Ȼ��ĤǤϤ���ȡ�
1180 ������å�C<< <i> >>�ˤʤ�ޤ���
1181
1182 =item *
1183
1184 B<---->�Τ褦�˥ޥ��ʥ�4�Ĥ�����ȡ�
1185 ��ʿ��C<< <hr> >>�ˤʤ�ޤ���
1186
1187 =item *
1188
1189 �Ԥ�B<*>�ǤϤ����ȡ�
1190 �縫�Ф�C<< <h2> >>�ˤʤ�ޤ���
1191
1192 =item *
1193
1194 �Ԥ�B<**>�ǤϤ����ȡ�
1195 �����Ф�C<< <h3> >>�ˤʤ�ޤ���
1196
1197 =item *
1198
1199 �Ԥ�ޥ��ʥ�-�ǤϤ����ȡ�
1200 �վ��C<< <ul> >>�ˤʤ�ޤ���
1201 �ޥ��ʥ��ο���������ȥ�٥뤬������ޤ���3��٥�ޤǡ�
1202
1203 -����1
1204 --����1-1
1205 --����1-2
1206 -����2
1207 -����3
1208 --����3-1
1209 ---����3-1-1
1210 ---����3-1-2
1211 --����3-2
1212
1213 =item *
1214
1215 �������Ȥ��ȡ�
1216 �Ѹ�Ȳ���ʸ�Υꥹ��C<< <dl> >>���񤱤ޤ���
1217
1218 :�Ѹ�1:���������񤤤�����ʸ1
1219 :�Ѹ�2:���������񤤤�����ʸ2
1220 :�Ѹ�3:���������񤤤�����ʸ3
1221
1222 =item *
1223
1224 ���
1225
1226 =over 4
1227
1228 =item *
1229
1230 LinkToSomePage��FrontPage�Τ褦�ˡ�
1231 ��ñ��κǽ�ΰ�ʸ������ʸ���ˤ�����Τ�
1232 ��İʾ�Ϣ³������Τ�YukiWiki�Υڡ���̾�Ȥʤꡢ
1233 ���줬ʸ����˴ޤޤ��ȥ�󥯤ˤʤ�ޤ���
1234
1235 =item *
1236
1237 http://www.hyuki.com/ �Τ褦��URL�ϼ�ưŪ�˥�󥯤ˤʤ�ޤ���
1238
1239 =item *
1240
1241 ��Ť��礫�ä�[[ ]]�Ǥ����ä�ʸ����⡢
1242 YukiWiki�Υڡ���̾�ˤʤ�ޤ���
1243 �礫�ä�����ˤϥ��ڡ�����ޤ�ƤϤ����ޤ���
1244 ���ܸ��Ȥ��ޤ���
1245
1246 =back
1247
1248 =item *
1249
1250 ��Ƭ�����ڡ����䥿�֤ǻϤޤäƤ���ȡ�
1251 ����������Ѥߤ�����C<< <pre> >>�Ȥ��ư����ޤ���
1252 �ץ�������ɽ���ʤɤ˻Ȥ��������Ǥ���
1253
1254
1255 =item *
1256
1257 �Ԥ� > �ǤϤ����ȡ�
1258 ����ʸC<< <blockquote> >>���񤱤ޤ���
1259 >�ο���¿���ȥ���ǥ�Ȥ������ʤ�ޤ���3��٥�ޤǡˡ�
1260
1261 >ʸ��
1262 >ʸ��
1263 >>����ʤ����
1264 >ʸ��
1265
1266 =back
1267
1268 =head1 ��������
1269
1270 =over 4
1271
1272 =item *
1273
1274 2001ǯ10��20����Version 1.6.6��
1275
1276 �����ξ����к���
1277 ���ڡ����δ�ñ�ʥ����å�������äƤ�����
1278 �������˥����å��������Ӥ��롣
1279 �����Ľ��digest�Ȥ���ʸ����򸡺������ʬ���롣
1280 �����MD5�ʤɤǤ����Ȥ�ä����������Τ�����ɡ�
1281
1282 ���ͻ���ɽ��������å������ʤɤϡֶ˰��פ���Υڡ����򻲹ͤˤ�����
1283
1284 =item *
1285
1286 2001ǯ10��17����Version 1.6.5��
1287
1288 �ץ�ӥ塼���̤ǡ������ܥ���򲡤����Ȥ������������
1289 ��å����������Ƥ�input���Ǥ�type="hidden"��Ȥä�������Τ���롣
1290 ����ˡ�textarea���Ǥ�Ȥ���
1291 �ƥץ�ӥ塼�Ѥ�myspecial_��Ƴ�����Ǥ⤭�줤���к��ǤϤʤ���
1292
1293 =item *
1294
1295 2001ǯ8��30����Version 1.6.4��
1296
1297 URL�ǥ����쥯�Ȥ˥ڡ���̾����ꤷ�Ƥ⡢
1298 $WikiName��$BracketName�ʳ��Υڡ�������ʤ��褦�ˤ�����
1299 (is_valid_name��is_editable����)��
1300
1301 =item *
1302
1303 2001ǯ8��30����Version 1.6.3��
1304
1305 RecentChanges���Խ������Խ��ԲĤȤ�����
1306 �Խ��Բĥڡ�����@uneditable�˥ڡ���̾������롣
1307
1308 =item *
1309
1310 2001ǯ2��25����Version 1.6.1, 1.6.2��
1311
1312 ��ʬ��ǽ�ΥХ�������
1313 do_preview��'>'�������ʤ��Х�����
1314 �ʥ桼������λ�Ŧ�ˡ�
1315
1316 =item *
1317
1318 2001ǯ2��22����Version 1.6.0��
1319 ��ʬ��ǽ�����������
1320
1321 =item *
1322
1323 2001ǯ2��19����Version 1.5.4��
1324 �����ե�����ؤΥ�󥯤ϲ����ˤ��Ƥߤ���
1325
1326 =item *
1327
1328 2001ǯ2��19����Version 1.5.3��
1329 RecentChanges����˺�������ڡ���������Τ��᤿��
1330 use strict;�ǰ��ä�������ʬ�򾯤�����(�����ǤϤʤ�)��
1331
1332 =item *
1333
1334 2001ǯ2��16����Version 1.5.2��
1335 textarea��ɽ������ӥץ�ӥ塼�������� < �� > �� &lt; �� &gt; ���Ѵ�����
1336 (do_preview, editpage, print_preview_buttons)��
1337
1338 =item *
1339
1340 2000ǯ12��27����Version 1.5.1��
1341 �ץ�ӥ塼���̤�����������
1342
1343 =item *
1344
1345 2000ǯ12��22����Version 1.5.0��
1346 ����Ū�ˤ����֤��ľ������
1347 ���������Ӻ�������褦�ˤ���(do_list)��
1348 �񤭹������˳�ǧ���̤�Ф��褦�ˤ���(do_preview)��
1349 �ƥ����Ȥν������Խ����̤����줿(do_edit, do_reedit)��
1350 WhatsNew��RecentChanges��TopPage��FrontPage���ѹ�������
1351
1352 =item *
1353
1354 2000ǯ12��20����Version 1.1.0��
1355 tie�����Ѥ��ơ�dbmopen���Ȥ��ʤ����Ǥ�ư���褦�˽�����
1356 ���ѼԤ�1�ͤǤ���ֶ˰��פ��󤫤�
1357 ���äƤ��������������ɤ򸵤ˤ��Ƥ��ޤ���
1358
1359 =item *
1360
1361 2000ǯ9��5����Version 1.0.2��
1362 <body color=...> �� <body bgcolor=...>
1363 ���ѼԤ���λ�Ŧ�ˤ�롣���ա�
1364
1365 =item *
1366
1367 2000ǯ8��6����Version 1.0.1�������
1368 C MAGAZINE�ʥ��եȥХ󥯥ѥ֥�å��󥰡�
1369 2000ǯ10���Ϣ�ܵ������������ǡ�
1370 [[ ]] �κǸ夬��˾�פΤ褦�˥��ե�JIS��
1371 0x5D�ˤʤ���β����Ԥʤä���
1372
1373 =item *
1374
1375 2000ǯ8��5����Version 1.0.0�������
1376
1377 =item *
1378
1379 2000ǯ7��23����Version 0.82�������
1380 �Խ����Υ�󥯥ߥ���
1381 <textarea>��°���ѹ���
1382
1383 =item *
1384
1385 2000ǯ7��22����Version 0.81�������
1386 �������Ȥ߹��ࡣ
1387
1388 =item *
1389
1390 2000ǯ7��21����Version 0.80�������
1391 POD��CGI��˽񤭹��ࡣ
1392
1393 =item *
1394
1395 2000ǯ7��19����Version 0.70�������
1396 '''������å�'''�䡢--��---��>>��>>>�ʤɤ������
1397
1398 =item *
1399
1400 2000ǯ7��18����Version 0.60�������
1401 *����*��''����''���ѹ�
1402
1403 =item *
1404
1405 2000ǯ7��17����Version 0.50�������
1406
1407 =item *
1408
1409 2000ǯ7��17��������ˤ��������ɲä��롣
1410
1411 =item *
1412
1413 2000ǯ7��16�������������ɲá�
1414
1415 =item *
1416
1417 2000ǯ7��15����������
1418
1419 =back
1420
1421 =head1 TODO
1422
1423 - �ƥ�����ɽ���⡼��
1424 - Charset��������
1425 - textarea����Ĥ������б�
1426 - ��˥塼�αѸ�ɽ���յ�
1427 - �ץ�ӥ塼�Υܥ���ǡ�mymsg��input��value������Ƥ��뤬�����Ԥ򤽤Τޤ�value�ˤ���ƤϤ����ʤ��ΤǤϤʤ�����
1428 - �ֺ��Խ��פε�ǽ�ϥ֥饦���� back �ǽ�ʬ�ǤϤʤ������ץ�ӥ塼�Ϥ�äȥ���ץ�ˡ�
1429 - �ڡ��������ȥ��Wikiname�ˤ������ˤ�����褦�ˤ��롣
1430 - InterWiki���ε�ǽ��URL�򱣤��Ĥġ���󥯤�ĥ���
1431
1432 =head1 ���
1433
1434 Copyright (C) 2000 by Hiroshi Yuki.
1435 ���� <[email protected]>
1436 http://www.hyuki.com/
1437 http://www.hyuki.com/yukiwiki/
1438
1439 ���䡢�ո����Х����� [email protected] �˥᡼�뤷�Ƥ���������
1440
1441 =head1 ���۾��
1442
1443 YukiWiki�ϡ�
1444 GNU General Public License�ˤƸ������ޤ���
1445
1446 YukiWiki�ϥե꡼���եȤǤ���
1447 ����ͳ�ˤ��Ȥ�����������
1448 ��ʬ���ߤ�YukiWiki������褦�˥���ץ�ˤ��Ƥ���ޤ���
1449
1450 =head1 �ռ�
1451
1452 �ܲȤ�WikiWiki���ä�Cunningham & Cunningham, Inc.��
1453 ���դ��ޤ���
1454
1455 YukiWiki��ڤ���ǻȤäƤ�������
1456 �ͥåȾ�������˴��դ��ޤ���
1457
1458 YukiWiki�Υ�����ǥ����󤷤Ƥ������ä��������व��
1459 http://city.hokkai.or.jp/~reina/
1460 �˴��դ��ޤ���
1461
1462 tie��Ȥä��Ǥθ��ˤʤ륳���ɤ����äƤ������ä�
1463 �ֶ˰��פ���˴��դ��ޤ���
1464
1465 =head1 ���ȥ��
1466
1467 =over 4
1468
1469 =item *
1470
1471 YukiWiki�ۡ���ڡ���
1472 http://www.hyuki.com/yukiwiki/
1473
1474 =item *
1475
1476 �ܲȤ�WikiWiki
1477 http://c2.com/cgi/wiki?WikiWikiWeb
1478
1479 =item *
1480
1481 �ܲȤ�WikiWiki�κ��(Cunningham & Cunningham, Inc.)
1482 http://c2.com/
1483
1484 =item *
1485
1486 YukiWiki�Υ����ǥ�����򤷤Ƥ������ä��������व��Υڡ���
1487 http://city.hokkai.or.jp/~reina/
1488
1489 =back
1490
1491 =cut

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24