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

Contents of /suikawiki/script/wiki.cgi

Parent Directory Parent Directory | Revision Log Revision Log


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

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24  
Google Analytics is used in this page; Cookies are used. 忍者AdMax is used in this page; Cookies are used. Privacy policy.