--- suikawiki/script/wiki.cgi 2002/02/04 15:27:22 1.7
+++ suikawiki/script/wiki.cgi 2002/03/24 00:51:52 1.8
@@ -1,1484 +1,1491 @@
-#!/usr/bin/perl
-use lib "../lib";
-use CGI::Carp 'fatalsToBrowser';
-use Algorithm::Diff qw(traverse_sequences);
-# use strict;
-#
-# yukiwiki.cgi - Yet another WikiWikiWeb clone.
-#
-# Copyright (C) 2000,2001 by Hiroshi Yuki.
-# 通常は入力した文字がそのまま出力されますが、
-以下のルールに従ってテキスト整形を行うことができます。 $form{myword}を含むページは、上に示す$count ページです。 $form{myword}を含むページは見つかりません。
-
-#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' => '',
- );
-}
-&main;
-exit(0);
-
-# メイン
-sub main {
- &normalize_form;
- if ($dbmopen) {
- if (!dbmopen(%database, $dbname, 0666)) {
- &print_error("(dbmopen) $dbname が作れません。");
- }
- } 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);
- }
-}
-
-# ページの表示
-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;
-}
-
-# ページの編集
-sub do_edit {
- if (not &is_editable($form{mypage})) {
- # 編集不可ページは表示のみ
- &do_read;
- return;
- }
- &editpage(&get_page($form{mypage}));
-}
-
-# ページの再編集
-sub do_reedit {
- if (not &is_editable($form{mypage})) {
- # 編集不可ページは表示のみ
- &do_read;
- } else {
- &editpage($form{mymsg});
- }
-}
-
-sub editpage {
- my $page_msg = shift;
- my $page_name = $form{mypage};
- my $digest = &calc_message_digest($page_msg);
- &print_header($page_name);
- print qq|$IconTag${page_name}の編集
\n|;
- &print_toolbar($page_name);
- $page_msg = &escape($page_msg);
- print <<"EOD";
-
-
-テキスト整形のルール
-
-
-
-EOD
- &print_footer;
-}
-
-# ページの検索
-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|$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|; - } - &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; - 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; - return; - } - - # diff生成 - { - &opendiff; - my @msg1 = split(/\n/, &get_page($page_name)); - my @msg2 = split(/\n/, $form{mymsg}); - $msgrefA = \@msg1; - $msgrefB = \@msg2; - &diff_check; - $diffbase{$form{mypage}} = $diff_text; - $diff_text = ''; - &closediff; - } - - &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|\n|; - &print_footer; - &closediff; -} - -sub opendiff { - if ($dbmopen) { - if (!dbmopen(%diffbase, $diffdbname, 0666)) { - &print_error("(dbmopen) $diffdbname が作れません。"); - } - } else { - if (!tie(%diffbase, "YukiWikiDB", $diffdbname)) { - &print_error("(tie error)"); - } - } -} - -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 print_error { - my ($msg) = @_; - &print_header('Error'); - print "$1\n|; - } elsif (/^\=(.*)/) { - print qq|$1\n|; - } else { - print qq|??? $_\n|; - } - } - print qq|