--- suikawiki/script/wiki.cgi 2002/02/04 15:27:22 1.7
+++ suikawiki/script/wiki.cgi 2002/11/14 10:22:19 1.31
@@ -1,1484 +1,1649 @@
#!/usr/bin/perl
-use lib "../lib";
-use CGI::Carp 'fatalsToBrowser';
-use Algorithm::Diff qw(traverse_sequences);
-# use strict;
#
-# yukiwiki.cgi - Yet another WikiWikiWeb clone.
+# wiki.cgi - This is YukiWiki, yet another Wiki clone.
#
-# Copyright (C) 2000,2001 by Hiroshi Yuki.
+# Copyright (C) 2000-2002 by Hiroshi Yuki.
# 通常は入力した文字がそのまま出力されますが、
-以下のルールに従ってテキスト整形を行うことができます。 $form{myword}を含むページは、上に示す$count ページです。 $form{myword}を含むページは見つかりません。
-';
+my $maxrecent = 50;
my $cols = 80;
my $rows = 20;
##############################
-my %form = ();
-my %database = ();
-my %diffbase = ();
-my $diff_text = '';
-my @diff_added = ();
-my @diff_deleted = ();
-my $msgrefA;
-my $msgrefB;
-##############################
-# 編集不可ページ名一覧
-my @uneditable = ( $whatsnew );
-##############################
-# リンク用の正規表現
-# YukiWikiのリンクは2種類ある。
-#
-# (1) WikiName (RecentChangesとかFrontPageのようなもの)
-# (2) BracketName ([[結城浩]]とか[[トラブルシュート]]のようなもの)
#
-# ※シフトJISの2バイト目には ']' が来うるので、
-# 文字']'を1つ多くとるようにしている。
-#
-my $WikiName = '([A-Z][a-z]+([A-Z][a-z]+)+)';
-my $BracketName = '\[\[([^>\s]+?\]?)\]\]';
-
-# アイコン部分のタグ
-my $IconTag = ''; #<<"EOD";
-#
-#EOD
-
-require "$jcodelib";
-
-&init_form($kanjicode);
-
-if ($testing) {
- %form = (
- # 'mycmd' => 'write',
- 'mycmd' => 'read',
- #'mycmd' => 'search',
- #'mycmd' => 'edit',
- 'mymsg' => <<"EOD",
-はじめまして。
-これからいろいろ書き込みますね。
-LinkPageも見てください。
-TestPageはどうでしょうか。
-どうぞよろしく。
-http://www.hyuki.com/
-[[結城浩]]
-EOD
- 'mypage' => '<結城浩>',
- 'myword' => '結',
- # '3C8C8B8FE98D5F3E' => '',
- # 'TestPage' => '',
- );
-}
+# You MAY, but do NOT NEED modify following variables.
+#
+my $dataname = "$modifier_dir_data/wiki";
+my $infoname = "$modifier_dir_data/info";
+my $diffname = "$modifier_dir_data/diff";
+my $editchar = '?';
+my $subject_delimiter = ' - ';
+my $use_autoimg = 1; # automatically convert image URL into
tag.
+my $use_exists = 0; # If you can use 'exists' method for your DB.
+##############################
+my $InterWikiName = 'InterWikiName';
+my $RecentChanges = 'RecentChanges';
+my $AdminChangePassword = 'AdminChangePassword';
+my $CompletedSuccessfully = 'CompletedSuccessfully';
+my $FrontPage = 'HomePage';
+my $IndexPage = 'IndexPage';
+my $SearchPage = 'SearchPage';
+my $CreatePage = 'CreatePage';
+my $ErrorPage = 'ErrorPage';
+my $RssPage = 'RssPage';
+my $NAME_OF_WikiPageLicense = 'WikiPageLicense';
+my $AdminSpecialPage = 'Admin Special Page'; # must include spaces.
+##############################
+my $bracket_name = '\[\[(\S+?)\]\]';
+my $embedded_name = '\[\[(#\S+?)\]\]';
+my %fmt; ## formatter objects
+##############################
+my $embed_comment = '[[#comment]]';
+my $embed_rcomment = '[[#rcomment]]';
+my $embed_comment_Name_Prompt = '名前:';
+my $DEFAULT_embed_comment_name = '名無しさん';
+my $embed_interwiki = '^\[\[#(box|text|password):(\S+)\]\]$'; # Walrus add (5)
+my %embed_command = (
+ searched => '^\[\[#searched:([^\]]+)\]\]$',
+);
+##############################
+my $info_LastModified = 'LastModified';
+my $info_IsFrozen = 'IsFrozen';
+my $info_AdminPassword = 'AdminPassword';
+##############################
+my $kanjicode = 'euc';
+my $charset = 'EUC-JP';
+my $lang = 'ja';
+my %fixedpage = (
+ $IndexPage => 1,
+ $CreatePage => 1,
+ $ErrorPage => 1,
+ $RssPage => 1,
+ $RecentChanges => 1,
+ $SearchPage => 1,
+ $AdminChangePassword => 1,
+ $CompletedSuccessfully => 1,
+ #$FrontPage => 1,
+);
+my %form;
+my %database;
+my %infobase;
+my %diffbase;
+my %resource;
+my %interwiki;
+##############################
+my %page_command = (
+ $IndexPage => 'index',
+ $SearchPage => 'searchform',
+ $CreatePage => 'create',
+ $RssPage => 'rss',
+ $AdminChangePassword => 'adminchangepasswordform',
+ #$FrontPage => 'FrontPage',
+);
+my %command_do = (
+ read => \&do_read,
+ TEXT_CSS => \&do_output_css,
+ edit => \&do_edit,
+ adminedit => \&do_adminedit,
+ adminchangepasswordform => \&do_adminchangepasswordform,
+ adminchangepassword => \&do_adminchangepassword,
+ write => \&do_write,
+ index => \&do_index,
+ searchform => \&do_searchform,
+ search => \&do_search,
+ create => \&do_create,
+ createresult => \&do_createresult,
+ FrontPage => \&do_FrontPage,
+ comment => \&do_comment,
+ RandomJump => \&do_random_jump,
+ rss => \&do_rss,
+ diff => \&do_diff,
+ interwikibox => \&do_interwiki_box, # Walrus add (5)
+);
+##############################
+my @ignore_html_page = ('FrontPage'); # Walrus add (6)
+my @ignore_html_tags = ('a', 'br', 'img'); # Walrus add (6)
+my $walversion = '2.0.beta1.wal.1'; # Walrus add (1)
+##############################
+# &test_convert;
&main;
exit(0);
+##############################
-# メイン
sub main {
- &normalize_form;
- if ($dbmopen) {
- if (!dbmopen(%database, $dbname, 0666)) {
- &print_error("(dbmopen) $dbname が作れません。");
- }
+ &init_resource;
+ &open_db;
+ &init_form;
+ &init_InterWikiName;
+ if ($command_do{$form{mycmd}}) {
+ &{$command_do{$form{mycmd}}};
} else {
- if (!tie(%database, "YukiWikiDB", $dbname)) {
- &print_error("(tie error)");
- }
- }
-
- # myspecial対応
- foreach (keys %form) {
- if (/^myspecial_(.*)/) {
- $form{mycmd} = $1;
- last;
- }
- }
-
- if ($form{mycmd} eq 'read') {
- &do_read;
- } elsif ($form{mycmd} eq 'preview') {
- &do_preview;
- } elsif ($form{mycmd} eq 'write') {
- &do_write;
- } elsif ($form{mycmd} eq 'edit') {
- &do_edit;
- } elsif ($form{mycmd} eq 'reedit') {
- &do_reedit;
- } elsif ($form{mycmd} eq 'search') {
- &do_search;
- } elsif ($form{mycmd} eq 'list') {
- &do_list;
- } elsif ($form{mycmd} eq 'diff') {
- &do_diff;
- } else {
- $form{mypage} = $toppage;
- &do_read;
- }
- if ($dbmopen) {
- dbmclose(%database);
- } else {
- untie(%database);
+ &do_FrontPage;
}
+ &close_db;
}
-# ページの表示
sub do_read {
- my $page_name = $form{mypage};
- my $percent_name = &encode_percent($page_name);
- &print_header($page_name);
- print qq|
$IconTag$page_name
\n|;
- &print_toolbar($page_name);
- print &convert_html(&get_page($page_name));
- &print_footer;
+ my $content = $database{$form{mypage}};
+ my $lm = &get_info($form{mypage}, $info_LastModified);
+ wiki::referer::add ($form{mypage}, $ENV{HTTP_REFERER});
+ my ($r, $c) = get_search_result ($form{mypage});
+ my $rl = wiki::referer::list_html ($form{mypage});
+ my @toc;
+ push @toc, qq(-See Also) if $c;
+ push @toc, qq(-参照元) if $rl;
+ my $cf = 'SuikaWiki/0.9';
+ ## Should be support at least:
+ ## - 'SuikaWiki/0.9' CRLF
+ ## - 'H2H/' ("0.9" / "1.0" / "1.1") CRLF
+ ## - "/*" WSP* 'W3C-CSS/' ("1.0" / "2.0") "*/" CRLF
+ $cf = $1 if $content =~ s#^(?:/\*\s*|[\#<]\?)?([A-Z][A-Za-z0-9-]+/[0-9.]+(?:[^0-9.][^\x0D\x0A]*)?)[\x0D\x0A]+##s;
+ if ($cf =~ m!^(?:\#\?)?SuikaWiki/0.9(?:$|\s)!) {
+ &print_header ($form{mypage}, -last_modified => $lm,
+ -content_format => $cf, -noindex => $cf =~ /obsoleted="yes"/);
+ &print_content ($content, content_format => $cf, last_modified => $lm,
+ -toc => \@toc);
+ print &text_to_html (q([[#comment]])) unless $cf =~ /obsoleted="yes"/;
+ } else {
+ &print_header($form{mypage}, -last_modified => $lm);
+ print "@{[&escape($content)]}";
+ }
+ if ($c) {
+ print q{See also
};
+ print $r;
+ }
+ if ($rl) {
+ print qq(参照元
\n$rlSee also
};
+ print $r;
+ }
+ if ($rl) {
+ print qq(参照元
\n$rl$IconTag${page_name}の編集
\n|;
- &print_toolbar($page_name);
- $page_msg = &escape($page_msg);
- print <<"EOD";
-
-
-テキスト整形のルール
-
-
-
-EOD
- &print_footer;
+sub do_adminchangepasswordform {
+ &print_header($AdminChangePassword, -noindex => 1);
+ &print_passwordform;
+ &print_footer($AdminChangePassword);
}
-# ページの検索
-sub do_search {
- if ($form{myword}) {
- &print_header('検索結果');
- print qq|
- :用語1:いろいろ書いた解説文1
- :用語2:いろいろ書いた解説文2
- :用語3:いろいろ書いた解説文3
-
-
-$IconTag$form{myword}の検索結果
\n|;
- &print_toolbar();
- print qq|\n|;
- my $count = 0;
- foreach my $page_name (sort keys %database) { # sortするのは無謀かな
- if ($database{$page_name} =~ /\Q$form{'myword'}\E/) {
- my $encoded = &encode_percent($page_name);
- print qq|
\n|;
- if ($count > 0) {
- print qq|);
+ foreach my $page (sort keys %database) {
+ if (&is_editable($page)) {
+ print qq(
-$IconTag単語検索
\n|;
- &print_toolbar();
}
- print <<"EOD";
-
以下のプレビューを確認して、よければページ下部のボタンで更新してください。
\n|; - if ($form{mymsg}) { - print qq|| \n|; - # print &convert_html($escapedmsg); - print &convert_html($form{mymsg}); - print qq| |
(ページの内容は空です。更新するとこのページは削除されます。)
\n|; +sub do_write { + if (&frozen_reject()) { + return; } - &print_preview_buttons($page_name, $escapedmsg, $form{mydigest}); - &print_footer; -} - -sub print_preview_buttons { - my ($page_name, $escapedmsg, $digest) = @_; - print <<"EOD"; - -EOD -} -# 書き込む -sub do_write { if (not &is_editable($form{mypage})) { - # 編集不可ページは表示のみ - &do_read; + &print_header($form{mypage}, -noindex => 1); + &print_message($resource{cantchange}); + &print_footer($form{mypage}); return; } - my $page_name = $form{mypage}; - - # digestを使って、更新の衝突チェック - my $original_digest = &calc_message_digest(&get_page($page_name)); - if ($form{mydigest} ne $original_digest) { - &print_header($page_name); - print qq|あなたがこのページを編集している間に、 -他の人が同じページを更新してしまったようです。 -
-以下に、あなたの編集したテキストがありますので、 -あなたの編集内容が失われないように、 -いますぐ、メモ帳などにコピー&ペーストしてください。 -
-コピー&ペーストが済んでから、 -最新の内容を見て再度編集し直してください。 -最新の内容は -$form{mypage} -で見ることができます。 -
-EOD - # &print_toolbar($page_name); - &print_preview_buttons($page_name, &escape($form{mymsg}), $form{mydigest}); - &print_footer; + if (&conflict($form{mypage}, $form{mymsg})) { return; } - # diff生成 + # Making diff { - &opendiff; - my @msg1 = split(/\n/, &get_page($page_name)); + &open_diff; + my @msg1 = split(/\n/, $database{$form{mypage}}); my @msg2 = split(/\n/, $form{mymsg}); - $msgrefA = \@msg1; - $msgrefB = \@msg2; - &diff_check; - $diffbase{$form{mypage}} = $diff_text; - $diff_text = ''; - &closediff; + $diffbase{$form{mypage}} = &difftext(\@msg1, \@msg2); + &close_diff; } - &print_header($page_name); - &set_page($page_name, $form{mymsg}); if ($form{mymsg}) { - print qq|${page_name}を削除しました。
\n|; - } - &print_footer; - # 更新されたのでタッチしておく。 - if ($touchfile) { - open(FILE, "> $touchfile"); - print FILE "\n"; - close(FILE); - } -} - -# ページの変更点 -sub do_diff { - if (not &is_editable($form{mypage})) { - # 編集不可ページは表示のみ - &do_read; - return; - } - &opendiff; - &print_header($form{mypage} . 'の変更点'); - print qq|\n|;
- foreach (split(/\n/, $_)) {
- if (/^\+(.*)/) {
- print qq|$1\n|;
- } elsif (/^\-(.*)/) {
- print qq|$1\n|;
- } elsif (/^\=(.*)/) {
- print qq|$1\n|;
- } else {
- print qq|??? $_\n|;
- }
- }
- print qq|\n|;
- &print_footer;
- &closediff;
-}
-
-sub opendiff {
- if ($dbmopen) {
- if (!dbmopen(%diffbase, $diffdbname, 0666)) {
- &print_error("(dbmopen) $diffdbname が作れません。");
+ $database{$form{mypage}} = $form{mymsg};
+ &send_mail_to_admin($form{mypage}, "Modify");
+ if ($form{mytouch}) {
+ &set_info($form{mypage}, $info_LastModified, '' . localtime);
+ &update_recent_changes;
}
+ &set_info($form{mypage}, $info_IsFrozen, 0 + $form{myfrozen});
+ &print_header($CompletedSuccessfully, -noindex => 1, -goto => $url_cgi.'?'.&encode($form{mypage}).($form{__comment_anchor_index}?"#anchor-$form{__comment_anchor_index}":''));
+ &print_message($resource{saved});
+ &print_content("$resource{continuereading} @{[&armor_name($form{mypage})]}");
+ &print_footer($CompletedSuccessfully);
} else {
- if (!tie(%diffbase, "YukiWikiDB", $diffdbname)) {
- &print_error("(tie error)");
+ &send_mail_to_admin($form{mypage}, "Delete");
+ delete $database{$form{mypage}};
+ delete $infobase{$form{mypage}};
+ if ($form{mytouch}) {
+ &update_recent_changes;
}
+ &print_header($form{mypage}, -noindex => 1);
+ &print_message($resource{deleted});
+ &print_footer($form{mypage});
}
}
-sub closediff {
- if ($dbmopen) {
- dbmclose(%diffbase);
- } else {
- untie(%diffbase);
- }
-}
-
-# フォームからの情報を連想配列 %form に入れる
-# &init_form('euc');
-sub init_form {
- my ($charcode) = @_;
- my $query;
- if ($ENV{REQUEST_METHOD} =~ /^post$/i) {
- read(STDIN, $query, $ENV{CONTENT_LENGTH});
- } else {
- $query = $ENV{QUERY_STRING};
- }
- my @assocarray = split(/[&;]/, $query);
- foreach my $assoc (@assocarray) {
- my ($property, $value) = split(/=/, $assoc);
- $value =~ tr/+/ /;
- $value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;
- &jcode::convert(\$value, $charcode);
- $form{$property} = $value;
- }
+sub do_searchform {
+ &print_header($SearchPage);
+ &print_searchform("");
+ &print_footer($SearchPage);
}
-# エラーページを出力する
-sub print_error {
- my ($msg) = @_;
- &print_header('Error');
- print "