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

Contents of /suikawiki/script/wiki.cgi

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.12 - (hide annotations) (download)
Sun Mar 24 01:14:30 2002 UTC (24 years, 3 months ago) by wakaba
Branch: MAIN
Changes since 1.11: +5 -4 lines
2002-03-24  wakaba <w@suika.fam.cx>

	* wiki.cgi (inline): 
	- Ignore LinkLikeThis style anchor.
	- Allow [[space including anchor]].
	(make_link): Likewise.  Gets rid of angle branckets
	before make anchor.

1 wakaba 1.9 #!/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 wakaba 1.12 # $Id: wiki.cgi,v 1.11 2002/03/24 01:12:13 wakaba Exp $
24 wakaba 1.9 ##############################
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 wakaba 1.10 return $database{$page_name} || $database{'[['.$page_name.']]'};
582 wakaba 1.9 }
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 wakaba 1.10 Content-type: text/html; charset=${charset}
619 wakaba 1.9
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 wakaba 1.10 <a href="$thisurl?mycmd=read;mypage=$whatsnew">�Ƕ�ι���</a>
649 wakaba 1.9 ]
650     </p>
651     EOD
652     }
653    
654     # �ڡ����Υեå������
655     sub print_footer {
656     print <<"EOD";
657 wakaba 1.10 <div class="navigation">
658 wakaba 1.9 <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 wakaba 1.10 </div>
664 wakaba 1.12 EOD
665     print <<'EOH';
666 wakaba 1.11 <div class="update">
667     <a href="/gate/cvs/wakaba/wiki/" title="CVS Repository">
668 wakaba 1.12 $Revision: 1.11 $ $Date: 2002/03/24 01:12:13 $
669 wakaba 1.11 </a>
670     </div>
671 wakaba 1.9 </body></html>
672 wakaba 1.12 EOH
673 wakaba 1.9 }
674    
675     # URL��ڡ�����̾�������󥯤���
676     sub make_link {
677     my $name = shift;
678     $name =~ s/^&lt;(.*)&gt;$/$1/;
679     $name =~ s/^\[\[(.*)\]\]$/$1/;
680     if ($name =~ /^(http|https|ftp).*?(\.png|\.jpeg|\.jpg)?$/) {
681     if ($2) {
682     return qq|<a href="$name"><img border="0" src="$name" /></a>|;
683     } else {
684     return qq|&lt;<a href="$name">$name</a>&gt;|;
685     }
686     } elsif ($name =~ /^mailto:(.*)/) {
687     my $address = $1;
688     return qq|&lt;<a href="$name">$address</a>&gt;|;
689 wakaba 1.10 } elsif ($name =~ m#^urn:[0-9A-Za-z_:;/.-]+#) {
690 wakaba 1.9 return qq|&lt;<a href="/uri-res/N2L?${name}">$name</a>&gt;|;
691     } else {
692     my $name2 = $name; $name2 =~ tr/\x20/-/;
693     if ($database{$name2}) {
694     my $percent_name = &encode_percent($name2);
695     return qq|<a href="$thisurl?mycmd=read;mypage=$percent_name" class="wiki">$name</a>|;
696     } elsif ($database{'[['.$name2.']]'}) {
697     my $percent_name = &encode_percent('[['.$name2.']]');
698     return qq|<a href="$thisurl?mycmd=read;mypage=$percent_name" class="wiki">$name</a>|;
699     } else {
700     my $percent_name = &encode_percent($name2);
701 wakaba 1.10 return qq|<a href="$thisurl?mycmd=edit;mypage=$percent_name" class="wiki newpage">$name<span class="mark">?</span></a>|;
702 wakaba 1.9 }
703     }
704     }
705    
706     # %xx �η����˥��󥳡��ɤ���
707     # ����ϡ�
708     # http://www.hyuki.com/yukiwiki/yukiwiki.cgi?mycmd=read&mypage=%3C%8C%8B%8F%E9%8D_%3E
709     # �Ȥ��������Τ���˻Ȥ��롣
710     # '<����>' �� '%3C%8C%8B%8F%E9%8D_%3E'
711     sub encode_percent {
712     my $name = shift;
713     my $encoded = '';
714     foreach my $ch (split(//, $name)) {
715     if ($ch =~ /[A-Za-z0-9_]/) {
716     $encoded .= $ch;
717     } else {
718     $encoded .= '%' . sprintf("%02X", ord($ch));
719     }
720     }
721     return $encoded;
722     }
723    
724     # �ƥ��������Τ�HTML���Ѵ�����
725     sub convert_html {
726     my ($txt) = shift;
727     my (@txt) = split(/\n/, $txt);
728     foreach (@txt) {
729     chomp;
730     if (/^\*\*(.*)/) {
731     push(@result, splice(@saved), '<h3>' . &inline($1) . '</h3>');
732     } elsif (/^\*(.*)/) {
733     push(@result, splice(@saved), '<h2>' . &inline($1) . '</h2>');
734     } elsif (/^----/) {
735     push(@result, splice(@saved), '<hr>');
736     } elsif (/^(-{1,3})(.*)/) {
737     &back_push('ul', length($1));
738     push(@result, '<li>' . &inline($2) . '</li>');
739     } elsif (/^:([^:]+):(.*)/) {
740     &back_push('dl', 1);
741     push(@result, '<dt>' . &inline($1) . '</dt>', '<dd>' . &inline($2) . '</dd>');
742     } elsif (/^(>{1,3})(.*)/) {
743     &back_push('blockquote', length($1));
744     push(@result, &inline($2));
745     } elsif (/^\s*$/) {
746     push(@result, splice(@saved));
747     unshift(@saved, "</p>");
748     push(@result, "<p>");
749     } elsif (/^(\s+.*)$/) {
750     &back_push('pre', 1);
751     push(@result, &escape($1)); # Not &inline, but &escape
752     } else {
753     push(@result, &inline($_));
754     }
755     }
756     push(@result, splice(@saved));
757     return join("\n", @result);
758     }
759    
760     # &back_push($tag, $count)
761     # $tag�Υ�����$level��٥�ޤǵͤ�롣
762     sub back_push {
763     my ($tag, $level) = @_;
764     while (@saved > $level) {
765     push(@result, shift(@saved));
766     }
767     if ($saved[0] ne "</$tag>") {
768     push(@result, splice(@saved));
769     }
770     while (@saved < $level) {
771     unshift(@saved, "</$tag>");
772     push(@result, "<$tag>");
773     }
774     }
775    
776     # �Խ���ǽ�ڡ�������
777 wakaba 1.10 sub is_editable {return 1;
778     ## TODO: ...
779 wakaba 1.9 my ($pagename) = @_;
780     foreach (@uneditable) {
781     if ($pagename eq $_) {
782     return 0;
783     }
784     }
785     if (&is_valid_name($pagename)) {
786     return 1;
787     }
788     return 0;
789     }
790    
791 wakaba 1.10 # Valid��̾����?
792 wakaba 1.9 sub is_valid_name {
793     my ($pagename) = @_;
794     if ($pagename =~ /^$WikiName$/) {
795     return 1;
796     } elsif ($pagename =~ /^$BracketName$/) {
797     return 1;
798     } else {
799     return 0;
800     }
801     }
802    
803     # ���߻����ʸ���������
804     sub get_current_datestr {
805     my (@wdays) = ( "��", "��", "��", "��", "��", "��", "��" );
806     my ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time);
807     return sprintf("%4d-%02d-%02d (%s) %02d:%02d:%02d",
808     $year + 1900, $mon + 1, $mday, $wdays[$wday], $hour, $min, $sec);
809     }
810    
811     # URL?SomePage�䡢
812     # URL?[[����]]�η������ä���硢(not yet)
813     # ����Ū��mycmd��read�ˤ���$form�����Ƥ����ꤹ�롣
814     sub normalize_form {
815     foreach my $key (keys %form) {
816     if ($key =~ /^$WikiName$/) {
817     $form{mycmd} = 'read';
818     $form{mypage} = $1;
819     last;
820     } elsif ($key =~ /^$BracketName$/) {
821     $form{mycmd} = 'read';
822     $form{mypage} = $1;
823     last;
824     }
825     }
826     }
827    
828     # �Ѵ��ƥ��Ȥ�Ԥʤ��Ȥ��Υ���ץ�
829     sub print_sample {
830     my $txt = &convert_html(<<"EOD");
831     *�縫�Ф�1
832     **�����Ф�1-1
833     -����1
834     -����2
835     -����3
836     ����1����1����1����1����1����1����1����1����1����1����1����1
837     ����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    
840     ����2����2����2����2����2����2����2����2����2����2����2����2
841     ����2����2����2����2����2����2����2����2����2����2����2����2
842     ����2����2����2����2����2����2����2����2����2����2����2����2
843     **�����Ф�1-2
844     :�Ѹ�1:���������񤤤�����ʸ1��''��Ĵñ��''
845     ����1����1����1����1����1����1����1����1����1����1����1����1
846     ����1����1����1����1����1����1����1����1����1����1����1����1
847     ����1����1����1����1����1����1����1����1����1����1����1����1
848     :�Ѹ�2:���������񤤤�����ʸ2
849     :�Ѹ�3:���������񤤤�����ʸ3
850     ----
851     *�縫�Ф�2
852     **�����Ф�2-1
853     &lt;http://suika.fam.cx/&gt;
854     **�����Ф�2-2
855    
856     [[����]]
857    
858     ����1����1����1����1����1����1����1����1����1����1����1����1
859     ����1����1����1����'''��Ĵ'''1����1����1����1����1����1����1����1
860     ����1����1����1����'''''������Ĵ'''''1����1����1����1����1����1����1����1����1
861     >����2����2����2����2����2����2����2����2����2����2����2����2
862     >����2����2����2����2����2����2����2����2����2����2����2����2
863     >����2����2����2����2����2����2����2����2����2����2����2����2
864    
865     ��٥�0��٥�0��٥�0��٥�0��٥�0��٥�0
866    
867     >��٥�1
868     >��٥�1
869     >��٥�1
870     >>��٥�2
871     >>��٥�2
872     >>��٥�2
873     >>>��٥�3
874     -�Ϥ�1
875     --�Ϥ�2
876     ��������2
877     ---�Ϥ�3
878     --�Ϥ�2
879     ---�Ϥ�3
880     --�Ϥ�2
881     ---�Ϥ�3
882     >>>��٥�3
883     >>>��٥�3
884     >>>��٥�3
885     EOD
886     print $txt;
887     exit;
888     }
889    
890     sub diff_check {
891     traverse_sequences(
892     $msgrefA, $msgrefB,
893     {
894     MATCH => \&df_match,
895     DISCARD_A => \&df_delete,
896     DISCARD_B => \&df_add,
897     }
898     );
899     &diff_flush;
900     }
901    
902     sub diff_flush {
903     $diff_text .= join('', map { "-$_\n" } splice(@diff_deleted));
904     $diff_text .= join('', map { "+$_\n" } splice(@diff_added));
905     }
906    
907     sub df_match {
908     my ($a, $b) = @_;
909     &diff_flush;
910     $diff_text .= "=$msgrefA->[$a]\n";
911     }
912    
913     sub df_delete {
914     my ($a, $b) = @_;
915     push(@diff_deleted, $msgrefA->[$a]);
916     }
917    
918     sub df_add {
919     my ($a, $b) = @_;
920     push(@diff_added, $msgrefB->[$b]);
921     }
922    
923     sub calc_message_digest { # You have to use MD5...
924     my $text = shift;
925     my @text = split(//, $text);
926     my $len = length($text);
927     my $checksum = 0;
928     foreach (@text) {
929     $checksum += ord($_);
930     $checksum = ($checksum * 2) % 65536 + (($checksum & 32768) ? 1 : 0); # 16bit rotate
931     }
932     return "$len:$checksum";
933     }
934    
935     # Definition of YukiWikiDB
936     package YukiWikiDB;
937    
938     my $debug = 1;
939    
940     # Constructor
941     sub new {
942     return shift->TIEHASH(@_);
943     }
944    
945     # tying
946     sub TIEHASH {
947     my ($class, $dbname) = @_;
948     my $self = {
949     dir => $dbname,
950     keys => [],
951     };
952     if (not -d $self->{dir}) {
953     if (!mkdir($self->{dir}, 0777)) {
954     print "mkdir(" . $self->{dir} . ") fail\n" if ($debug);
955     return undef;
956     }
957     }
958     return bless($self, $class);
959     }
960    
961     # Store
962     sub STORE {
963     my ($self, $key, $val) = @_;
964     my $file = &make_filename($self, $key);
965     if (open(FILE,"> $file")) {
966     binmode(FILE);
967     print FILE $val;
968     close(FILE);
969     return $self->{$key} = $val;
970     } else {
971     print "$file create error.";
972     }
973     }
974    
975     # Fetch
976     sub FETCH {
977     my ($self, $key) = @_;
978     my $file = &make_filename($self, $key);
979     if (open(FILE, $file)) {
980     local $/;
981     $self->{$key} = <FILE>;
982     close(FILE);
983     }
984     return $self->{$key};
985     }
986    
987     # Exists
988     sub EXISTS {
989     my ($self, $key) = @_;
990     my $file = &make_filename($self, $key);
991     return -e($file);
992     }
993    
994     # Delete
995     sub DELETE {
996     my ($self, $key) = @_;
997     my $file = &make_filename($self, $key);
998     unlink $file;
999     return delete $self->{$key};
1000     }
1001    
1002     sub FIRSTKEY {
1003     my ($self) = @_;
1004     opendir(DIR, $self->{dir}) or die $self->{dir};
1005     @{$self->{keys}} = grep /\.txt$/, readdir(DIR);
1006     foreach my $name (@{$self->{keys}}) {
1007     $name =~ s/\.txt$//;
1008     $name =~ s/[0-9A-F][0-9A-F]/pack("C", hex($&))/eg;
1009     }
1010     return shift @{$self->{keys}};
1011     }
1012    
1013     sub NEXTKEY {
1014     my ($self) = @_;
1015     return shift @{$self->{keys}};
1016     }
1017    
1018     sub make_filename {
1019     my ($self, $key) = @_;
1020     my $enkey = '';
1021     foreach my $ch (split(//, $key)) {
1022     $enkey .= sprintf("%02X", ord($ch));
1023     }
1024     return $self->{dir} . "/$enkey.txt";
1025     }
1026     __END__
1027    
1028     =head1 NAME
1029    
1030     YukiWiki - ��ͳ�˥ڡ������ɲá�������Խ��Ǥ���Web�ڡ�������CGI
1031    
1032     Copyright (C) 2000,2001 by Hiroshi Yuki.
1033     ���� <[email protected]>
1034     http://www.hyuki.com/
1035     http://www.hyuki.com/yukiwiki/
1036    
1037     =head1 SYNOPSIS
1038    
1039     http://www.hyuki.com/yukiwiki/yukiwiki.cgi
1040    
1041     =head1 DESCRIPTION
1042    
1043     YukiWiki�ʷ�륦�������ˤϻ��üԤ���ͳ�˥ڡ������ɲá�������Խ��Ǥ���
1044     �Ի׵Ĥ�Web�ڡ���������CGI�Ǥ���
1045     Web��ư���Ǽ��ĤȤ���äȻ��Ƥ��ޤ�����
1046     Web�Ǽ��Ĥ�ñ�˥�å��������ɲä�������ʤΤ��Ф��ơ�
1047     YukiWiki�ϡ�Web�ڡ������Τ�ͳ���ѹ����뤳�Ȥ��Ǥ��ޤ���
1048    
1049     YukiWiki�ϡ�Cunningham & Cunningham��WikiWikiWeb��
1050     ���ͤ򻲹ͤˤ����ȼ��˺���ޤ�����
1051    
1052     YukiWiki��Perl�ǽ񤫤줿CGI������ץȤȤ��Ƽ¸�����Ƥ��ޤ��Τǡ�
1053     Perl��ư���Web�����Фʤ�����Ū�ưפ����֤Ǥ��ޤ���
1054    
1055     ���Ȥ�dbmopen���Ȥ���Ķ��ʤ�����֤Ǥ��ޤ�(Version 1.5.0�ʹߤʤ�dbmopen���Ȥ��ʤ��Ƥ����֤Ǥ��ޤ�)��
1056    
1057    
1058     YukiWiki�ϥե꡼���եȤǤ���
1059     ����ͳ�ˤ��Ȥ�����������
1060    
1061     =head1 ������ˡ
1062    
1063     =head2 ����
1064    
1065     YukiWiki�κǿ��Ǥϡ�
1066     http://www.hyuki.com/yukiwiki/
1067     ��������Ǥ��ޤ���
1068    
1069     =head2 �ե��������
1070    
1071     readme.txt �ɥ������
1072     yukiwiki.cgi YukiWiki����
1073     yukiwiki.gif �����ʥ��顼�ǡ�
1074     yukimono.gif �����ʥ�Υ����ǡ�
1075     jcode.pl ���������ɥ饤�֥��
1076    
1077     =head2 ���󥹥ȡ���
1078    
1079     =over 4
1080    
1081     =item 1.
1082    
1083     ���������֤�򤯡�
1084    
1085     =item 2.
1086    
1087     yukiwiki.cgi�ΤϤ�������ˤ���������ǧ���ޤ���
1088     �̾�ϲ��⤷�ʤ��Ƥ褤����
1089     �Ϥ����$touchfile��''�ˤ��������褤�Ǥ��礦��
1090    
1091     =item 3.
1092    
1093     yukiwiki.cgi��jcode.pl��Ʊ���Ȥ��������֤��ޤ���
1094    
1095     =item 4.
1096    
1097     ������0��yukiwiki.db�Ȥ����ե���������֤��ޤ���
1098     ��Perl�����ƥ�ˤ�äƤ�yukiwiki.pag, yukiwiki.dir��
1099    
1100     =item 5.
1101    
1102     yukiwiki.cgi�˥֥饦�����饢���������ޤ���
1103    
1104     =back
1105    
1106     =head2 �ѡ��ߥå����
1107    
1108     �ե����� �ѡ��ߥå���� ž���⡼��
1109     yukiwiki.cgi 755 ASCII
1110     yukiwiki.gif 644 BINARY
1111     yukimono.gif 644 BINARY
1112     jcode.pl 644 ASCII
1113    
1114     $dbmopen = 1; �ˤ������:
1115     yukiwiki.db 666 BINARY
1116     (yukiwiki.pag, yukiwiki.dir�ξ��⤢���
1117    
1118     $dbmopen = 0; �ˤ������: (�����ȥǥ��쥯�ȥ��777�ˤ��Ƥ���)
1119     . 777 (ž�����ʤ�)
1120    
1121     =head1 �ǡ����ΥХå����å���ˡ
1122    
1123     $dbmopen = 1;�ξ��ϡ�
1124     �ǡ����Ϥ��٤�yukiwiki.db(.dir, .pag)�����롣
1125     �����Хå����åפ���Ф褤��
1126    
1127     $dbmopen = 0;�ξ��ϡ�
1128     yukiwiki�Ȥ����ǥ��쥯�ȥ꤬�Ǥ���Τǡ�
1129     ����ʲ���Хå����åפ���Ф褤��
1130    
1131     =head1 �������ڡ����κ����
1132    
1133     =over 4
1134    
1135     =item 1.
1136    
1137     �ޤ���Ŭ���ʥڡ������㤨��FrontPage�ˤ����ӡ�
1138     �ڡ����β��ˤ�����Խ��ץ�󥯤򤿤ɤ�ޤ���
1139    
1140     =item 2.
1141    
1142     ����ȥƥ��������Ϥ��Ǥ�����֤ˤʤ�Τǡ�
1143     ������NewPage�Τ褦��ñ��
1144     ����ʸ����ʸ�����ߤ��Ƥ����ʸ�����
1145     ��񤤤ơ���¸�פ��ޤ���
1146    
1147     =item 3.
1148    
1149     ��¸����ȡ�FrontPage�Υڡ������񤭴���ꡢ
1150     ���ʤ����񤤤�NewPage�Ȥ���ʸ����θ���� ? �Ȥ�����󥯤�ɽ������ޤ���
1151     ���� ? �Ϥ��Υڡ������ޤ�¸�ߤ��ʤ����Ȥ򼨤����Ǥ���
1152    
1153     =item 4.
1154    
1155     ���� ? �򥯥�å�����ȿ������ڡ���NewPage���Ǥ��ޤ��Τǡ�
1156     ���ʤ��ι�����ʸ�Ϥ򤽤ο������ڡ����˽񤤤���¸���ޤ���
1157    
1158     =item 5.
1159    
1160     NewPage�ڡ������Ǥ����FrontPage�� ? �Ͼä��ơ���󥯤Ȥʤ�ޤ���
1161    
1162     =back
1163    
1164     =head1 �ƥ����������Υ롼��
1165    
1166     =over 4
1167    
1168     =item *
1169    
1170     Ϣ³����ʣ���Ԥϥե��뤵���ɽ������ޤ���
1171    
1172     =item *
1173    
1174     ���Ԥ�����C<< <p> >>�ζ��ڤ�Ȥʤ�ޤ���
1175    
1176     =item *
1177    
1178     HTML�Υ����Ͻ񤱤ޤ���
1179    
1180     =item *
1181    
1182     B<''�ܡ����''>�Τ褦�˥��󥰥륯��������ĤǤϤ���ȡ�
1183     �ܡ����C<< <b> >>�ˤʤ�ޤ���
1184    
1185     =item *
1186    
1187     B<'''������å�'''>�Τ褦�˥��󥰥륯�����Ȼ��ĤǤϤ���ȡ�
1188     ������å�C<< <i> >>�ˤʤ�ޤ���
1189    
1190     =item *
1191    
1192     B<---->�Τ褦�˥ޥ��ʥ�4�Ĥ�����ȡ�
1193     ��ʿ��C<< <hr> >>�ˤʤ�ޤ���
1194    
1195     =item *
1196    
1197     �Ԥ�B<*>�ǤϤ����ȡ�
1198     �縫�Ф�C<< <h2> >>�ˤʤ�ޤ���
1199    
1200     =item *
1201    
1202     �Ԥ�B<**>�ǤϤ����ȡ�
1203     �����Ф�C<< <h3> >>�ˤʤ�ޤ���
1204    
1205     =item *
1206    
1207     �Ԥ�ޥ��ʥ�-�ǤϤ����ȡ�
1208     �վ��C<< <ul> >>�ˤʤ�ޤ���
1209     �ޥ��ʥ��ο���������ȥ�٥뤬������ޤ���3��٥�ޤǡ�
1210    
1211     -����1
1212     --����1-1
1213     --����1-2
1214     -����2
1215     -����3
1216     --����3-1
1217     ---����3-1-1
1218     ---����3-1-2
1219     --����3-2
1220    
1221     =item *
1222    
1223     �������Ȥ��ȡ�
1224     �Ѹ�Ȳ���ʸ�Υꥹ��C<< <dl> >>���񤱤ޤ���
1225    
1226     :�Ѹ�1:���������񤤤�����ʸ1
1227     :�Ѹ�2:���������񤤤�����ʸ2
1228     :�Ѹ�3:���������񤤤�����ʸ3
1229    
1230     =item *
1231    
1232     ���
1233    
1234     =over 4
1235    
1236     =item *
1237    
1238     LinkToSomePage��FrontPage�Τ褦�ˡ�
1239     ��ñ��κǽ�ΰ�ʸ������ʸ���ˤ�����Τ�
1240     ��İʾ�Ϣ³������Τ�YukiWiki�Υڡ���̾�Ȥʤꡢ
1241     ���줬ʸ����˴ޤޤ��ȥ�󥯤ˤʤ�ޤ���
1242    
1243     =item *
1244    
1245     http://www.hyuki.com/ �Τ褦��URL�ϼ�ưŪ�˥�󥯤ˤʤ�ޤ���
1246    
1247     =item *
1248    
1249     ��Ť��礫�ä�[[ ]]�Ǥ����ä�ʸ����⡢
1250     YukiWiki�Υڡ���̾�ˤʤ�ޤ���
1251     �礫�ä�����ˤϥ��ڡ�����ޤ�ƤϤ����ޤ���
1252     ���ܸ��Ȥ��ޤ���
1253    
1254     =back
1255    
1256     =item *
1257    
1258     ��Ƭ�����ڡ����䥿�֤ǻϤޤäƤ���ȡ�
1259     ����������Ѥߤ�����C<< <pre> >>�Ȥ��ư����ޤ���
1260     �ץ�������ɽ���ʤɤ˻Ȥ��������Ǥ���
1261    
1262    
1263     =item *
1264    
1265     �Ԥ� > �ǤϤ����ȡ�
1266     ����ʸC<< <blockquote> >>���񤱤ޤ���
1267     >�ο���¿���ȥ���ǥ�Ȥ������ʤ�ޤ���3��٥�ޤǡˡ�
1268    
1269     >ʸ��
1270     >ʸ��
1271     >>����ʤ����
1272     >ʸ��
1273    
1274     =back
1275    
1276     =head1 ��������
1277    
1278     =over 4
1279    
1280     =item *
1281    
1282     2001ǯ10��20����Version 1.6.6��
1283    
1284     �����ξ����к���
1285     ���ڡ����δ�ñ�ʥ����å�������äƤ�����
1286     �������˥����å��������Ӥ��롣
1287     �����Ľ��digest�Ȥ���ʸ����򸡺������ʬ���롣
1288     �����MD5�ʤɤǤ����Ȥ�ä����������Τ�����ɡ�
1289    
1290     ���ͻ���ɽ��������å������ʤɤϡֶ˰��פ���Υڡ����򻲹ͤˤ�����
1291    
1292     =item *
1293    
1294     2001ǯ10��17����Version 1.6.5��
1295    
1296     �ץ�ӥ塼���̤ǡ������ܥ���򲡤����Ȥ������������
1297     ��å����������Ƥ�input���Ǥ�type="hidden"��Ȥä�������Τ���롣
1298     ����ˡ�textarea���Ǥ�Ȥ���
1299     �ƥץ�ӥ塼�Ѥ�myspecial_��Ƴ�����Ǥ⤭�줤���к��ǤϤʤ���
1300    
1301     =item *
1302    
1303     2001ǯ8��30����Version 1.6.4��
1304    
1305     URL�ǥ����쥯�Ȥ˥ڡ���̾����ꤷ�Ƥ⡢
1306     $WikiName��$BracketName�ʳ��Υڡ�������ʤ��褦�ˤ�����
1307     (is_valid_name��is_editable����)��
1308    
1309     =item *
1310    
1311     2001ǯ8��30����Version 1.6.3��
1312    
1313     RecentChanges���Խ������Խ��ԲĤȤ�����
1314     �Խ��Բĥڡ�����@uneditable�˥ڡ���̾������롣
1315    
1316     =item *
1317    
1318     2001ǯ2��25����Version 1.6.1, 1.6.2��
1319    
1320     ��ʬ��ǽ�ΥХ�������
1321     do_preview��'>'�������ʤ��Х�����
1322     �ʥ桼������λ�Ŧ�ˡ�
1323    
1324     =item *
1325    
1326     2001ǯ2��22����Version 1.6.0��
1327     ��ʬ��ǽ�����������
1328    
1329     =item *
1330    
1331     2001ǯ2��19����Version 1.5.4��
1332     �����ե�����ؤΥ�󥯤ϲ����ˤ��Ƥߤ���
1333    
1334     =item *
1335    
1336     2001ǯ2��19����Version 1.5.3��
1337     RecentChanges����˺�������ڡ���������Τ��᤿��
1338     use strict;�ǰ��ä�������ʬ�򾯤�����(�����ǤϤʤ�)��
1339    
1340     =item *
1341    
1342     2001ǯ2��16����Version 1.5.2��
1343     textarea��ɽ������ӥץ�ӥ塼�������� < �� > �� &lt; �� &gt; ���Ѵ�����
1344     (do_preview, editpage, print_preview_buttons)��
1345    
1346     =item *
1347    
1348     2000ǯ12��27����Version 1.5.1��
1349     �ץ�ӥ塼���̤�����������
1350    
1351     =item *
1352    
1353     2000ǯ12��22����Version 1.5.0��
1354     ����Ū�ˤ����֤��ľ������
1355     ���������Ӻ�������褦�ˤ���(do_list)��
1356     �񤭹������˳�ǧ���̤�Ф��褦�ˤ���(do_preview)��
1357     �ƥ����Ȥν������Խ����̤����줿(do_edit, do_reedit)��
1358     WhatsNew��RecentChanges��TopPage��FrontPage���ѹ�������
1359    
1360     =item *
1361    
1362     2000ǯ12��20����Version 1.1.0��
1363     tie�����Ѥ��ơ�dbmopen���Ȥ��ʤ����Ǥ�ư���褦�˽�����
1364     ���ѼԤ�1�ͤǤ���ֶ˰��פ��󤫤�
1365     ���äƤ��������������ɤ򸵤ˤ��Ƥ��ޤ���
1366    
1367     =item *
1368    
1369     2000ǯ9��5����Version 1.0.2��
1370     <body color=...> �� <body bgcolor=...>
1371     ���ѼԤ���λ�Ŧ�ˤ�롣���ա�
1372    
1373     =item *
1374    
1375     2000ǯ8��6����Version 1.0.1�������
1376     C MAGAZINE�ʥ��եȥХ󥯥ѥ֥�å��󥰡�
1377     2000ǯ10���Ϣ�ܵ������������ǡ�
1378     [[ ]] �κǸ夬��˾�פΤ褦�˥��ե�JIS��
1379     0x5D�ˤʤ���β����Ԥʤä���
1380    
1381     =item *
1382    
1383     2000ǯ8��5����Version 1.0.0�������
1384    
1385     =item *
1386    
1387     2000ǯ7��23����Version 0.82�������
1388     �Խ����Υ�󥯥ߥ���
1389     <textarea>��°���ѹ���
1390    
1391     =item *
1392    
1393     2000ǯ7��22����Version 0.81�������
1394     �������Ȥ߹��ࡣ
1395    
1396     =item *
1397    
1398     2000ǯ7��21����Version 0.80�������
1399     POD��CGI��˽񤭹��ࡣ
1400    
1401     =item *
1402    
1403     2000ǯ7��19����Version 0.70�������
1404     '''������å�'''�䡢--��---��>>��>>>�ʤɤ������
1405    
1406     =item *
1407    
1408     2000ǯ7��18����Version 0.60�������
1409     *����*��''����''���ѹ�
1410    
1411     =item *
1412    
1413     2000ǯ7��17����Version 0.50�������
1414    
1415     =item *
1416    
1417     2000ǯ7��17��������ˤ��������ɲä��롣
1418    
1419     =item *
1420    
1421     2000ǯ7��16�������������ɲá�
1422    
1423     =item *
1424    
1425     2000ǯ7��15����������
1426    
1427     =back
1428    
1429     =head1 TODO
1430    
1431     - �ƥ�����ɽ���⡼��
1432     - Charset��������
1433     - textarea����Ĥ������б�
1434     - ��˥塼�αѸ�ɽ���յ�
1435     - �ץ�ӥ塼�Υܥ���ǡ�mymsg��input��value������Ƥ��뤬�����Ԥ򤽤Τޤ�value�ˤ���ƤϤ����ʤ��ΤǤϤʤ�����
1436     - �ֺ��Խ��פε�ǽ�ϥ֥饦���� back �ǽ�ʬ�ǤϤʤ������ץ�ӥ塼�Ϥ�äȥ���ץ�ˡ�
1437     - �ڡ��������ȥ��Wikiname�ˤ������ˤ�����褦�ˤ��롣
1438     - InterWiki���ε�ǽ��URL�򱣤��Ĥġ���󥯤�ĥ���
1439    
1440     =head1 ���
1441    
1442     Copyright (C) 2000 by Hiroshi Yuki.
1443     ���� <[email protected]>
1444     http://www.hyuki.com/
1445     http://www.hyuki.com/yukiwiki/
1446    
1447     ���䡢�ո����Х����� [email protected] �˥᡼�뤷�Ƥ���������
1448    
1449     =head1 ���۾��
1450    
1451     YukiWiki�ϡ�
1452     GNU General Public License�ˤƸ������ޤ���
1453    
1454     YukiWiki�ϥե꡼���եȤǤ���
1455     ����ͳ�ˤ��Ȥ�����������
1456     ��ʬ���ߤ�YukiWiki������褦�˥���ץ�ˤ��Ƥ���ޤ���
1457    
1458     =head1 �ռ�
1459    
1460     �ܲȤ�WikiWiki���ä�Cunningham & Cunningham, Inc.��
1461     ���դ��ޤ���
1462    
1463     YukiWiki��ڤ���ǻȤäƤ�������
1464     �ͥåȾ�������˴��դ��ޤ���
1465    
1466     YukiWiki�Υ�����ǥ����󤷤Ƥ������ä��������व��
1467     http://city.hokkai.or.jp/~reina/
1468     �˴��դ��ޤ���
1469    
1470     tie��Ȥä��Ǥθ��ˤʤ륳���ɤ����äƤ������ä�
1471     �ֶ˰��פ���˴��դ��ޤ���
1472    
1473     =head1 ���ȥ��
1474    
1475     =over 4
1476    
1477     =item *
1478    
1479     YukiWiki�ۡ���ڡ���
1480     http://www.hyuki.com/yukiwiki/
1481    
1482     =item *
1483    
1484     �ܲȤ�WikiWiki
1485     http://c2.com/cgi/wiki?WikiWikiWeb
1486    
1487     =item *
1488    
1489     �ܲȤ�WikiWiki�κ��(Cunningham & Cunningham, Inc.)
1490     http://c2.com/
1491    
1492     =item *
1493    
1494     YukiWiki�Υ����ǥ�����򤷤Ƥ������ä��������व��Υڡ���
1495     http://city.hokkai.or.jp/~reina/
1496    
1497     =back
1498    
1499     =cut

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24