#!/usr/bin/perl
#!/usr/local/bin/perl
#
# convert.cgi
#
# YukiWiki1からYukiWiki2へのデータ変換用CGI
#
# Based on "YukiWiki1 to WalWiki convert.cgi" by Makio Tsukamoto.
#
use strict;
use CGI::Carp 'fatalsToBrowser';
use lib "."; # 同梱のjcode.pl、Algorithmがあるディレクトリを指定
use AnyDBM_File;
use Fcntl;
$| = 1;
my $jcodelib = 'jcode.pl';
my $kanjicode = 'sjis'; # 'sjis' 'euc'
my $newkanjicode = 'euc';
my %form;
my %olddb;
my %newdb;
require "$jcodelib";
&init_form($kanjicode);
&main;
exit(0);
# メイン
sub main {
if ($form{mycmd} eq 'convert') {
&do_convert;
} else {
&do_form;
}
}
sub do_convert {
&print_header('変換結果');
print <<"EOD";
パラメータ |
旧データベース名
YukiWiki1の変数\$dbnameの値
|
$form{old_dbname}
|
YukiWiki1のデータベースの種類 |
$form{old_dbtype}
|
新データベース名
YukiWiki2の変数\$modifier_dir_dataの値と\$datanameの値をスラッシュ(/)でつなげたもの。
|
$form{new_dataname}
|
YukiWiki2のデータベースの種類 |
$form{new_dbtype}
|
EOD
# open old db
if ($form{old_dbtype} eq 'dbmopen') {
dbmopen(%olddb, "$form{old_dbname}", 0666) or &print_error("(dbmopen) $form{old_dbname} が作れません。");
} else {
tie(%olddb, "YukiWikiDB", "$form{old_dbname}") or &print_error("(tie error) $form{old_dbname}");
}
# open new db
if ($form{new_dbtype} eq 'dbmopen') {
dbmopen(%newdb, $form{new_dataname}, 0666) or &print_error("(dbmopen) $form{new_dataname} が作れません。");
} elsif ($form{new_dbtype} eq 'YukiWikiDB') {
tie(%newdb, "YukiWikiDB", $form{new_dataname}) or &print_error("(tie error, YukiWikiDB) $form{new_dataname}");
} else {
tie(%newdb, "AnyDBM_File", $form{new_dataname}, O_RDWR|O_CREAT, 0666) or &print_error("(tie error, AnyDBM_File) $form{new_dataname}");
}
# convert
&convert_all;
# close old db
if ($form{old_dbtype} eq 'dbmopen') {
dbmclose(%olddb);
} else {
untie(%olddb);
}
# close new db
if ($form{new_dbtype} eq 'dbmopen') {
dbmclose(%newdb);
} elsif ($form{new_dbtype} eq 'YukiWikiDB') {
untie(%newdb);
} else {
untie(%newdb);
}
}
sub convert_all {
my $keys = 0;
my $result;
print <<"EOD";
変換結果 |
EOD
foreach my $oldkey (keys(%olddb)) {
# unarmor
my $newkey = ($oldkey =~ /^\[\[(.+)\]\]$/) ? $1 : $oldkey;
my $msg = $olddb{$oldkey};
my $oldsize = length($msg);
$msg =~ s/ - ([^\[\]][^\n]*)/ - [[$1]]/g if ($oldkey eq 'RecentChanges');
&jcode::convert(\$msg, $newkanjicode);
my $newkey_in_oldkanjicode = $newkey;
&jcode::convert(\$newkey, $newkanjicode);
$newdb{$newkey} = $msg;
my $newsize = length($newdb{$newkey});
$keys++;
print "
$keys: $oldkey (${oldsize}) | $newkey_in_oldkanjicode (${newsize}) |
\n";
}
print <<"EOD";
変換対象 | $keys 件 |