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

Diff of /suikawiki/script/wiki.cgi

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1 by wakaba, Mon Feb 4 13:19:08 2002 UTC revision 1.2 by wakaba, Mon Feb 4 13:31:47 2002 UTC
# Line 1  Line 1 
1  #!/usr/local/bin/perl  #!/usr/bin/perl
2  use lib "../lib";  use lib "../lib";
3  use CGI::Carp 'fatalsToBrowser';  use CGI::Carp 'fatalsToBrowser';
4  use Algorithm::Diff qw(traverse_sequences);  use Algorithm::Diff qw(traverse_sequences);
5  # use strict;  # use strict;
6  #  #
7  # yukiwiki.cgi - Yet another WikiWikiWeb clone.  # yukiwiki.cgi - Yet another WikiWikiWeb clone.
8  #  #
9  # Copyright (C) 2000,2001 by Hiroshi Yuki.  # Copyright (C) 2000,2001 by Hiroshi Yuki.
10  # <hyuki@hyuki.com>  # <hyuki@hyuki.com>
11  # http://www.hyuki.com/yukiwiki/  # http://www.hyuki.com/yukiwiki/
12  #  #
13  # This program is free software; you can redistribute it and/or modify  # 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  # 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  # the Free Software Foundation; either version 2 of the License, or
16  # (at your option) any later version.  # (at your option) any later version.
17  #  #
18  # This program is distributed in the hope that it will be useful,  # This program is distributed in the hope that it will be useful,
19  # but WITHOUT ANY WARRANTY; without even the implied warranty of  # but WITHOUT ANY WARRANTY; without even the implied warranty of
20  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  # GNU General Public License for more details.  # GNU General Public License for more details.
22  #  #
23  # $Id$  # $Id$
24  ##############################  ##############################
25  my $version = "1.6.6";  my $version = "1.6.6";
26  ##############################  ##############################
27  # 単独テストのときには 1 にする。  # テアニネ・ニ・ケ・ネ、ホ、ネ、ュ、ヒ、マ 1 、ヒ、ケ、。」
28  my $testing = 0;  my $testing = 0;
29  ##############################  ##############################
30  # 漢字ライブラリ  # エチサ・鬣、・ヨ・鬣
31  my $jcodelib = 'jcode.pl';  my $jcodelib = 'jcode.pl';
32  ##############################  ##############################
33  # 保存・表示の漢字コード  # ハンツク。ヲノスシィ、ホエチサ・ウ。シ・ノ
34  my $kanjicode = 'sjis';     # 'sjis' 'euc'  my $kanjicode = 'euc';     # 'sjis' 'euc'
35  my $charset = 'Shift_JIS';  # 'Shift_JIS' 'EUC-JP'  my $charset = 'euc-jisx0213';  # 'Shift_JIS' 'EUC-JP'
36  ##############################  ##############################
37  # dbmopenが使えるなら1、使えないなら0  # dbmopen、ャサネ、ィ、、ハ、1。「サネ、ィ、ハ、、、ハ、0
38  my $dbmopen = 0;  my $dbmopen = 0;
39  ##############################  ##############################
40  # データベース名(.pag, .dir, .dbなどは不要)  # ・ヌ。シ・ソ・ル。シ・ケフセ。ハ.pag, .dir, .db、ハ、ノ、マノヤヘラ。ヒ
41  # $dbmopen = 1のときはデータベース名、  # $dbmopen = 1、ホ、ネ、ュ、マ・ヌ。シ・ソ・ル。シ・ケフセ。「
42  # $dbmopen = 0のときはディレクトリ名になる。  # $dbmopen = 0、ホ、ネ、ュ、マ・ヌ・」・・ッ・ネ・フセ、ヒ、ハ、。」
43  my $dbname = './yukiwiki';  my $dbname = './wiki';
44  my $diffdbname = './yukidiff';  my $diffdbname = './wikidiff';
45  ##############################  ##############################
46  # 修正者の氏名(自由に変更してください)  # ス、タオシヤ、ホサ睥セ。ハシォヘウ、ヒハムケケ、キ、ニ、ッ、タ、オ、、。ヒ
47  my $modifier = 'Hiroshi Yuki';  my $modifier = 'suika';
48  ##############################  ##############################
49  # 修正者のWebページ(自由に変更してください)  # ス、タオシヤ、ホWeb・レ。シ・ク。ハシォヘウ、ヒハムケケ、キ、ニ、ッ、タ、オ、、。ヒ
50  my $modifierlink = 'http://www.hyuki.com/';  my $modifierlink = 'http://suika.fam.cx/';
51  ##############################  ##############################
52  # このページのURL  # 、ウ、ホ・レ。シ・ク、ホURL
53  my $thisurl = 'yukiwiki.cgi';  my $thisurl = 'wiki';
54  ##############################  ##############################
55  # 開始ページ名  # ウォサマ・レ。シ・クフセ
56  my $toppage = 'FrontPage';  my $toppage = 'HomePage';
57  ##############################  ##############################
58  # 最終更新ページ名  # コヌスェケケソキ・レ。シ・クフセ
59  my $whatsnew = 'RecentChanges';  my $whatsnew = 'RecentChanges';
60  ##############################  ##############################
61  # 最終更新に掲載するページ数  # コヌスェケケソキ、ヒキヌコワ、ケ、・レ。シ・クソ
62  my $maxnew = 50;  my $maxnew = 50;
63  ##############################  ##############################
64  # アイコンファイル名(カラー版)  # ・「・、・ウ・・ユ・。・、・フセ。ハ・ォ・鬘シネヌ。ヒ
65  my $iconfile = 'yukiwiki.gif';  my $iconfile = '';
66  ##############################  ##############################
67  # アイコンファイル名(モノクロ版)  # ・「・、・ウ・・ユ・。・、・フセ。ハ・筵ホ・ッ・ネヌ。ヒ
68  # my $iconfile = 'yukimono.gif';  # my $iconfile = '';
69  ##############################  ##############################
70  # ページを変更したときにtouchするファイル(''なら何もしない)  # ・レ。シ・ク、ハムケケ、キ、ソ、ネ、ュ、ヒtouch、ケ、・ユ・。・、・。ハ''、ハ、魎ソ、筅キ、ハ、、。ヒ
71  my $touchfile = 'touch.txt';  my $touchfile = 'touch.txt';
72  ##############################  ##############################
73  # プレビュー用の背景色  # ・ラ・・モ・蝪シヘム、ホヌリキハソァ
74  my $preview_color = '#FFCCCC';  my $preview_color = '#FFCCCC';
75  ##############################  ##############################
76  # 全ページのスタイル  # チエ・レ。シ・ク、ホ・ケ・ソ・、・
77  my $style = <<'EOD';  my $style = <<'EOD';
78  pre, dl, ul, ol, p, blockquote { line-height:120%; }  pre, dl, ul, ol, p, blockquote { line-height:120%; }
79  a { text-decoration: none; }  a { text-decoration: none; }
80  a:link { color: #0000FF; background-color: #FFFFFF; }  a:link { color: #0000FF; background-color: #FFFFFF; }
81  a:visited { color: #9900CC; background-color: #FFFFFF; }  a:visited { color: #9900CC; background-color: #FFFFFF; }
82  a:hover { text-decoration: underline; }  a:hover { text-decoration: underline; }
83  EOD  EOD
84  ##############################  ##############################
85  # テキスト入力部分の大きさ  # ・ニ・ュ・ケ・ネニホマノハャ、ホツ遉ュ、オ
86  my $cols = 80;  my $cols = 80;
87  my $rows = 20;  my $rows = 20;
88  ##############################  ##############################
89  my %form = ();  my %form = ();
90  my %database = ();  my %database = ();
91  my %diffbase = ();  my %diffbase = ();
92  my $diff_text = '';  my $diff_text = '';
93  my @diff_added = ();  my @diff_added = ();
94  my @diff_deleted = ();  my @diff_deleted = ();
95  my $msgrefA;  my $msgrefA;
96  my $msgrefB;  my $msgrefB;
97  ##############################  ##############################
98  # 編集不可ページ名一覧  # ハヤスクノヤイト・レ。シ・クフセーヘ
99  my @uneditable = ( $whatsnew );  my @uneditable = ( $whatsnew );
100  ##############################  ##############################
101  # リンク用の正規表現  # ・・・ッヘム、ホタオオャノスクス
102  # YukiWikiのリンクは2種類ある。  # YukiWiki、ホ・・・ッ、マ2シホ爨「、。」
103  #  #
104  # (1) WikiName (RecentChangesとかFrontPageのようなもの)  # (1) WikiName (RecentChanges、ネ、ォFrontPage、ホ、隍ヲ、ハ、筅ホ)
105  # (2) BracketName ([[結城浩]]とか[[トラブルシュート]]のようなもの)  # (2) BracketName ([[キセケタ]]、ネ、ォ[[・ネ・鬣ヨ・・キ・蝪シ・ネ]]、ホ、隍ヲ、ハ、筅ホ)
106  #  #
107  # ※シフトJISの2バイト目には ']' が来うるので、  # 「ィ・キ・ユ・ネJIS、ホ2・ミ・、・ネフワ、ヒ、マ ']' 、ャヘ隍ヲ、、ホ、ヌ。「
108  # 文字']'を1つ多くとるようにしている。  # ハクサ']'、1、トツソ、ッ、ネ、、隍ヲ、ヒ、キ、ニ、、、。」
109  #  #
110  my $WikiName = '([A-Z][a-z]+([A-Z][a-z]+)+)';  my $WikiName = '([A-Z][a-z]+([A-Z][a-z]+)+)';
111  my $BracketName = '\[\[([^>\s]+?\]?)\]\]';  my $BracketName = '\[\[([^>\s]+?\]?)\]\]';
112    
113  # アイコン部分のタグ  # ・「・、・ウ・ノハャ、ホ・ソ・ー
114  my $IconTag = <<"EOD";  my $IconTag = ''; #<<"EOD";
115  <a href="http://www.hyuki.com/yukiwiki/"><img src="$iconfile"  #<a href="http://www.hyuki.com/yukiwiki/"><img src="$iconfile"
116   border="0" width="80" height="80" alt="[YukiWiki]" /></a>  # border="0" width="80" height="80" alt="[YukiWiki]" /></a>
117  EOD  #EOD
118    
119  require "$jcodelib";  require "$jcodelib";
120    
121  &init_form($kanjicode);  &init_form($kanjicode);
122    
123  if ($testing) {  if ($testing) {
124      %form = (      %form = (
125          # 'mycmd' => 'write',          # 'mycmd' => 'write',
126          'mycmd' => 'read',          'mycmd' => 'read',
127          #'mycmd' => 'search',          #'mycmd' => 'search',
128          #'mycmd' => 'edit',          #'mycmd' => 'edit',
129          'mymsg' => <<"EOD",          'mymsg' => <<"EOD",
130  はじめまして。  、マ、ク、皃゙、キ、ニ。」
131  これからいろいろ書き込みますね。  、ウ、、ォ、鬢、、、、、ス、ュケ、゚、゙、ケ、ヘ。」
132  LinkPageも見てください。  LinkPage、篋ォ、ニ、ッ、タ、オ、、。」
133  TestPageはどうでしょうか。  TestPage、マ、ノ、ヲ、ヌ、キ、遉ヲ、ォ。」
134  どうぞよろしく。  、ノ、ヲ、セ、隍、キ、ッ。」
135  http://www.hyuki.com/  http://www.hyuki.com/
136  [[結城浩]]  [[キセケタ]]
137  EOD  EOD
138          'mypage' => '<結城浩>',          'mypage' => '<キセケタ>',
139          'myword' => '結',          'myword' => 'キ',
140          # '3C8C8B8FE98D5F3E' => '',          # '3C8C8B8FE98D5F3E' => '',
141          # 'TestPage' => '',          # 'TestPage' => '',
142      );      );
143  }  }
144  &main;  &main;
145  exit(0);  exit(0);
146    
147  # メイン  # ・皈、・
148  sub main {  sub main {
149      &normalize_form;      &normalize_form;
150      if ($dbmopen) {      if ($dbmopen) {
151          if (!dbmopen(%database, $dbname, 0666)) {          if (!dbmopen(%database, $dbname, 0666)) {
152              &print_error("(dbmopen) $dbname が作れません。");              &print_error("(dbmopen) $dbname 、ャコ、、゙、サ、。」");
153          }          }
154      } else {      } else {
155          if (!tie(%database, "YukiWikiDB", $dbname)) {          if (!tie(%database, "YukiWikiDB", $dbname)) {
156              &print_error("(tie error)");              &print_error("(tie error)");
157          }          }
158      }      }
159    
160      # myspecial対応      # myspecialツミア
161      foreach (keys %form) {      foreach (keys %form) {
162          if (/^myspecial_(.*)/) {          if (/^myspecial_(.*)/) {
163              $form{mycmd} = $1;              $form{mycmd} = $1;
164              last;              last;
165          }          }
166      }      }
167    
168      if ($form{mycmd} eq 'read') {      if ($form{mycmd} eq 'read') {
169          &do_read;          &do_read;
170      } elsif ($form{mycmd} eq 'preview') {      } elsif ($form{mycmd} eq 'preview') {
171          &do_preview;          &do_preview;
172      } elsif ($form{mycmd} eq 'write') {      } elsif ($form{mycmd} eq 'write') {
173          &do_write;          &do_write;
174      } elsif ($form{mycmd} eq 'edit') {      } elsif ($form{mycmd} eq 'edit') {
175          &do_edit;          &do_edit;
176      } elsif ($form{mycmd} eq 'reedit') {      } elsif ($form{mycmd} eq 'reedit') {
177          &do_reedit;          &do_reedit;
178      } elsif ($form{mycmd} eq 'search') {      } elsif ($form{mycmd} eq 'search') {
179          &do_search;          &do_search;
180      } elsif ($form{mycmd} eq 'list') {      } elsif ($form{mycmd} eq 'list') {
181          &do_list;          &do_list;
182      } elsif ($form{mycmd} eq 'diff') {      } elsif ($form{mycmd} eq 'diff') {
183          &do_diff;          &do_diff;
184      } else {      } else {
185          $form{mypage} = $toppage;          $form{mypage} = $toppage;
186          &do_read;          &do_read;
187      }      }
188      if ($dbmopen) {      if ($dbmopen) {
189          dbmclose(%database);          dbmclose(%database);
190      } else {      } else {
191          untie(%database);          untie(%database);
192      }      }
193  }  }
194    
195  # ページの表示  # ・レ。シ・ク、ホノスシィ
196  sub do_read {  sub do_read {
197      my $page_name = $form{mypage};      my $page_name = $form{mypage};
198      my $percent_name = &encode_percent($page_name);      my $percent_name = &encode_percent($page_name);
199      &print_header($page_name);      &print_header($page_name);
200      print qq|<h1>$IconTag<a href="$thisurl?mycmd=search&myword=$percent_name">$page_name</a></h1>\n|;      print qq|<h1>$IconTag<a href="$thisurl?mycmd=search;myword=$percent_name">$page_name</a></h1>\n|;
201      &print_toolbar($page_name);      &print_toolbar($page_name);
202      print &convert_html(&get_page($page_name));      print &convert_html(&get_page($page_name));
203      &print_footer;      &print_footer;
204  }  }
205    
206  # ページの編集  # ・レ。シ・ク、ホハヤスク
207  sub do_edit {  sub do_edit {
208      if (not &is_editable($form{mypage})) {      if (not &is_editable($form{mypage})) {
209          # 編集不可ページは表示のみ          # ハヤスクノヤイト・レ。シ・ク、マノスシィ、ホ、゚
210          &do_read;          &do_read;
211          return;          return;
212      }      }
213      &editpage(&get_page($form{mypage}));      &editpage(&get_page($form{mypage}));
214  }  }
215    
216  # ページの再編集  # ・レ。シ・ク、ホコニハヤスク
217  sub do_reedit {  sub do_reedit {
218      if (not &is_editable($form{mypage})) {      if (not &is_editable($form{mypage})) {
219          # 編集不可ページは表示のみ          # ハヤスクノヤイト・レ。シ・ク、マノスシィ、ホ、゚
220          &do_read;          &do_read;
221      } else {      } else {
222          &editpage($form{mymsg});          &editpage($form{mymsg});
223      }      }
224  }  }
225    
226  sub editpage {  sub editpage {
227      my $page_msg = shift;      my $page_msg = shift;
228      my $page_name = $form{mypage};      my $page_name = $form{mypage};
229      my $digest = &calc_message_digest($page_msg);      my $digest = &calc_message_digest($page_msg);
230      &print_header($page_name);      &print_header($page_name);
231      print qq|<h1>$IconTag${page_name}の編集</h1>\n|;      print qq|<h1>$IconTag${page_name}、ホハヤスク</h1>\n|;
232      &print_toolbar($page_name);      &print_toolbar($page_name);
233      $page_msg = &escape($page_msg);      $page_msg = &escape($page_msg);
234      print <<"EOD";      print <<"EOD";
235  <form action="$thisurl" method="post">  <form action="$thisurl" method="post">
236  <input type="hidden" name="mycmd" value="preview">  <input type="hidden" name="mycmd" value="preview">
237  <input type="hidden" name="mypage" value="$page_name">  <input type="hidden" name="mypage" value="$page_name">
238  <input type="hidden" name="mydigest" value="$digest">  <input type="hidden" name="mydigest" value="$digest">
239  <textarea cols="$cols" rows="$rows" name="mymsg" wrap="virtual">$page_msg</textarea><br>  <textarea cols="$cols" rows="$rows" name="mymsg" wrap="virtual">$page_msg</textarea><br>
240  <input type="submit" value="プレビュー">  <input type="submit" value="・ラ・・モ・蝪シ">
241  </form>  </form>
242  <hr>  <hr>
243  <h3>テキスト整形のルール</h3>  <h3>・ニ・ュ・ケ・ネターキチ、ホ・。シ・</h3>
244    
245  <p>通常は入力した文字がそのまま出力されますが、  <p>トフセ、マニホマ、キ、ソハクサ、ャ、ス、ホ、゙、゙スミホマ、オ、、゙、ケ、ャ。「
246  以下のルールに従ってテキスト整形を行うことができます。</p>  ーハイシ、ホ・。シ・、ヒスセ、テ、ニ・ニ・ュ・ケ・ネターキチ、ケヤ、ヲ、ウ、ネ、ャ、ヌ、ュ、゙、ケ。」</p>
247    
248  <ul>  <ul>
249  <li>  <li>
250  空行は段落の区切りとなります。  カケヤ、マテハヘ、ホカ霏レ、熙ネ、ハ、熙゙、ケ。」
251    
252  <li>  <li>
253  HTMLのタグは書けません。  HTML、ホ・ソ・ー、マス、ア、゙、サ、。」
254    
255  <li>  <li>
256  ''ボールド''のようにシングルクォート二つではさむと、ボールドになります。  ''カットエ''、ホ、隍ヲ、ヒ・キ・・ー・・ッ・ゥ。シ・ネニ、ト、ヌ、マ、オ、爨ネ。「カットエ、ヒ、ハ、熙゙、ケ。」
257    
258  <li>  <li>
259  '''イタリック'''のようにシングルクォート三つではさむと、イタリックになります。  '''ケケ、ヒカットエ'''、ホ、隍ヲ、ヒ・キ・・ー・・ッ・ゥ。シ・ネサー、ト、ヌ、マ、オ、爨ネ。「ケケ、ヒカットエ、ヒ、ハ、熙゙、ケ。」
260    
261  <li>  <li>
262  ----のようにマイナス4つがあると、水平線になります。  ----、ホ、隍ヲ、ヒ・゙・、・ハ・ケ4、ト、ャ、「、、ネ。「ソ衞ソタ、ヒ、ハ、熙゙、ケ。」
263    
264  <li>  <li>
265  *を行頭に書くと大見出しになります。  *、ケヤニャ、ヒス、ッ、ネツ邵ォスミ、キ、ヒ、ハ、熙゙、ケ。」
266    
267  <li>  <li>
268  **を行頭に書くと小見出しになります。  **、ケヤニャ、ヒス、ッ、ネセョクォスミ、キ、ヒ、ハ、熙゙、ケ。」
269    
270  <li>  <li>
271  -を行頭に書くと箇条書きになります。- -- --- の3レベルがあります。  -、ケヤニャ、ヒス、ッ、ネイユセス、ュ、ヒ、ハ、熙゙、ケ。」- -- --- 、ホ3・・ル・、ャ、「、熙゙、ケ。」
272    
273  <li>  <li>
274  :を行頭に書くと用語と解説文が作れます。  :、ケヤニャ、ヒス、ッ、ネヘムク、ネイタ簗ク、ャコ、、゙、ケ。」
275    
276  <pre>  <pre>
277      :用語1:いろいろ書いた解説文1      :ヘムク1:、、、、、、ス、、、ソイタ簗ク1
278      :用語2:いろいろ書いた解説文2      :ヘムク2:、、、、、、ス、、、ソイタ簗ク2
279      :用語3:いろいろ書いた解説文3      :ヘムク3:、、、、、、ス、、、ソイタ簗ク3
280  </pre>  </pre>
281    
282  <li>  <li>
283  http://www.hyuki.com/ のようなURLは自動的にリンクになります。  http://www.hyuki.com/ 、ホ、隍ヲ、ハURL、マシォニーナェ、ヒ・・・ッ、ヒ、ハ、熙゙、ケ。」
284    
285  <li>  <li>
286  YukiWikiのように大文字小文字を混ぜた英文字列を書くと、  YukiWiki、ホ、隍ヲ、ヒツ醋クサセョハクサ、コョ、シ、ソアムハクサホ、ス、ッ、ネ。「
287  YukiWikiのページ名になります。  YukiWiki、ホ・レ。シ・クフセ、ヒ、ハ、熙゙、ケ。」
288    
289  <li>  <li>
290  [[結城浩]]のように二重の大かっこ[[ ]]でくくった文字列を書くと、  [[キセケタ]]、ホ、隍ヲ、ヒニスナ、ホツ遉ォ、テ、ウ[[ ]]、ヌ、ッ、ッ、テ、ソハクサホ、ス、ッ、ネ。「
291  YukiWikiのページ名になります。  YukiWiki、ホ・レ。シ・クフセ、ヒ、ハ、熙゙、ケ。」
292  大かっこの中にはスペースを含めてはいけません。  ツ遉ォ、テ、ウ、ホテ讀ヒ、マ・ケ・レ。シ・ケ、エ゙、皃ニ、マ、、、ア、゙、サ、。」
293  日本語も使えます。  ニヒワク、篏ネ、ィ、゙、ケ。」
294    
295  <li>  <li>
296  行頭がスペースで始まっていると、  ケヤニャ、ャ・ケ・レ。シ・ケ、ヌサマ、゙、テ、ニ、、、、ネ。「
297  その段落は整形済み扱われます。  、ス、ホテハヘ、マターキチコム、゚ーキ、、、゙、ケ。」
298  プログラムを書き込むときに使うと便利です。  ・ラ・・ー・鬣爨ス、ュケ、爨ネ、ュ、ヒサネ、ヲ、ネハリヘ、ヌ、ケ。」
299    
300  <li>  <li>
301  > を行頭に書くと、  &gt; 、ケヤニャ、ヒス、ッ、ネ。「
302  引用文が書けます。  ーヘムハク、ャス、ア、゙、ケ。」
303  >の数が多いとインデントが深くなります(3レベルまで)。  &gt; 、ホソ、ャツソ、、、ネ・、・・ヌ・・ネ、ャソシ、ッ、ハ、熙゙、ケ。ハ3・・ル・、゙、ヌ。ヒ。」
304    
305  </ul>  </ul>
306  EOD  EOD
307      &print_footer;      &print_footer;
308  }  }
309    
310  # ページの検索  # ・レ。シ・ク、ホク。コ
311  sub do_search {  sub do_search {
312      if ($form{myword}) {      if ($form{myword}) {
313          &print_header('検索結果');          &print_header('ク。コキイフ');
314          print qq|<h1>$IconTag$form{myword}の検索結果</h1>\n|;          print qq|<h1>$IconTag$form{myword}、ホク。コキイフ</h1>\n|;
315          &print_toolbar();          &print_toolbar();
316          print qq|<ul>\n|;          print qq|<ul>\n|;
317          my $count = 0;          my $count = 0;
318          foreach my $page_name (sort keys %database) {    # sortするのは無謀かな          foreach my $page_name (sort keys %database) {    # sort、ケ、、ホ、マフオヒナ、ォ、ハ
319              if ($database{$page_name} =~ /\Q$form{'myword'}\E/) {              if ($database{$page_name} =~ /\Q$form{'myword'}\E/) {
320                  my $encoded = &encode_percent($page_name);                  my $encoded = &encode_percent($page_name);
321                  print qq|<li><a href="$thisurl?mycmd=read&mypage=$encoded">$page_name</a>\n|;                  print qq|<li><a href="$thisurl?mycmd=read;mypage=$encoded">$page_name</a>\n|;
322                  $count++;                  $count++;
323              }              }
324          }          }
325          print qq|</ul>\n|;          print qq|</ul>\n|;
326          if ($count > 0) {          if ($count > 0) {
327              print qq|<p><b>$form{myword}</b>を含むページは、上に示す<b>$count</b>ページです。</p>\n|;              print qq|<p><strong>$form{myword}</strong>、エ゙、爭レ。シ・ク、マ。「セ螟ヒシィ、ケ<strong>$count</strong> ・レ。シ・ク、ヌ、ケ。」</p>\n|;
328          } else {          } else {
329              print qq|<p><b>$form{myword}</b>を含むページは見つかりません。</p>\n|;              print qq|<p><strong>$form{myword}</strong>、エ゙、爭レ。シ・ク、マクォ、ト、ォ、熙゙、サ、。」</p>\n|;
330          }          }
331      } else {      } else {
332          &print_header('単語検索');          &print_header('テアクク。コ');
333          print qq|<h1>$IconTag単語検索</h1>\n|;          print qq|<h1>$IconTagテアクク。コ</h1>\n|;
334          &print_toolbar();          &print_toolbar();
335      }      }
336      print <<"EOD";      print <<"EOD";
337  <p>  <p>
338  <form action="$thisurl" method="post">  <form action="$thisurl" method="post">
339  <input type="hidden" name="mycmd" value="search">  <input type="hidden" name="mycmd" value="search">
340  <input type="text" name="myword" size="20" value="$form{myword}">  <input type="text" name="myword" size="20" value="$form{myword}">
341  <input type="submit" value="単語検索">  <input type="submit" value="テアクク。コ">
342  </form>  </form>
343  </p>  </p>
344  EOD  EOD
345      &print_footer;      &print_footer;
346  }  }
347    
348  # ページの一覧  # ・レ。シ・ク、ホーヘ
349  sub do_list {  sub do_list {
350      &print_header('ページ一覧');      &print_header('・レ。シ・クーヘ');
351      print qq|<h1>$IconTag ページ一覧</h1>\n|;      print qq|<h1>$IconTag ・レ。シ・クーヘ</h1>\n|;
352      &print_toolbar();      &print_toolbar();
353      print qq|<ul>\n|;      print qq|<ul>\n|;
354      foreach my $page_name (sort keys %database) {    # sortするのは無謀かな      foreach my $page_name (sort keys %database) {    # sort、ケ、、ホ、マフオヒナ、ォ、ハ
355          my $encoded = &encode_percent($page_name);          my $encoded = &encode_percent($page_name);
356          print qq|<li><a href="$thisurl?mycmd=read&mypage=$encoded">$page_name</a>\n|          print qq|<li><a href="$thisurl?mycmd=read;mypage=$encoded">$page_name</a>\n|
357      }      }
358      print qq|</ul>\n|;      print qq|</ul>\n|;
359      &print_footer;      &print_footer;
360  }  }
361    
362  # プレビュー  # ・ラ・・モ・蝪シ
363  sub do_preview {  sub do_preview {
364      my $page_name = $form{mypage};      my $page_name = $form{mypage};
365      my $escapedmsg = &escape($form{mymsg});      my $escapedmsg = &escape($form{mymsg});
366      &print_header($page_name);      &print_header($page_name);
367      print qq|<h1>$IconTag${page_name}のプレビュー</h1>\n|;      print qq|<h1>$IconTag${page_name}、ホ・ラ・・モ・蝪シ</h1>\n|;
368      &print_toolbar($page_name);      &print_toolbar($page_name);
369      # local $percent_name = &encode_percent($page_name);      # local $percent_name = &encode_percent($page_name);
370      print qq|<p>以下のプレビューを確認して、よければページ下部のボタンで更新してください。</p>\n|;      print qq|<p>ーハイシ、ホ・ラ・・モ・蝪シ、ウホヌァ、キ、ニ。「、隍ア、、ミ・レ。シ・クイシノ、ホ・ワ・ソ・、ヌケケソキ、キ、ニ、ッ、タ、オ、、。」</p>\n|;
371      if ($form{mymsg}) {      if ($form{mymsg}) {
372          print qq|<table width="100%" bgcolor="$preview_color" ><tr><td>\n|;          print qq|<table width="100%" bgcolor="$preview_color" ><tr><td>\n|;
373          # print &convert_html($escapedmsg);          # print &convert_html($escapedmsg);
374          print &convert_html($form{mymsg});          print &convert_html($form{mymsg});
375          print qq|</td></tr></table>\n|;          print qq|</td></tr></table>\n|;
376      } else {      } else {
377          print qq|<p>(ページの内容は空です。更新するとこのページは<b>削除</b>されます。)</p>\n|;          print qq|<p>。ハ・レ。シ・ク、ホニ簣ニ、マカ、ヌ、ケ。」ケケソキ、ケ、、ネ、ウ、ホ・レ。シ・ク、マ<strong>コス</strong>、オ、、゙、ケ。」。ヒ</p>\n|;
378      }      }
379      &print_preview_buttons($page_name, $escapedmsg, $form{mydigest});      &print_preview_buttons($page_name, $escapedmsg, $form{mydigest});
380      &print_footer;      &print_footer;
381  }  }
382    
383  sub print_preview_buttons {  sub print_preview_buttons {
384      my ($page_name, $escapedmsg, $digest) = @_;      my ($page_name, $escapedmsg, $digest) = @_;
385      print <<"EOD";      print <<"EOD";
386      <form action="$thisurl" method="post">      <form action="$thisurl" method="post">
387      <textarea cols="$cols" rows="$rows" name="mymsg" wrap="virtual">$escapedmsg</textarea>      <textarea cols="$cols" rows="$rows" name="mymsg" wrap="virtual">$escapedmsg</textarea>
388      <br />      <br />
389      <input type="hidden" name="mypage" value="$page_name">      <input type="hidden" name="mypage" value="$page_name">
390      <input type="hidden" name="mydigest" value="$digest">      <input type="hidden" name="mydigest" value="$digest">
391      <input type="submit" name="myspecial_preview" value="再度プレビュー">      <input type="submit" name="myspecial_preview" value="コニナル・ラ・・モ・蝪シ">
392      <input type="submit" name="myspecial_write" value="ページの更新">      <input type="submit" name="myspecial_write" value="・レ。シ・ク、ホケケソキ">
393      </form>      </form>
394  EOD  EOD
395  }  }
396    
397  # 書き込む  # ス、ュケ、
398  sub do_write {  sub do_write {
399      if (not &is_editable($form{mypage})) {      if (not &is_editable($form{mypage})) {
400          # 編集不可ページは表示のみ          # ハヤスクノヤイト・レ。シ・ク、マノスシィ、ホ、゚
401          &do_read;          &do_read;
402          return;          return;
403      }      }
404    
405      my $page_name = $form{mypage};      my $page_name = $form{mypage};
406    
407      # digestを使って、更新の衝突チェック      # digest、サネ、テ、ニ。「ケケソキ、ホセラニヘ・チ・ァ・テ・ッ
408      my $original_digest = &calc_message_digest(&get_page($page_name));      my $original_digest = &calc_message_digest(&get_page($page_name));
409      if ($form{mydigest} ne $original_digest) {      if ($form{mydigest} ne $original_digest) {
410          &print_header($page_name);          &print_header($page_name);
411          print qq|<h1>$IconTag${page_name}で【更新の衝突】が起きました</h1>\n|;          print qq|<h1>$IconTag${page_name}、ヌ。レケケソキ、ホセラニヘ。ロ、ャオッ、ュ、゙、キ、ソ</h1>\n|;
412          print <<"EOD";          print <<"EOD";
413  <p>あなたがこのページを編集している間に、  <p>、「、ハ、ソ、ャ、ウ、ホ・レ。シ・ク、ハヤスク、キ、ニ、、、エヨ、ヒ。「
414  他の人が同じページを更新してしまったようです。  ツセ、ホソヘ、ャニア、ク・レ。シ・ク、ケケソキ、キ、ニ、キ、゙、テ、ソ、隍ヲ、ヌ、ケ。」
415  </p><p>  </p><p>
416  以下に、あなたの編集したテキストがありますので、  ーハイシ、ヒ。「、「、ハ、ソ、ホハヤスク、キ、ソ・ニ・ュ・ケ・ネ、ャ、「、熙゙、ケ、ホ、ヌ。「
417  あなたの編集内容が失われないように、  、「、ハ、ソ、ホハヤスクニ簣ニ、ャシコ、、、ハ、、、隍ヲ、ヒ。「
418  いますぐ、メモ帳などにコピー&ペーストしてください。  、、、゙、ケ、ー。「・皈籠「、ハ、ノ、ヒ・ウ・ヤ。シ。・レ。シ・ケ・ネ、キ、ニ、ッ、タ、オ、、。」
419  </p><p>  </p><p>
420  コピー&ペーストが済んでから、  ・ウ・ヤ。シ。・レ。シ・ケ・ネ、ャコム、、ヌ、ォ、鬘「
421  最新の内容を見て再度編集し直してください。  コヌソキ、ホニ簣ニ、クォ、ニコニナルハヤスク、キトセ、キ、ニ、ッ、タ、オ、、。」
422  最新の内容は  コヌソキ、ホニ簣ニ、マ
423  <a target="_blank" href="$thisurl?mycmd=read&mypage=$form{mypage}">$form{mypage}</a>  <a target="_blank" href="$thisurl?mycmd=read;mypage=$form{mypage}">$form{mypage}</a>
424  で見ることができます。  、ヌクォ、、ウ、ネ、ャ、ヌ、ュ、゙、ケ。」
425  </p>  </p>
426  EOD  EOD
427          # &print_toolbar($page_name);          # &print_toolbar($page_name);
428          &print_preview_buttons($page_name, &escape($form{mymsg}), $form{mydigest});          &print_preview_buttons($page_name, &escape($form{mymsg}), $form{mydigest});
429          &print_footer;          &print_footer;
430          return;          return;
431      }      }
432    
433      # diff生成      # diffタクタョ
434      {      {
435          &opendiff;          &opendiff;
436          my @msg1 = split(/\n/, &get_page($page_name));          my @msg1 = split(/\n/, &get_page($page_name));
437          my @msg2 = split(/\n/, $form{mymsg});          my @msg2 = split(/\n/, $form{mymsg});
438          $msgrefA = \@msg1;          $msgrefA = \@msg1;
439          $msgrefB = \@msg2;          $msgrefB = \@msg2;
440          &diff_check;          &diff_check;
441          $diffbase{$form{mypage}} = $diff_text;          $diffbase{$form{mypage}} = $diff_text;
442          $diff_text = '';          $diff_text = '';
443          &closediff;          &closediff;
444      }      }
445    
446      &print_header($page_name);      &print_header($page_name);
447      &set_page($page_name, $form{mymsg});      &set_page($page_name, $form{mymsg});
448      if ($form{mymsg}) {      if ($form{mymsg}) {
449          print qq|<h1>$IconTag${page_name}を更新しました</h1>\n|;          print qq|<h1>$IconTag${page_name}、ケケソキ、キ、゙、キ、ソ</h1>\n|;
450          &print_toolbar($page_name);          &print_toolbar($page_name);
451          print &convert_html(&get_page($page_name));          print &convert_html(&get_page($page_name));
452      } else {      } else {
453          print qq|<h1>$IconTag${page_name}を削除しました</h1>\n|;          print qq|<h1>$IconTag${page_name}、コス、キ、゙、キ、ソ</h1>\n|;
454          &print_toolbar($page_name);          &print_toolbar($page_name);
455          print qq|<p>${page_name}を削除しました。</p>\n|;          print qq|<p>${page_name}、コス、キ、゙、キ、ソ。」</p>\n|;
456      }      }
457      &print_footer;      &print_footer;
458      # 更新されたのでタッチしておく。      # ケケソキ、オ、、ソ、ホ、ヌ・ソ・テ・チ、キ、ニ、ェ、ッ。」
459      if ($touchfile) {      if ($touchfile) {
460          open(FILE, "> $touchfile");          open(FILE, "> $touchfile");
461          print FILE "\n";          print FILE "\n";
462          close(FILE);          close(FILE);
463      }      }
464  }  }
465    
466  # ページの変更点  # ・レ。シ・ク、ホハムケケナタ
467  sub do_diff {  sub do_diff {
468      if (not &is_editable($form{mypage})) {      if (not &is_editable($form{mypage})) {
469          # 編集不可ページは表示のみ          # ハヤスクノヤイト・レ。シ・ク、マノスシィ、ホ、゚
470          &do_read;          &do_read;
471          return;          return;
472      }      }
473      &opendiff;      &opendiff;
474      &print_header($form{mypage} . 'の変更点');      &print_header($form{mypage} . '、ホハムケケナタ');
475      print qq|<h1>$IconTag <a href="$thisurl?mycmd=read&mypage=$form{mypage}">$form{mypage}</a>の変更点</h1>\n|;      print qq|<h1>$IconTag <a href="$thisurl?mycmd=read&mypage=$form{mypage}">$form{mypage}</a>、ホハムケケナタ</h1>\n|;
476      &print_toolbar();      &print_toolbar();
477      $_ = &escape($diffbase{$form{mypage}});      $_ = &escape($diffbase{$form{mypage}});
478      print <<"EOD";      print <<"EOD";
479  <ul>  <ul>
480  <li>追加された行は<font color="blue">青色</font>です。  <li>トノイテ、オ、、ソケヤ、マ<ins>タトソァ</ins>、ヌ、ケ。」
481  <li>削除された行は<font color="red">赤色</font>です。  <li>コス、オ、、ソケヤ、マ<del>タヨソァ</del>、ヌ、ケ。」
482  <li><a href="$thisurl?mycmd=read&mypage=$form{mypage}">$form{mypage}</a>へ行く。  <li><a href="$thisurl?mycmd=read;mypage=$form{mypage}">$form{mypage}</a>、リケヤ、ッ。」
483  </ul>  </ul>
484  <hr />  <hr />
485  EOD  EOD
486      print qq|<pre>\n|;      print qq|<pre>\n|;
487      foreach (split(/\n/, $_)) {      foreach (split(/\n/, $_)) {
488          if (/^\+(.*)/) {          if (/^\+(.*)/) {
489              print qq|<font color="blue">$1</font>\n|;              print qq|<ins>$1</ins>\n|;
490          } elsif (/^\-(.*)/) {          } elsif (/^\-(.*)/) {
491              print qq|<font color="red">$1</font>\n|;              print qq|<del>$1</del>\n|;
492          } elsif (/^\=(.*)/) {          } elsif (/^\=(.*)/) {
493              print qq|$1\n|;              print qq|$1\n|;
494          } else {          } else {
495              print qq|??? $_\n|;              print qq|??? $_\n|;
496          }          }
497      }      }
498      print qq|</pre>\n|;      print qq|</pre>\n|;
499      &print_footer;      &print_footer;
500      &closediff;      &closediff;
501  }  }
502    
503  sub opendiff {  sub opendiff {
504      if ($dbmopen) {      if ($dbmopen) {
505          if (!dbmopen(%diffbase, $diffdbname, 0666)) {          if (!dbmopen(%diffbase, $diffdbname, 0666)) {
506              &print_error("(dbmopen) $diffdbname が作れません。");              &print_error("(dbmopen) $diffdbname 、ャコ、、゙、サ、。」");
507          }          }
508      } else {      } else {
509          if (!tie(%diffbase, "YukiWikiDB", $diffdbname)) {          if (!tie(%diffbase, "YukiWikiDB", $diffdbname)) {
510              &print_error("(tie error)");              &print_error("(tie error)");
511          }          }
512      }      }
513  }  }
514    
515  sub closediff {  sub closediff {
516      if ($dbmopen) {      if ($dbmopen) {
517          dbmclose(%diffbase);          dbmclose(%diffbase);
518      } else {      } else {
519          untie(%diffbase);          untie(%diffbase);
520      }      }
521  }  }
522    
523  # フォームからの情報を連想配列 %form に入れる  # ・ユ・ゥ。シ・爨ォ、鬢ホセハ、マ「チロヌロホ %form 、ヒニ、、
524  # &init_form('euc');  # &init_form('euc');
525  sub init_form {  sub init_form {
526      my ($charcode) = @_;      my ($charcode) = @_;
527      my $query;      my $query;
528      if ($ENV{REQUEST_METHOD} =~ /^post$/i) {      if ($ENV{REQUEST_METHOD} =~ /^post$/i) {
529          read(STDIN, $query, $ENV{CONTENT_LENGTH});          read(STDIN, $query, $ENV{CONTENT_LENGTH});
530      } else {      } else {
531          $query = $ENV{QUERY_STRING};          $query = $ENV{QUERY_STRING};
532      }      }
533      my @assocarray = split(/&/, $query);      my @assocarray = split(/[&;]/, $query);
534      foreach my $assoc (@assocarray) {      foreach my $assoc (@assocarray) {
535          my ($property, $value) = split(/=/, $assoc);          my ($property, $value) = split(/=/, $assoc);
536          $value =~ tr/+/ /;          $value =~ tr/+/ /;
537          $value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;          $value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;
538          &jcode::convert(\$value, $charcode);          &jcode::convert(\$value, $charcode);
539          $form{$property} = $value;          $form{$property} = $value;
540      }      }
541  }  }
542    
543  # エラーページを出力する  # ・ィ・鬘シ・レ。シ・ク、スミホマ、ケ、
544  sub print_error {  sub print_error {
545      my ($msg) = @_;      my ($msg) = @_;
546      &print_header('Error');      &print_header('Error');
547      print "<h1>$IconTag$msg</h1></body></html>";      print "<h1>$IconTag$msg</h1></body></html>";
548      exit(0);      exit(0);
549  }  }
550    
551  sub escape {  sub escape {
552      my ($line) = shift;      my ($line) = shift;
553      $line =~ s|<|&lt;|g;      $line =~ s|<|&lt;|g;
554      $line =~ s|>|&gt;|g;      $line =~ s|>|&gt;|g;
555      $line =~ s|"|&quot;|g;      $line =~ s|"|&quot;|g;
556      # $line =~ s|\&|&amp;|g;      # $line =~ s|\&|&amp;|g;
557      return $line;      return $line;
558  }  }
559    
560  sub inline {  sub inline {
561      my ($line) = shift;      my ($line) = shift;
562      $line = &escape($line);      $line = &escape($line);
563      $line =~ s|'''([^']+?)'''|<i>$1</i>|g;              # Italic      $line =~ s|'''([^']+?)'''|<strong>$1</strong>|g;
564      $line =~ s|''([^']+?)''|<b>$1</b>|g;                # Bold      $line =~ s|''([^']+?)''|<em>$1</em>|g;          
565      $line =~ s!      $line =~ s!
566                  (                  (
567                      ((mailto|http|https|ftp):[\x21-\x7E]*) # Direct http://...                      ((mailto|http|https|ftp):[\x21-\x7E]*) # Direct http://...
568                          |                          |
569                      ($WikiName)                         # LocalLinkLikeThis                      ($WikiName)                         # LocalLinkLikeThis
570                          |                          |
571                      ($BracketName)                      # [[日本語リンク]]                      ($BracketName)                      # [[ニヒワク・・・ッ]]
572                  )                  )
573              !              !
574                  &make_link($1)                  &make_link($1)
575              !gex;              !gex;
576      return $line;      return $line;
577  }  }
578    
579  # ページのタイトルからページの内容を得る  # ・レ。シ・ク、ホ・ソ・、・ネ・、ォ、鬣レ。シ・ク、ホニ簣ニ、ニタ、
580  sub get_page {  sub get_page {
581      my $page_name = shift;      my $page_name = shift;
582      return $database{$page_name};      return $database{$page_name};
583  }  }
584    
585  # ページの内容を与える  # ・レ。シ・ク、ホニ簣ニ、ヘソ、ィ、
586  # &set_page($title, $txt)  # &set_page($title, $txt)
587  sub set_page {  sub set_page {
588      # ページを更新する      # ・レ。シ・ク、ケケソキ、ケ、
589      my $title = $_[0];      my $title = $_[0];
590      $database{$title} = $_[1];      $database{$title} = $_[1];
591      # 空ページなら削除する      # カ・レ。シ・ク、ハ、鮗ス、ケ、
592      unless ($database{$title}) {      unless ($database{$title}) {
593          delete $database{$title};          delete $database{$title};
594      }      }
595      # RecentChangesを更新する      # RecentChanges、ケケソキ、ケ、
596      my $delim = ' - ';      my $delim = ' - ';
597      my @pages = split(/\n/, $database{$whatsnew});      my @pages = split(/\n/, $database{$whatsnew});
598      my $datestr = &get_current_datestr;      my $datestr = &get_current_datestr;
599      unshift(@pages, qq|-$datestr$delim$title|);      unshift(@pages, qq|-$datestr$delim$title|);
600      # 同一ページの更新は最新のもののみにし、      # ニアー・レ。シ・ク、ホケケソキ、マコヌソキ、ホ、筅ホ、ホ、゚、ヒ、キ。「
601      # 存在しないページはスキップする。      # ツクコ゚、キ、ハ、、・レ。シ・ク、マ・ケ・ュ・テ・ラ、ケ、。」
602      my %count;      my %count;
603      my @newpages;      my @newpages;
604      foreach my $line (@pages) {      foreach my $line (@pages) {
605          my ($prefix, $title) = split(/$delim/, $line);          my ($prefix, $title) = split(/$delim/, $line);
606          $count{$title}++;          $count{$title}++;
607          if ($count{$title} == 1 and exists($database{$title})) {          if ($count{$title} == 1 and exists($database{$title})) {
608              push(@newpages, qq|$prefix - $title|);              push(@newpages, qq|$prefix - $title|);
609          }          }
610      }      }
611      # ここで本当に更新      # 、ウ、ウ、ヌヒワナ、ヒケケソキ
612      $database{$whatsnew} = join("\n", splice(@newpages, 0, $maxnew));      $database{$whatsnew} = join("\n", splice(@newpages, 0, $maxnew));
613  }  }
614    
615  # ページのヘッダを出力  # ・レ。シ・ク、ホ・リ・テ・タ、スミホマ
616  sub print_header {  sub print_header {
617      my $title = shift;      my $title = shift;
618      print <<"EOD";      print <<"EOD";
619  Content-type: text/html  Content-type: text/html
620    
621  <html><head>  <html><head>
622  <title>$title</title>  <title>$title</title>
623  <style type="text/css">  <style type="text/css">
624  <!--  $style
625  $style  </style>
626  -->  </head>
627  </style>  <body>
628  </head>  EOD
629  <body bgcolor="white">  }
630  EOD  
631  }  # ・ト。シ・・ミ。シ、スミホマ
632    sub print_toolbar {
633  # ツールバーを出力      my $page_name = shift;
634  sub print_toolbar {      my $percent_name = &encode_percent($page_name);
635      my $page_name = shift;      my $editlink = '';
636      my $percent_name = &encode_percent($page_name);      if ($page_name ne '' and &is_editable($page_name)) {
637      my $editlink = '';          $editlink = <<"EOD";
638      if ($page_name ne '' and &is_editable($page_name)) {  <a href="$thisurl?mycmd=edit;mypage=$percent_name">ハヤスク</a> |
639          $editlink = <<"EOD";  <a href="$thisurl?mycmd=diff;mypage=$percent_name">コケハャ</a> |
640  <a href="$thisurl?mycmd=edit&mypage=$percent_name">編集</a> |  EOD
641  <a href="$thisurl?mycmd=diff&mypage=$percent_name">差分</a> |      }
642  EOD      print <<"EOD";
643      }  <p>
644      print <<"EOD";   [
645  <p>  <a href="$thisurl?mycmd=read;mypage=$toppage">・ネ・テ・ラ</a> |
646   [  <a href="$thisurl?mycmd=list">ーヘ</a> |
647  <a href="$thisurl?mycmd=read&mypage=$toppage">トップ</a> |  $editlink
648  <a href="$thisurl?mycmd=list">一覧</a> |  <a href="$thisurl?mycmd=search">テアクク。コ</a> |
649  $editlink  <a href="$thisurl?mycmd=read;mypage=$whatsnew">コヌスェケケソキ</a>
650  <a href="$thisurl?mycmd=search">単語検索</a> |   ]
651  <a href="$thisurl?mycmd=read&mypage=$whatsnew">最終更新</a>  </p>
652   ]  EOD
653  </p>  }
654  EOD  
655  }  # ・レ。シ・ク、ホ・ユ・テ・ソ、スミホマ
656    sub print_footer {
657  # ページのフッタを出力      print <<"EOD";
658  sub print_footer {  <address>
659      print <<"EOD";  <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>
660  <hr>  + <a href="$modifierlink">$modifier</a> ${version}.
661  <p>  [<a href="/" title="、ウ、ホ・オ。シ・ミ。シ、ホシハヌ">/</a>
662  <a href="http://www.hyuki.com/yukiwiki/">YukiWiki</a> $version Copyright (C) 2000,2001 by <a href="http://www.hyuki.com/">Hiroshi Yuki.</a><br />  <a href="/map" title="、ウ、ホ・オ。シ・ミ。シ、ホーニニ">テマゾ</a>
663  Modified by <a href="$modifierlink">$modifier</a>.<br/>  <a href="/search/" title="、ウ、ホ・オ。シ・ミ。シ、ホク。コ">ク。コ</a>]
664  </p>  </address>
665  </body></html>  </body></html>
666  EOD  EOD
667  }  }
668    
669  # URLやページの名前からリンクを作る  # URL、茹レ。シ・ク、ホフセチー、ォ、鬣・・ッ、コ、
670  sub make_link {  sub make_link {
671      my $name = shift;      my $name = shift;
672      if ($name =~ /^(http|https|ftp).*?(\.gif|\.png|\.jpeg|\.jpg)?$/) {      if ($name =~ /^(http|https|ftp).*?(\.gif|\.png|\.jpeg|\.jpg)?$/) {
673          if ($2) {          if ($2) {
674              return qq|<a href="$name"><img border="0" src="$name" /></a>|;              return qq|<a href="$name"><img border="0" src="$name" /></a>|;
675          } else {          } else {
676              return qq|<a href="$name">$name</a>|;              return qq|<a href="$name">$name</a>|;
677          }          }
678      } elsif ($name =~ /^mailto:(.*)/) {      } elsif ($name =~ /^mailto:(.*)/) {
679          my $address = $1;          my $address = $1;
680          return qq|<a href="$name">$address</a>|;          return qq|<a href="$name">$address</a>|;
681      } elsif ($database{$name}) {      } elsif ($database{$name}) {
682          my $percent_name = &encode_percent($name);          my $percent_name = &encode_percent($name);
683          return qq|<a href="$thisurl?mycmd=read&mypage=$percent_name">$name</a>|;          return qq|<a href="$thisurl?mycmd=read;mypage=$percent_name">$name</a>|;
684      } else {      } else {
685          my $percent_name = &encode_percent($name);          my $percent_name = &encode_percent($name);
686          return qq|$name<a href="$thisurl?mycmd=edit&mypage=$percent_name">?</a>|;          return qq|$name<a href="$thisurl?mycmd=edit;mypage=$percent_name">?</a>|;
687      }      }
688  }  }
689    
690  # %xx の形式にエンコードする  # %xx 、ホキチシー、ヒ・ィ・・ウ。シ・ノ、ケ、
691  # これは、  # 、ウ、、マ。「
692  # http://www.hyuki.com/yukiwiki/yukiwiki.cgi?mycmd=read&mypage=%3C%8C%8B%8F%E9%8D_%3E  # http://www.hyuki.com/yukiwiki/yukiwiki.cgi?mycmd=read&mypage=%3C%8C%8B%8F%E9%8D_%3E
693  # という形式のために使われる。  # 、ネ、、、ヲキチシー、ホ、ソ、皃ヒサネ、、、。」
694  # '<結城浩>' → '%3C%8C%8B%8F%E9%8D_%3E'  # '<キセケタ>' 「ェ '%3C%8C%8B%8F%E9%8D_%3E'
695  sub encode_percent {  sub encode_percent {
696      my $name = shift;      my $name = shift;
697      my $encoded = '';      my $encoded = '';
698      foreach my $ch (split(//, $name)) {      foreach my $ch (split(//, $name)) {
699          if ($ch =~ /[A-Za-z0-9_]/) {          if ($ch =~ /[A-Za-z0-9_]/) {
700              $encoded .= $ch;              $encoded .= $ch;
701          } else {          } else {
702              $encoded .= '%' . sprintf("%02X", ord($ch));              $encoded .= '%' . sprintf("%02X", ord($ch));
703          }          }
704      }      }
705      return $encoded;      return $encoded;
706  }  }
707    
708  # テキスト本体をHTMLに変換する  # ・ニ・ュ・ケ・ネヒワツホ、HTML、ヒハムエケ、ケ、
709  sub convert_html {  sub convert_html {
710      my ($txt) = shift;      my ($txt) = shift;
711      my (@txt) = split(/\n/, $txt);      my (@txt) = split(/\n/, $txt);
712      foreach (@txt) {      foreach (@txt) {
713          chomp;          chomp;
714          if (/^\*\*(.*)/) {          if (/^\*\*(.*)/) {
715              push(@result, splice(@saved), '<h3>' . &inline($1) . '</h3>');              push(@result, splice(@saved), '<h3>' . &inline($1) . '</h3>');
716          } elsif (/^\*(.*)/) {          } elsif (/^\*(.*)/) {
717              push(@result, splice(@saved), '<h2>' . &inline($1) . '</h2>');              push(@result, splice(@saved), '<h2>' . &inline($1) . '</h2>');
718          } elsif (/^----/) {          } elsif (/^----/) {
719              push(@result, splice(@saved), '<hr>');              push(@result, splice(@saved), '<hr>');
720          } elsif (/^(-{1,3})(.*)/) {          } elsif (/^(-{1,3})(.*)/) {
721              &back_push('ul', length($1));              &back_push('ul', length($1));
722              push(@result, '<li>' . &inline($2) . '</li>');              push(@result, '<li>' . &inline($2) . '</li>');
723          } elsif (/^:([^:]+):(.*)/) {          } elsif (/^:([^:]+):(.*)/) {
724              &back_push('dl', 1);              &back_push('dl', 1);
725              push(@result, '<dt>' . &inline($1) . '</dt>', '<dd>' . &inline($2) . '</dd>');              push(@result, '<dt>' . &inline($1) . '</dt>', '<dd>' . &inline($2) . '</dd>');
726          } elsif (/^(>{1,3})(.*)/) {          } elsif (/^(>{1,3})(.*)/) {
727              &back_push('blockquote', length($1));              &back_push('blockquote', length($1));
728              push(@result, &inline($2));              push(@result, &inline($2));
729          } elsif (/^\s*$/) {          } elsif (/^\s*$/) {
730              push(@result, splice(@saved));              push(@result, splice(@saved));
731              unshift(@saved, "</p>");              unshift(@saved, "</p>");
732              push(@result, "<p>");              push(@result, "<p>");
733          } elsif (/^(\s+.*)$/) {          } elsif (/^(\s+.*)$/) {
734              &back_push('pre', 1);              &back_push('pre', 1);
735              push(@result, &escape($1)); # Not &inline, but &escape              push(@result, &escape($1)); # Not &inline, but &escape
736          } else {          } else {
737              push(@result, &inline($_));              push(@result, &inline($_));
738          }          }
739      }      }
740      push(@result, splice(@saved));      push(@result, splice(@saved));
741      return join("\n", @result);      return join("\n", @result);
742  }  }
743    
744  # &back_push($tag, $count)  # &back_push($tag, $count)
745  # $tagのタグを$levelレベルまで詰める。  # $tag、ホ・ソ・ー、$level・・ル・、゙、ヌオヘ、皃。」
746  sub back_push {  sub back_push {
747      my ($tag, $level) = @_;      my ($tag, $level) = @_;
748      while (@saved > $level) {      while (@saved > $level) {
749          push(@result, shift(@saved));          push(@result, shift(@saved));
750      }      }
751      if ($saved[0] ne "</$tag>") {      if ($saved[0] ne "</$tag>") {
752          push(@result, splice(@saved));          push(@result, splice(@saved));
753      }      }
754      while (@saved < $level) {      while (@saved < $level) {
755          unshift(@saved, "</$tag>");          unshift(@saved, "</$tag>");
756          push(@result, "<$tag>");          push(@result, "<$tag>");
757      }      }
758  }  }
759    
760  # 編集可能ページか?  # ハヤスクイトヌス・レ。シ・ク、ォ。ゥ
761  sub is_editable {  sub is_editable {
762      my ($pagename) = @_;      my ($pagename) = @_;
763      foreach (@uneditable) {      foreach (@uneditable) {
764          if ($pagename eq $_) {          if ($pagename eq $_) {
765              return 0;              return 0;
766          }          }
767      }      }
768      if (&is_valid_name($pagename)) {      if (&is_valid_name($pagename)) {
769          return 1;          return 1;
770      }      }
771      return 0;      return 0;
772  }  }
773    
774  # Validな名前か?  # Valid、ハフセチー、ォ。ゥ
775  sub is_valid_name {  sub is_valid_name {
776      my ($pagename) = @_;      my ($pagename) = @_;
777      if ($pagename =~ /^$WikiName$/) {      if ($pagename =~ /^$WikiName$/) {
778          return 1;          return 1;
779      } elsif ($pagename =~ /^$BracketName$/) {      } elsif ($pagename =~ /^$BracketName$/) {
780          return 1;          return 1;
781      } else {      } else {
782          return 0;          return 0;
783      }      }
784  }  }
785    
786  # 現在時刻の文字列を得る  # クスコ゚サケ、ホハクサホ、ニタ、
787  sub get_current_datestr {  sub get_current_datestr {
788      my (@wdays) = ( "日", "月", "火", "水", "木", "金", "土" );      my (@wdays) = ( "ニ", "キ", "イミ", "ソ", "フレ", "カ", "ナレ" );
789      my ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time);      my ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time);
790      return sprintf("%4d-%02d-%02d (%s) %02d:%02d:%02d",      return sprintf("%4d-%02d-%02d (%s) %02d:%02d:%02d",
791          $year + 1900, $mon + 1, $mday, $wdays[$wday], $hour, $min, $sec);          $year + 1900, $mon + 1, $mday, $wdays[$wday], $hour, $min, $sec);
792  }  }
793    
794  # URL?SomePageや、  # URL?SomePage、茖「
795  # URL?[[結城浩]]の形式だった場合、(not yet)  # URL?[[キセケタ]]、ホキチシー、タ、テ、ソセケ遑「(not yet)
796  # 強制的にmycmdをreadにして$formの内容を設定する。  # カッタゥナェ、ヒmycmd、read、ヒ、キ、ニ$form、ホニ簣ニ、タ゚ト熙ケ、。」
797  sub normalize_form {  sub normalize_form {
798      foreach my $key (keys %form) {      foreach my $key (keys %form) {
799          if ($key =~ /^$WikiName$/) {          if ($key =~ /^$WikiName$/) {
800              $form{mycmd} = 'read';              $form{mycmd} = 'read';
801              $form{mypage} = $1;              $form{mypage} = $1;
802              last;              last;
803          } elsif ($key =~ /^$BracketName$/) {          } elsif ($key =~ /^$BracketName$/) {
804              $form{mycmd} = 'read';              $form{mycmd} = 'read';
805              $form{mypage} = $1;              $form{mypage} = $1;
806              last;              last;
807          }          }
808      }      }
809  }  }
810    
811  # 変換テストを行なうときのサンプル  # ハムエケ・ニ・ケ・ネ、ケヤ、ハ、ヲ、ネ、ュ、ホ・オ・・ラ・
812  sub print_sample {  sub print_sample {
813      my $txt = &convert_html(<<"EOD");      my $txt = &convert_html(<<"EOD");
814  *大見出し1  *ツ邵ォスミ、キ1
815  **小見出し1-1  **セョクォスミ、キ1-1
816  -項目1  -ケ猯ワ1
817  -項目2  -ケ猯ワ2
818  -項目3  -ケ猯ワ3
819  段落1段落1段落1段落1段落1段落1段落1段落1段落1段落1段落1段落1  テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1
820  段落1段落1段落1段落1段落1段落''強調''1段落1段落1段落1段落1段落1  テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ''カットエ''1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1
821  段落1段落1段落1段落1段落1段落1段落1段落1段落1段落1段落1段落1  テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1
822    
823  段落2段落2段落2段落2段落2段落2段落2段落2段落2段落2段落2段落2  テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2
824  段落2段落2段落2段落2段落2段落2段落2段落2段落2段落2段落2段落2  テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2
825  段落2段落2段落2段落2段落2段落2段落2段落2段落2段落2段落2段落2  テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2
826  **小見出し1-2  **セョクォスミ、キ1-2
827  :用語1:いろいろ書いた解説文1と''強調単語''  :ヘムク1:、、、、、、ス、、、ソイタ簗ク1、ネ''カットエテアク''
828  段落1段落1段落1段落1段落1段落1段落1段落1段落1段落1段落1段落1  テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1
829  段落1段落1段落1段落1段落1段落1段落1段落1段落1段落1段落1段落1  テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1
830  段落1段落1段落1段落1段落1段落1段落1段落1段落1段落1段落1段落1  テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1
831  :用語2:いろいろ書いた解説文2  :ヘムク2:、、、、、、ス、、、ソイタ簗ク2
832  :用語3:いろいろ書いた解説文3  :ヘムク3:、、、、、、ス、、、ソイタ簗ク3
833  ----  ----
834  *大見出し2  *ツ邵ォスミ、キ2
835  **小見出し2-1  **セョクォスミ、キ2-1
836  http://www.hyuki.com/  http://www.hyuki.com/
837  **小見出し2-2  **セョクォスミ、キ2-2
838    
839  [[結城浩]]  [[キセケタ]]
840    
841  段落1段落1段落1段落1段落1段落1段落1段落1段落1段落1段落1段落1  テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1
842  段落1段落1段落1段落'''イタリック'''1段落1段落1段落1段落1段落1段落1段落1  テハヘ1テハヘ1テハヘ1テハヘ'''カットエ'''1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1
843  段落1段落1段落1段落'''''イタボールド'''''1段落1段落1段落1段落1段落1段落1段落1段落1  テハヘ1テハヘ1テハヘ1テハヘ'''''カッ、、カットエ'''''1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1テハヘ1
844  >段落2段落2段落2段落2段落2段落2段落2段落2段落2段落2段落2段落2  >テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2
845  >段落2段落2段落2段落2段落2段落2段落2段落2段落2段落2段落2段落2  >テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2
846  >段落2段落2段落2段落2段落2段落2段落2段落2段落2段落2段落2段落2  >テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2テハヘ2
847    
848  レベル0レベル0レベル0レベル0レベル0レベル0  ・・ル・0・・ル・0・・ル・0・・ル・0・・ル・0・・ル・0
849    
850  >レベル1  >・・ル・1
851  >レベル1  >・・ル・1
852  >レベル1  >・・ル・1
853  >>レベル2  >>・・ル・2
854  >>レベル2  >>・・ル・2
855  >>レベル2  >>・・ル・2
856  >>>レベル3  >>>・・ル・3
857  -はろ1  -、マ、1
858  --はろ2  --、マ、2
859  ろろろろ2  、、、、2
860  ---はろ3  ---、マ、3
861  --はろ2  --、マ、2
862  ---はろ3  ---、マ、3
863  --はろ2  --、マ、2
864  ---はろ3  ---、マ、3
865  >>>レベル3  >>>・・ル・3
866  >>>レベル3  >>>・・ル・3
867  >>>レベル3  >>>・・ル・3
868  EOD  EOD
869      print $txt;      print $txt;
870      exit;      exit;
871  }  }
872    
873  sub diff_check {  sub diff_check {
874      traverse_sequences(      traverse_sequences(
875              $msgrefA, $msgrefB,              $msgrefA, $msgrefB,
876              {              {
877                  MATCH => \&df_match,                  MATCH => \&df_match,
878                  DISCARD_A => \&df_delete,                  DISCARD_A => \&df_delete,
879                  DISCARD_B => \&df_add,                  DISCARD_B => \&df_add,
880              }              }
881      );      );
882      &diff_flush;      &diff_flush;
883  }  }
884    
885  sub diff_flush {  sub diff_flush {
886      $diff_text .= join('', map { "-$_\n" } splice(@diff_deleted));      $diff_text .= join('', map { "-$_\n" } splice(@diff_deleted));
887      $diff_text .= join('', map { "+$_\n" } splice(@diff_added));      $diff_text .= join('', map { "+$_\n" } splice(@diff_added));
888  }  }
889    
890  sub df_match {  sub df_match {
891      my ($a, $b) = @_;      my ($a, $b) = @_;
892      &diff_flush;      &diff_flush;
893      $diff_text .= "=$msgrefA->[$a]\n";      $diff_text .= "=$msgrefA->[$a]\n";
894  }  }
895    
896  sub df_delete {  sub df_delete {
897      my ($a, $b) = @_;      my ($a, $b) = @_;
898      push(@diff_deleted, $msgrefA->[$a]);      push(@diff_deleted, $msgrefA->[$a]);
899  }  }
900    
901  sub df_add {  sub df_add {
902      my ($a, $b) = @_;      my ($a, $b) = @_;
903      push(@diff_added, $msgrefB->[$b]);      push(@diff_added, $msgrefB->[$b]);
904  }  }
905    
906  sub calc_message_digest {   # You have to use MD5...  sub calc_message_digest {   # You have to use MD5...
907      my $text = shift;      my $text = shift;
908      my @text = split(//, $text);      my @text = split(//, $text);
909      my $len = length($text);      my $len = length($text);
910      my $checksum = 0;      my $checksum = 0;
911      foreach (@text) {      foreach (@text) {
912          $checksum += ord($_);          $checksum += ord($_);
913          $checksum = ($checksum * 2) % 65536 + (($checksum & 32768) ? 1 : 0); # 16bit rotate          $checksum = ($checksum * 2) % 65536 + (($checksum & 32768) ? 1 : 0); # 16bit rotate
914      }      }
915      return "$len:$checksum";      return "$len:$checksum";
916  }  }
917    
918  # Definition of YukiWikiDB  # Definition of YukiWikiDB
919  package YukiWikiDB;  package YukiWikiDB;
920    
921  my $debug = 1;  my $debug = 1;
922    
923  # Constructor  # Constructor
924  sub new {  sub new {
925      return shift->TIEHASH(@_);      return shift->TIEHASH(@_);
926  }  }
927    
928  # tying  # tying
929  sub TIEHASH {  sub TIEHASH {
930      my ($class, $dbname) = @_;      my ($class, $dbname) = @_;
931      my $self = {      my $self = {
932          dir => $dbname,          dir => $dbname,
933          keys => [],          keys => [],
934      };      };
935      if (not -d $self->{dir}) {      if (not -d $self->{dir}) {
936          if (!mkdir($self->{dir}, 0777)) {          if (!mkdir($self->{dir}, 0777)) {
937              print "mkdir(" . $self->{dir} . ") fail\n" if ($debug);              print "mkdir(" . $self->{dir} . ") fail\n" if ($debug);
938              return undef;              return undef;
939          }          }
940      }      }
941      return bless($self, $class);      return bless($self, $class);
942  }  }
943    
944  # Store  # Store
945  sub STORE {  sub STORE {
946      my ($self, $key, $val) = @_;      my ($self, $key, $val) = @_;
947      my $file = &make_filename($self, $key);      my $file = &make_filename($self, $key);
948      if (open(FILE,"> $file")) {      if (open(FILE,"> $file")) {
949          binmode(FILE);          binmode(FILE);
950          print FILE $val;          print FILE $val;
951          close(FILE);          close(FILE);
952          return $self->{$key} = $val;          return $self->{$key} = $val;
953      } else {      } else {
954          print "$file create error.";          print "$file create error.";
955      }      }
956  }  }
957    
958  # Fetch  # Fetch
959  sub FETCH {  sub FETCH {
960      my ($self, $key) = @_;      my ($self, $key) = @_;
961      my $file = &make_filename($self, $key);      my $file = &make_filename($self, $key);
962      if (open(FILE, $file)) {      if (open(FILE, $file)) {
963          local $/;          local $/;
964          $self->{$key} = <FILE>;          $self->{$key} = <FILE>;
965          close(FILE);          close(FILE);
966      }      }
967      return $self->{$key};      return $self->{$key};
968  }  }
969    
970  # Exists  # Exists
971  sub EXISTS {  sub EXISTS {
972      my ($self, $key) = @_;      my ($self, $key) = @_;
973      my $file = &make_filename($self, $key);      my $file = &make_filename($self, $key);
974      return -e($file);      return -e($file);
975  }  }
976    
977  # Delete  # Delete
978  sub DELETE {  sub DELETE {
979      my ($self, $key) = @_;      my ($self, $key) = @_;
980      my $file = &make_filename($self, $key);      my $file = &make_filename($self, $key);
981      unlink $file;      unlink $file;
982      return delete $self->{$key};      return delete $self->{$key};
983  }  }
984    
985  sub FIRSTKEY {  sub FIRSTKEY {
986      my ($self) = @_;      my ($self) = @_;
987      opendir(DIR, $self->{dir}) or die $self->{dir};      opendir(DIR, $self->{dir}) or die $self->{dir};
988      @{$self->{keys}} = grep /\.txt$/, readdir(DIR);      @{$self->{keys}} = grep /\.txt$/, readdir(DIR);
989      foreach my $name (@{$self->{keys}}) {      foreach my $name (@{$self->{keys}}) {
990          $name =~ s/\.txt$//;          $name =~ s/\.txt$//;
991          $name =~ s/[0-9A-F][0-9A-F]/pack("C", hex($&))/eg;          $name =~ s/[0-9A-F][0-9A-F]/pack("C", hex($&))/eg;
992      }      }
993      return shift @{$self->{keys}};      return shift @{$self->{keys}};
994  }  }
995    
996  sub NEXTKEY {  sub NEXTKEY {
997      my ($self) = @_;      my ($self) = @_;
998      return shift @{$self->{keys}};      return shift @{$self->{keys}};
999  }  }
1000    
1001  sub make_filename {  sub make_filename {
1002      my ($self, $key) = @_;      my ($self, $key) = @_;
1003      my $enkey = '';      my $enkey = '';
1004      foreach my $ch (split(//, $key)) {      foreach my $ch (split(//, $key)) {
1005          $enkey .= sprintf("%02X", ord($ch));          $enkey .= sprintf("%02X", ord($ch));
1006      }      }
1007      return $self->{dir} . "/$enkey.txt";      return $self->{dir} . "/$enkey.txt";
1008  }  }
1009  __END__  __END__
1010    
1011  =head1 NAME  =head1 NAME
1012    
1013  YukiWiki - 自由にページを追加・削除・編集できるWebページ構築CGI  YukiWiki - シォヘウ、ヒ・レ。シ・ク、トノイテ。ヲコス。ヲハヤスク、ヌ、ュ、Web・レ。シ・クケステロCGI
1014    
1015      Copyright (C) 2000,2001 by Hiroshi Yuki.      Copyright (C) 2000,2001 by Hiroshi Yuki.
1016      結城浩 <hyuki@hyuki.com>      キセケタ <hyuki@hyuki.com>
1017      http://www.hyuki.com/      http://www.hyuki.com/
1018      http://www.hyuki.com/yukiwiki/      http://www.hyuki.com/yukiwiki/
1019    
1020  =head1 SYNOPSIS  =head1 SYNOPSIS
1021    
1022      http://www.hyuki.com/yukiwiki/yukiwiki.cgi      http://www.hyuki.com/yukiwiki/yukiwiki.cgi
1023    
1024  =head1 DESCRIPTION  =head1 DESCRIPTION
1025    
1026  YukiWiki(結城ウィキィ)は参加者が自由にページを追加・削除・編集できる  YukiWiki。ハキセ・ヲ・」・ュ・」。ヒ、マサイイテシヤ、ャシォヘウ、ヒ・レ。シ・ク、トノイテ。ヲコス。ヲハヤスク、ヌ、ュ、
1027  不思議なWebページ群を作るCGIです。  ノヤサラオト、ハWeb・レ。シ・クキイ、コ、CGI、ヌ、ケ。」
1028  Webで動作する掲示板とちょっと似ていますが、  Web、ヌニーコ、ケ、キヌシィネト、ネ、チ、遉テ、ネサ、ニ、、、゙、ケ、ャ。「
1029  Web掲示板が単にメッセージを追加するだけなのに対して、  Webキヌシィネト、ャテア、ヒ・皈テ・サ。シ・ク、トノイテ、ケ、、タ、ア、ハ、ホ、ヒツミ、キ、ニ。「
1030  YukiWikiは、Webページ全体を自由に変更することができます。  YukiWiki、マ。「Web・レ。シ・クチエツホ、シォヘウ、ヒハムケケ、ケ、、ウ、ネ、ャ、ヌ、ュ、゙、ケ。」
1031    
1032  YukiWikiは、Cunningham & CunninghamのWikiWikiWebの  YukiWiki、マ。「Cunningham & Cunningham、ホWikiWikiWeb、ホ
1033  仕様を参考にして独自に作られました。  サナヘヘ、サイケヘ、ヒ、キ、ニニネシォ、ヒコ、鬢、゙、キ、ソ。」
1034    
1035  YukiWikiはPerlで書かれたCGIスクリプトとして実現されていますので、  YukiWiki、マPerl、ヌス、ォ、、ソCGI・ケ・ッ・・ラ・ネ、ネ、キ、ニシツクス、オ、、ニ、、、゙、ケ、ホ、ヌ。「
1036  Perlが動作するWebサーバならば比較的容易に設置できます。  Perl、ャニーコ、ケ、Web・オ。シ・ミ、ハ、鬢ミネ豕モナェヘニーラ、ヒタ゚テヨ、ヌ、ュ、゙、ケ。」
1037    
1038  あとはdbmopenが使える環境ならば設置できます(Version 1.5.0以降ならdbmopenが使えなくても設置できます)。  、「、ネ、マdbmopen、ャサネ、ィ、エトカュ、ハ、鬢ミタ゚テヨ、ヌ、ュ、゙、ケ(Version 1.5.0ーハケ゚、ハ、馘bmopen、ャサネ、ィ、ハ、ッ、ニ、簑゚テヨ、ヌ、ュ、゙、ケ)。」
1039    
1040    
1041  YukiWikiはフリーソフトです。  YukiWiki、マ・ユ・遙シ・ス・ユ・ネ、ヌ、ケ。」
1042  ご自由にお使いください。  、エシォヘウ、ヒ、ェサネ、、、ッ、タ、オ、、。」
1043    
1044  =head1 設置方法  =head1 タ゚テヨハヒ。
1045    
1046  =head2 入手  =head2 ニシ
1047    
1048  YukiWikiの最新版は、  YukiWiki、ホコヌソキネヌ、マ。「
1049  http://www.hyuki.com/yukiwiki/  http://www.hyuki.com/yukiwiki/
1050  から入手できます。  、ォ、鯣シ熙ヌ、ュ、゙、ケ。」
1051    
1052  =head2 ファイル一覧  =head2 ・ユ・。・、・ーヘ
1053    
1054      readme.txt      ドキュメント      readme.txt      ・ノ・ュ・螂皈・ネ
1055      yukiwiki.cgi    YukiWiki本体      yukiwiki.cgi    YukiWikiヒワツホ
1056      yukiwiki.gif    ロゴ(カラー版)      yukiwiki.gif    ・・エ。ハ・ォ・鬘シネヌ。ヒ
1057      yukimono.gif    ロゴ(モノクロ版)      yukimono.gif    ・・エ。ハ・筵ホ・ッ・ネヌ。ヒ
1058      jcode.pl        漢字コードライブラリ      jcode.pl        エチサ・ウ。シ・ノ・鬣、・ヨ・鬣
1059    
1060  =head2 インストール  =head2 ・、・・ケ・ネ。シ・
1061    
1062  =over 4  =over 4
1063    
1064  =item 1.  =item 1.
1065    
1066  アーカイブを解く。  ・「。シ・ォ・、・ヨ、イ、ッ。」
1067    
1068  =item 2.  =item 2.
1069    
1070  yukiwiki.cgiのはじめの方にある設定を確認します。  yukiwiki.cgi、ホ、マ、ク、皃ホハ、ヒ、「、タ゚ト熙ウホヌァ、キ、゙、ケ。」
1071  通常は何もしなくてよいが、  トフセ、マイソ、筅キ、ハ、ッ、ニ、隍、、ャ。「
1072  はじめは$touchfileを''にした方がよいでしょう。  、マ、ク、皃マ$touchfile、''、ヒ、キ、ソハ、ャ、隍、、ヌ、キ、遉ヲ。」
1073    
1074  =item 3.  =item 3.
1075    
1076  yukiwiki.cgiとjcode.plを同じところに設置します。  yukiwiki.cgi、ネjcode.pl、ニア、ク、ネ、ウ、、ヒタ゚テヨ、キ、゙、ケ。」
1077    
1078  =item 4.  =item 4.
1079    
1080  サイズ0のyukiwiki.dbというファイルを設置します。  ・オ・、・コ0、ホyukiwiki.db、ネ、、、ヲ・ユ・。・、・、タ゚テヨ、キ、゙、ケ。」
1081  (Perlシステムによってはyukiwiki.pag, yukiwiki.dir)  。ハPerl・キ・ケ・ニ・爨ヒ、隍テ、ニ、マyukiwiki.pag, yukiwiki.dir。ヒ
1082    
1083  =item 5.  =item 5.
1084    
1085  yukiwiki.cgiにブラウザからアクセスします。  yukiwiki.cgi、ヒ・ヨ・鬣ヲ・カ、ォ、鬣「・ッ・サ・ケ、キ、゙、ケ。」
1086    
1087  =back  =back
1088    
1089  =head2 パーミッション  =head2 ・ム。シ・゚・テ・キ・逾
1090    
1091          ファイル        パーミッション      転送モード          ・ユ・。・、・        ・ム。シ・゚・テ・キ・逾      ナセチ・筍シ・ノ
1092          yukiwiki.cgi    755                 ASCII          yukiwiki.cgi    755                 ASCII
1093          yukiwiki.gif    644                 BINARY          yukiwiki.gif    644                 BINARY
1094          yukimono.gif    644                 BINARY          yukimono.gif    644                 BINARY
1095          jcode.pl        644                 ASCII          jcode.pl        644                 ASCII
1096    
1097      $dbmopen = 1; にした場合:      $dbmopen = 1; 、ヒ、キ、ソセケ:
1098          yukiwiki.db     666                 BINARY          yukiwiki.db     666                 BINARY
1099          (yukiwiki.pag, yukiwiki.dirの場合もあり)          (yukiwiki.pag, yukiwiki.dir、ホセケ遉筅「、遙ヒ
1100    
1101      $dbmopen = 0; にした場合: (カレントディレクトリを777にしておく)      $dbmopen = 0; 、ヒ、キ、ソセケ: (・ォ・・・ネ・ヌ・」・・ッ・ネ・熙777、ヒ、キ、ニ、ェ、ッ)
1102          .               777                 (転送しない)          .               777                 (ナセチ、キ、ハ、、)
1103    
1104  =head1 データのバックアップ方法  =head1 ・ヌ。シ・ソ、ホ・ミ・テ・ッ・「・テ・ラハヒ。
1105    
1106  $dbmopen = 1;の場合は、  $dbmopen = 1;、ホセケ遉マ。「
1107  データはすべてyukiwiki.db(.dir, .pag)に入る。  ・ヌ。シ・ソ、マ、ケ、ル、ニyukiwiki.db(.dir, .pag)、ヒニ、。」
1108  これをバックアップすればよい。  、ウ、、・ミ・テ・ッ・「・テ・ラ、ケ、、ミ、隍、。」
1109    
1110  $dbmopen = 0;の場合は、  $dbmopen = 0;、ホセケ遉マ。「
1111  yukiwikiというディレクトリができるので、  yukiwiki、ネ、、、ヲ・ヌ・」・・ッ・ネ・熙ャ、ヌ、ュ、、ホ、ヌ。「
1112  これ以下をバックアップすればよい。  、ウ、ーハイシ、・ミ・テ・ッ・「・テ・ラ、ケ、、ミ、隍、。」
1113    
1114  =head1 新しいページの作り方  =head1 ソキ、キ、、・レ。シ・ク、ホコ、ハ
1115    
1116  =over 4  =over 4
1117    
1118  =item 1.  =item 1.
1119    
1120  まず、適当なページ(例えばFrontPage)を選び、  、゙、コ。「ナャナ、ハ・レ。シ・ク。ハホ网ィ、ミFrontPage。ヒ、チェ、モ。「
1121  ページの下にある「編集」リンクをたどります。  ・レ。シ・ク、ホイシ、ヒ、「、。ヨハヤスク。ラ・・・ッ、、ソ、ノ、熙゙、ケ。」
1122    
1123  =item 2.  =item 2.
1124    
1125  するとテキスト入力ができる状態になるので、  、ケ、、ネ・ニ・ュ・ケ・ネニホマ、ャ、ヌ、ュ、セツヨ、ヒ、ハ、、ホ、ヌ。「
1126  そこにNewPageのような単語  、ス、ウ、ヒNewPage、ホ、隍ヲ、ハテアク
1127  (大文字小文字混在している英文字列)  。ハツ醋クサセョハクサコョコ゚、キ、ニ、、、アムハクサホ。ヒ
1128  を書いて「保存」します。  、ス、、、ニ。ヨハンツク。ラ、キ、゙、ケ。」
1129    
1130  =item 3.  =item 3.
1131    
1132  保存すると、FrontPageのページが書き換わり、  ハンツク、ケ、、ネ。「FrontPage、ホ・レ。シ・ク、ャス、ュエケ、、遙「
1133  あなたが書いたNewPageという文字列の後ろに ? というリンクが表示されます。  、「、ハ、ソ、ャス、、、ソNewPage、ネ、、、ヲハクサホ、ホク螟、ヒ ? 、ネ、、、ヲ・・・ッ、ャノスシィ、オ、、゙、ケ。」
1134  この ? はそのページがまだ存在しないことを示す印です。  、ウ、ホ ? 、マ、ス、ホ・レ。シ・ク、ャ、゙、タツクコ゚、キ、ハ、、、ウ、ネ、シィ、ケー、ヌ、ケ。」
1135    
1136  =item 4.  =item 4.
1137    
1138  その ? をクリックすると新しいページNewPageができますので、  、ス、ホ ? 、・ッ・・テ・ッ、ケ、、ネソキ、キ、、・レ。シ・クNewPage、ャ、ヌ、ュ、゙、ケ、ホ、ヌ。「
1139  あなたの好きな文章をその新しいページに書いて保存します。  、「、ハ、ソ、ホケ・、ュ、ハハクセマ、、ス、ホソキ、キ、、・レ。シ・ク、ヒス、、、ニハンツク、キ、゙、ケ。」
1140    
1141  =item 5.  =item 5.
1142    
1143  NewPageページができるとFrontPageの ? は消えて、リンクとなります。  NewPage・レ。シ・ク、ャ、ヌ、ュ、、ネFrontPage、ホ ? 、マセテ、ィ、ニ。「・・・ッ、ネ、ハ、熙゙、ケ。」
1144    
1145  =back  =back
1146    
1147  =head1 テキスト整形のルール  =head1 ・ニ・ュ・ケ・ネターキチ、ホ・。シ・
1148    
1149  =over 4  =over 4
1150    
1151  =item *  =item *
1152    
1153  連続した複数行はフィルされて表示されます。  マ「ツウ、キ、ソハ」ソケヤ、マ・ユ・」・、オ、、ニノスシィ、オ、、゙、ケ。」
1154    
1155  =item *  =item *
1156    
1157  空行は段落C<< <p> >>の区切りとなります。  カケヤ、マテハヘC<< <p> >>、ホカ霏レ、熙ネ、ハ、熙゙、ケ。」
1158    
1159  =item *  =item *
1160    
1161  HTMLのタグは書けません。  HTML、ホ・ソ・ー、マス、ア、゙、サ、。」
1162    
1163  =item *  =item *
1164    
1165  B<''ボールド''>のようにシングルクォート二つではさむと、  B<''・ワ。シ・・ノ''>、ホ、隍ヲ、ヒ・キ・・ー・・ッ・ゥ。シ・ネニ、ト、ヌ、マ、オ、爨ネ。「
1166  ボールドC<< <b> >>になります。  ・ワ。シ・・ノC<< <b> >>、ヒ、ハ、熙゙、ケ。」
1167    
1168  =item *  =item *
1169    
1170  B<'''イタリック'''>のようにシングルクォート三つではさむと、  B<'''・、・ソ・・テ・ッ'''>、ホ、隍ヲ、ヒ・キ・・ー・・ッ・ゥ。シ・ネサー、ト、ヌ、マ、オ、爨ネ。「
1171  イタリックC<< <i> >>になります。  ・、・ソ・・テ・ッC<< <i> >>、ヒ、ハ、熙゙、ケ。」
1172    
1173  =item *  =item *
1174    
1175  B<---->のようにマイナス4つがあると、  B<---->、ホ、隍ヲ、ヒ・゙・、・ハ・ケ4、ト、ャ、「、、ネ。「
1176  水平線C<< <hr> >>になります。  ソ衞ソタC<< <hr> >>、ヒ、ハ、熙゙、ケ。」
1177    
1178  =item *  =item *
1179    
1180  行をB<*>ではじめると、  ケヤ、B<*>、ヌ、マ、ク、皃、ネ。「
1181  大見出しC<< <h2> >>になります。  ツ邵ォスミ、キC<< <h2> >>、ヒ、ハ、熙゙、ケ。」
1182    
1183  =item *  =item *
1184    
1185  行をB<**>ではじめると、  ケヤ、B<**>、ヌ、マ、ク、皃、ネ。「
1186  小見出しC<< <h3> >>になります。  セョクォスミ、キC<< <h3> >>、ヒ、ハ、熙゙、ケ。」
1187    
1188  =item *  =item *
1189    
1190  行をマイナス-ではじめると、  ケヤ、・゙・、・ハ・ケ-、ヌ、マ、ク、皃、ネ。「
1191  箇条書きC<< <ul> >>になります。  イユセス、ュC<< <ul> >>、ヒ、ハ、熙゙、ケ。」
1192  マイナスの数が増えるとレベルが下がります(3レベルまで)  ・゙・、・ハ・ケ、ホソ、ャチ、ィ、、ネ・・ル・、ャイシ、ャ、熙゙、ケ。ハ3・・ル・、゙、ヌ。ヒ
1193    
1194      -項目1      -ケ猯ワ1
1195      --項目1-1      --ケ猯ワ1-1
1196      --項目1-2      --ケ猯ワ1-2
1197      -項目2      -ケ猯ワ2
1198      -項目3      -ケ猯ワ3
1199      --項目3-1      --ケ猯ワ3-1
1200      ---項目3-1-1      ---ケ猯ワ3-1-1
1201      ---項目3-1-2      ---ケ猯ワ3-1-2
1202      --項目3-2      --ケ猯ワ3-2
1203    
1204  =item *  =item *
1205    
1206  コロンを使うと、  ・ウ・・、サネ、ヲ、ネ。「
1207  用語と解説文のリストC<< <dl> >>が書けます。  ヘムク、ネイタ簗ク、ホ・・ケ・ネC<< <dl> >>、ャス、ア、゙、ケ。」
1208    
1209      :用語1:いろいろ書いた解説文1      :ヘムク1:、、、、、、ス、、、ソイタ簗ク1
1210      :用語2:いろいろ書いた解説文2      :ヘムク2:、、、、、、ス、、、ソイタ簗ク2
1211      :用語3:いろいろ書いた解説文3      :ヘムク3:、、、、、、ス、、、ソイタ簗ク3
1212    
1213  =item *  =item *
1214    
1215  リンク  ・・・ッ
1216    
1217  =over 4  =over 4
1218    
1219  =item *  =item *
1220    
1221  LinkToSomePageやFrontPageのように、  LinkToSomePage、腱rontPage、ホ、隍ヲ、ヒ。「
1222  英単語の最初の一文字を大文字にしたものが  アムテアク、ホコヌス鬢ホーハクサ、ツ醋クサ、ヒ、キ、ソ、筅ホ、ャ
1223  二つ以上連続したものはYukiWikiのページ名となり、  ニ、トーハセ袞「ツウ、キ、ソ、筅ホ、マYukiWiki、ホ・レ。シ・クフセ、ネ、ハ、遙「
1224  それが文章中に含まれるとリンクになります。  、ス、、ャハクセマテ讀ヒエ゙、゙、、、ネ・・・ッ、ヒ、ハ、熙゙、ケ。」
1225    
1226  =item *  =item *
1227    
1228  http://www.hyuki.com/ のようなURLは自動的にリンクになります。  http://www.hyuki.com/ 、ホ、隍ヲ、ハURL、マシォニーナェ、ヒ・・・ッ、ヒ、ハ、熙゙、ケ。」
1229    
1230  =item *  =item *
1231    
1232  二重の大かっこ[[ ]]でくくった文字列も、  ニスナ、ホツ遉ォ、テ、ウ[[ ]]、ヌ、ッ、ッ、テ、ソハクサホ、筍「
1233  YukiWikiのページ名になります。  YukiWiki、ホ・レ。シ・クフセ、ヒ、ハ、熙゙、ケ。」
1234  大かっこの中にはスペースを含めてはいけません。  ツ遉ォ、テ、ウ、ホテ讀ヒ、マ・ケ・レ。シ・ケ、エ゙、皃ニ、マ、、、ア、゙、サ、。」
1235  日本語も使えます。  ニヒワク、篏ネ、ィ、゙、ケ。」
1236    
1237  =back  =back
1238    
1239  =item *  =item *
1240    
1241  行頭がスペースやタブで始まっていると、  ケヤニャ、ャ・ケ・レ。シ・ケ、茹ソ・ヨ、ヌサマ、゙、テ、ニ、、、、ネ。「
1242  それは整形済みの段落C<< <pre> >>として扱われます。  、ス、、マターキチコム、゚、ホテハヘC<< <pre> >>、ネ、キ、ニーキ、、、゙、ケ。」
1243  プログラムの表示などに使うと便利です。  ・ラ・・ー・鬣爨ホノスシィ、ハ、ノ、ヒサネ、ヲ、ネハリヘ、ヌ、ケ。」
1244    
1245    
1246  =item *  =item *
1247    
1248  行を > ではじめると、  ケヤ、 > 、ヌ、マ、ク、皃、ネ。「
1249  引用文C<< <blockquote> >>が書けます。  ーヘムハクC<< <blockquote> >>、ャス、ア、゙、ケ。」
1250  >の数が多いとインデントが深くなります(3レベルまで)。  >、ホソ、ャツソ、、、ネ・、・・ヌ・・ネ、ャソシ、ッ、ハ、熙゙、ケ。ハ3・・ル・、゙、ヌ。ヒ。」
1251    
1252      >文章      >ハクセマ
1253      >文章      >ハクセマ
1254      >>さらなる引用      >>、オ、鬢ハ、ーヘム
1255      >文章      >ハクセマ
1256    
1257  =back  =back
1258    
1259  =head1 更新履歴  =head1 ケケソキヘホ
1260    
1261  =over 4  =over 4
1262    
1263  =item *  =item *
1264    
1265  2001年10月20日、Version 1.6.6。  2001ヌッ10キ20ニ。「Version 1.6.6。」
1266    
1267  更新の衝突対策。  ケケソキ、ホセラニヘツミコ。」
1268  元ページの簡単なチェックサムを取っておき、  クオ・レ。シ・ク、ホエハテア、ハ・チ・ァ・テ・ッ・オ・爨シ隍テ、ニ、ェ、ュ。「
1269  更新前にチェックサムを比較する。  ケケソキチー、ヒ・チ・ァ・テ・ッ・オ・爨ネ豕モ、ケ、。」
1270  修正個所はdigestという文字列を検索すれば分かる。  ス、タオクトス熙マdigest、ネ、、、ヲハクサホ、ク。コ、ケ、、ミハャ、ォ、。」
1271  本来はMD5などでちゃんとやった方がいいのだけれど。  ヒワヘ隍マMD5、ハ、ノ、ヌ、チ、网、ネ、荀テ、ソハ、ャ、、、、、ホ、タ、ア、、ノ。」
1272    
1273  衝突時に表示されるメッセージなどは「極悪」さんのページを参考にした。  セラニヘサ、ヒノスシィ、オ、、・皈テ・サ。シ・ク、ハ、ノ、マ。ヨカヒーュ。ラ、オ、、ホ・レ。シ・ク、サイケヘ、ヒ、キ、ソ。」
1274    
1275  =item *  =item *
1276    
1277  2001年10月17日、Version 1.6.5。  2001ヌッ10キ17ニ。「Version 1.6.5。」
1278    
1279  プレビュー画面で、更新ボタンを押したときに送信される  ・ラ・・モ・蝪シイ靂フ、ヌ。「ケケソキ・ワ・ソ・、イ。、キ、ソ、ネ、ュ、ヒチソョ、オ、、
1280  メッセージの内容をinput要素のtype="hidden"を使って埋め込むのをやめる。  ・皈テ・サ。シ・ク、ホニ簣ニ、inputヘラチヌ、ホtype="hidden"、サネ、テ、ニヒ荀盪、爨ホ、、荀皃。」
1281  代わりに、textarea要素を使う。  ツ螟、熙ヒ。「textareaヘラチヌ、サネ、ヲ。」
1282  再プレビュー用にmyspecial_を導入。でもきれいな対策ではない。  コニ・ラ・・モ・蝪シヘム、ヒmyspecial_、ニウニ。」、ヌ、筅ュ、、、、ハツミコ、ヌ、マ、ハ、、。」
1283    
1284  =item *  =item *
1285    
1286  2001年8月30日、Version 1.6.4。  2001ヌッ8キ30ニ。「Version 1.6.4。」
1287    
1288  URLでダイレクトにページ名を指定しても、  URL、ヌ・タ・、・・ッ・ネ、ヒ・レ。シ・クフセ、サリト熙キ、ニ、筍「
1289  $WikiNameと$BracketName以外のページを作れないようにした。  $WikiName、ネ$BracketNameーハウー、ホ・レ。シ・ク、コ、、ハ、、、隍ヲ、ヒ、キ、ソ。」
1290  (is_valid_nameとis_editable参照)。  (is_valid_name、ネis_editableサイセネ)。」
1291    
1292  =item *  =item *
1293    
1294  2001年8月30日、Version 1.6.3。  2001ヌッ8キ30ニ。「Version 1.6.3。」
1295    
1296  RecentChangesを編集・再編集不可とした。  RecentChanges、ハヤスク。ヲコニハヤスクノヤイト、ネ、キ、ソ。」
1297  編集不可ページは@uneditableにページ名を入れる。  ハヤスクノヤイト・レ。シ・ク、マ@uneditable、ヒ・レ。シ・クフセ、ニ、、。」
1298    
1299  =item *  =item *
1300    
1301  2001年2月25日、Version 1.6.1, 1.6.2。  2001ヌッ2キ25ニ。「Version 1.6.1, 1.6.2。」
1302    
1303  差分機能のバグ修正。  コケハャオ。ヌス、ホ・ミ・ース、タオ。」
1304  do_previewで'>'が扱えないバグを修正  do_preview、ヌ'>'、ャーキ、ィ、ハ、、・ミ・ー、ス、タオ
1305  (ユーザからの指摘)。  。ハ・譯シ・カ、ォ、鬢ホサリナヲ。ヒ。」
1306    
1307  =item *  =item *
1308    
1309  2001年2月22日、Version 1.6.0。  2001ヌッ2キ22ニ。「Version 1.6.0。」
1310  差分機能を実装した。  コケハャオ。ヌス、シツチ、キ、ソ。」
1311    
1312  =item *  =item *
1313    
1314  2001年2月19日、Version 1.5.4。  2001ヌッ2キ19ニ。「Version 1.5.4。」
1315  画像ファイルへのリンクは画像にしてみた。  イ霖・ユ・。・、・、リ、ホ・・・ッ、マイ霖、ヒ、キ、ニ、゚、ソ。」
1316    
1317  =item *  =item *
1318    
1319  2001年2月19日、Version 1.5.3。  2001ヌッ2キ19ニ。「Version 1.5.3。」
1320  RecentChangesの中に削除したページがあるのをやめた。  RecentChanges、ホテ讀ヒコス、キ、ソ・レ。シ・ク、ャ、「、、ホ、、荀皃ソ。」
1321  use strict;で引っかかる部分を少し整理(完全ではない)。  use strict;、ヌー、テ、ォ、ォ、ノハャ、セッ、キターヘ(エーチエ、ヌ、マ、ハ、、)。」
1322    
1323  =item *  =item *
1324    
1325  2001年2月16日、Version 1.5.2。  2001ヌッ2キ16ニ。「Version 1.5.2。」
1326  textareaに表示およびプレビューする前に < や > を &lt; や &gt; に変換した  textarea、ヒノスシィ、ェ、隍モ・ラ・・モ・蝪シ、ケ、チー、ヒ < 、 > 、 &lt; 、 &gt; 、ヒハムエケ、キ、ソ
1327  (do_preview, editpage, print_preview_buttons)。  (do_preview, editpage, print_preview_buttons)。」
1328    
1329  =item *  =item *
1330    
1331  2000年12月27日、Version 1.5.1。  2000ヌッ12キ27ニ。「Version 1.5.1。」
1332  プレビュー画面を整理した。  ・ラ・・モ・蝪シイ靂フ、ターヘ、キ、ソ。」
1333    
1334  =item *  =item *
1335    
1336  2000年12月22日、Version 1.5.0。  2000ヌッ12キ22ニ。「Version 1.5.0。」
1337  全体的にずいぶん書き直した。  チエツホナェ、ヒ、コ、、、ヨ、ス、ュトセ、キ、ソ。」
1338  一覧を別途作成するようにした(do_list)。  ーヘ、ハフナモコタョ、ケ、、隍ヲ、ヒ、キ、ソ(do_list)。」
1339  書き込む前に確認画面を出すようにした(do_preview)。  ス、ュケ、狠ー、ヒウホヌァイ靂フ、スミ、ケ、隍ヲ、ヒ、キ、ソ(do_preview)。」
1340  テキストの書き方を編集画面に入れた(do_edit, do_reedit)。  ・ニ・ュ・ケ・ネ、ホス、ュハ、ハヤスクイ靂フ、ヒニ、、ソ(do_edit, do_reedit)。」
1341  WhatsNew→RecentChanges、TopPage→FrontPageに変更した。  WhatsNew「ェRecentChanges。「TopPage「ェFrontPage、ヒハムケケ、キ、ソ。」
1342    
1343  =item *  =item *
1344    
1345  2000年12月20日、Version 1.1.0。  2000ヌッ12キ20ニ。「Version 1.1.0。」
1346  tieを利用して、dbmopenが使えない場合でも動作するように修正。  tie、ヘヘム、キ、ニ。「dbmopen、ャサネ、ィ、ハ、、セケ遉ヌ、簇ーコ、ケ、、隍ヲ、ヒス、タオ。」
1347  利用者の1人である「極悪」さんから  ヘヘムシヤ、ホ1ソヘ、ヌ、「、。ヨカヒーュ。ラ、オ、、ォ、
1348  送っていただいたコードを元にしています。  チ、テ、ニ、、、ソ、タ、、、ソ・ウ。シ・ノ、クオ、ヒ、キ、ニ、、、゙、ケ。」
1349    
1350  =item *  =item *
1351    
1352  2000年9月5日、Version 1.0.2。  2000ヌッ9キ5ニ。「Version 1.0.2。」
1353   <body color=...> → <body bgcolor=...>   <body color=...> 「ェ <body bgcolor=...>
1354  利用者からの指摘による。感謝。  ヘヘムシヤ、ォ、鬢ホサリナヲ、ヒ、隍。」エカシユ。」
1355    
1356  =item *  =item *
1357    
1358  2000年8月6日、Version 1.0.1を公開。  2000ヌッ8キ6ニ。「Version 1.0.1、クウォ。」
1359  C MAGAZINE(ソフトバンクパブリッシング)  C MAGAZINE。ハ・ス・ユ・ネ・ミ・・ッ・ム・ヨ・・テ・キ・・ー。ヒ
1360  2000年10月号連載記事向け公開版。  2000ヌッ10キケ賺「コワオュサク、アクウォネヌ。」
1361  [[ ]] の最後が「望」のようにシフトJISで  [[ ]] 、ホコヌク螟ャ。ヨヒセ。ラ、ホ、隍ヲ、ヒ・キ・ユ・ネJIS、ヌ
1362  0x5Dになる場合の回避を行なった。  0x5D、ヒ、ハ、セケ遉ホイネ、ケヤ、ハ、テ、ソ。」
1363    
1364  =item *  =item *
1365    
1366  2000年8月5日、Version 1.0.0を公開。  2000ヌッ8キ5ニ。「Version 1.0.0、クウォ。」
1367    
1368  =item *  =item *
1369    
1370  2000年7月23日、Version 0.82を公開。  2000ヌッ7キ23ニ。「Version 0.82、クウォ。」
1371  編集時のリンクミス。  ハヤスクサ、ホ・・・ッ・゚・ケ。」
1372  <textarea>の属性変更。  <textarea>、ホツータュハムケケ。」
1373    
1374  =item *  =item *
1375    
1376  2000年7月22日、Version 0.81を公開。  2000ヌッ7キ22ニ。「Version 0.81、クウォ。」
1377  ロゴを組み込む。  ・・エ、チネ、゚ケ、爍」
1378    
1379  =item *  =item *
1380    
1381  2000年7月21日、Version 0.80を公開。  2000ヌッ7キ21ニ。「Version 0.80、クウォ。」
1382  PODをCGI中に書き込む。  POD、CGIテ讀ヒス、ュケ、爍」
1383    
1384  =item *  =item *
1385    
1386  2000年7月19日、Version 0.70を公開。  2000ヌッ7キ19ニ。「Version 0.70、クウォ。」
1387  '''イタリック'''や、--、---、>>、>>>などを実装。  '''・、・ソ・・テ・ッ'''、茖「--。「---。「>>。「>>>、ハ、ノ、シツチ。」
1388    
1389  =item *  =item *
1390    
1391  2000年7月18日、Version 0.60を公開。  2000ヌッ7キ18ニ。「Version 0.60、クウォ。」
1392  *太字*を''太字''に変更  *ツタサ*、''ツタサ''、ヒハムケケ
1393    
1394  =item *  =item *
1395    
1396  2000年7月17日、Version 0.50を公開。  2000ヌッ7キ17ニ。「Version 0.50、クウォ。」
1397    
1398  =item *  =item *
1399    
1400  2000年7月17日、さらにいろいろ追加する。  2000ヌッ7キ17ニ。「、オ、鬢ヒ、、、、、、トノイテ、ケ、。」
1401    
1402  =item *  =item *
1403    
1404  2000年7月16日、いろいろ追加。  2000ヌッ7キ16ニ。「、、、、、、トノイテ。」
1405    
1406  =item *  =item *
1407    
1408  2000年7月15日、公開。  2000ヌッ7キ15ニ。「クウォ。」
1409    
1410  =back  =back
1411    
1412  =head1 TODO  =head1 TODO
1413    
1414      - テキスト表示モード      - ・ニ・ュ・ケ・ネノスシィ・筍シ・ノ
1415      - Charsetを明示。      - Charset、フタシィ。」
1416      - textarea中の閉じタグ対応      - textareaテ讀ホハト、ク・ソ・ーツミア
1417      - メニューの英語表記付記      - ・皈ヒ・蝪シ、ホアムクノスオュノユオュ
1418      - プレビューのボタンで、mymsgをinputのvalueに入れているが、改行をそのままvalueにいれてはいけないのではないか。      - ・ラ・・モ・蝪シ、ホ・ワ・ソ・、ヌ。「mymsg、input、ホvalue、ヒニ、、ニ、、、、ャ。「イケヤ、、ス、ホ、゙、゙value、ヒ、、、、ニ、マ、、、ア、ハ、、、ホ、ヌ、マ、ハ、、、ォ。」
1419      - 「再編集」の機能はブラウザの back で充分ではないか。プレビューはもっとシンプルに。      - 。ヨコニハヤスク。ラ、ホオ。ヌス、マ・ヨ・鬣ヲ・カ、ホ back 、ヌスシハャ、ヌ、マ、ハ、、、ォ。」・ラ・・モ・蝪シ、マ、筅テ、ネ・キ・・ラ・、ヒ。」
1420      - ページタイトル(Wikiname)が検索にかかるようにする。      - ・レ。シ・ク・ソ・、・ネ・。ハWikiname。ヒ、ャク。コ、ヒ、ォ、ォ、、隍ヲ、ヒ、ケ、。」
1421      - InterWiki風の機能「URLを隠しつつ、リンクを張る」      - InterWikiノ、ホオ。ヌス。ヨURL、ア」、キ、ト、ト。「・・・ッ、ト・、。ラ
1422    
1423  =head1 作者  =head1 コシヤ
1424    
1425      Copyright (C) 2000 by Hiroshi Yuki.      Copyright (C) 2000 by Hiroshi Yuki.
1426      結城浩 <hyuki@hyuki.com>      キセケタ <hyuki@hyuki.com>
1427      http://www.hyuki.com/      http://www.hyuki.com/
1428      http://www.hyuki.com/yukiwiki/      http://www.hyuki.com/yukiwiki/
1429    
1430  質問、意見、バグ報告は hyuki@hyuki.com にメールしてください。  シチフ茖「ーユクォ。「・ミ・ーハケ、マ hyuki@hyuki.com 、ヒ・癸シ・、キ、ニ、ッ、タ、オ、、。」
1431    
1432  =head1 配布条件  =head1 ヌロノロセキ
1433    
1434  YukiWikiは、  YukiWiki、マ。「
1435  GNU General Public Licenseにて公開します。  GNU General Public License、ヒ、ニクウォ、キ、゙、ケ。」
1436    
1437  YukiWikiはフリーソフトです。  YukiWiki、マ・ユ・遙シ・ス・ユ・ネ、ヌ、ケ。」
1438  ご自由にお使いください。  、エシォヘウ、ヒ、ェサネ、、、ッ、タ、オ、、。」
1439  自分好みのYukiWikiが作れるようにシンプルにしてあります。  シォハャケ・、゚、ホYukiWiki、ャコ、、、隍ヲ、ヒ・キ・・ラ・、ヒ、キ、ニ、「、熙゙、ケ。」
1440    
1441  =head1 謝辞  =head1 シユシュ
1442    
1443  本家のWikiWikiを作ったCunningham & Cunningham, Inc.に  ヒワイネ、ホWikiWiki、コ、テ、ソCunningham & Cunningham, Inc.、ヒ
1444  感謝します。  エカシユ、キ、゙、ケ。」
1445    
1446  YukiWikiを楽しんで使ってくださる  YukiWiki、ウレ、キ、、ヌサネ、テ、ニ、ッ、タ、オ、
1447  ネット上の方々に感謝します。  ・ヘ・テ・ネセ螟ホハ。ケ、ヒエカシユ、キ、゙、ケ。」
1448    
1449  YukiWikiのロゴをデザインしてくださった橋本礼奈さん  YukiWiki、ホ・・エ、・ヌ・カ・、・、キ、ニ、ッ、タ、オ、テ、ソカカヒワホ鯣爨オ、
1450  http://city.hokkai.or.jp/~reina/  http://city.hokkai.or.jp/~reina/
1451  に感謝します。  、ヒエカシユ、キ、゙、ケ。」
1452    
1453  tieを使った版の元になるコードを送ってくださった  tie、サネ、テ、ソネヌ、ホクオ、ヒ、ハ、・ウ。シ・ノ、チ、テ、ニ、ッ、タ、オ、テ、ソ
1454  「極悪」さんに感謝します。  。ヨカヒーュ。ラ、オ、、ヒエカシユ、キ、゙、ケ。」
1455    
1456  =head1 参照リンク  =head1 サイセネ・・・ッ
1457    
1458  =over 4  =over 4
1459    
1460  =item *  =item *
1461    
1462  YukiWikiホームページ  YukiWiki・ロ。シ・爭レ。シ・ク
1463  http://www.hyuki.com/yukiwiki/  http://www.hyuki.com/yukiwiki/
1464    
1465  =item *  =item *
1466    
1467  本家のWikiWiki  ヒワイネ、ホWikiWiki
1468  http://c2.com/cgi/wiki?WikiWikiWeb  http://c2.com/cgi/wiki?WikiWikiWeb
1469    
1470  =item *  =item *
1471    
1472  本家のWikiWikiの作者(Cunningham & Cunningham, Inc.)  ヒワイネ、ホWikiWiki、ホコシヤ(Cunningham & Cunningham, Inc.)
1473  http://c2.com/  http://c2.com/
1474    
1475  =item *  =item *
1476    
1477  YukiWikiのロゴデザインをしてくださった橋本礼奈さんのページ  YukiWiki、ホ・・エ・ヌ・カ・、・、、キ、ニ、ッ、タ、オ、テ、ソカカヒワホ鯣爨オ、、ホ・レ。シ・ク
1478  http://city.hokkai.or.jp/~reina/  http://city.hokkai.or.jp/~reina/
1479    
1480  =back  =back
1481    
1482  =cut  =cut

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24