#!/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|$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 が作れません。");
        }
    } 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 "