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

Contents of /suikawiki/script/wiki.cgi

Parent Directory Parent Directory | Revision Log Revision Log


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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24