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

Contents of /suikawiki/script/convert.cgi

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (show annotations) (download) (vendor branch)
Sun Jun 2 04:26:22 2002 UTC (22 years, 10 months ago) by wakaba
Branch: walwiki
CVS Tags: release-2-0-beta1-wal1
Changes since 1.1: +0 -0 lines

1 #!/usr/local/bin/perl
2 #
3 # convert.cgi
4 #
5 # YukiWiki1からYukiWiki2へのデータ変換用CGI
6 #
7 # Based on "YukiWiki1 to WalWiki convert.cgi" by Makio Tsukamoto.
8 #
9
10 use strict;
11 use CGI::Carp 'fatalsToBrowser';
12 use lib "."; # 同梱のjcode.pl、Algorithmがあるディレクトリを指定
13 use AnyDBM_File;
14 use Fcntl;
15
16 $| = 1;
17 my $jcodelib = 'jcode.pl';
18 my $kanjicode = 'sjis'; # 'sjis' 'euc'
19 my $newkanjicode = 'euc';
20 my %form;
21 my %olddb;
22 my %newdb;
23
24 require "$jcodelib";
25
26 &init_form($kanjicode);
27 &main;
28 exit(0);
29
30 # メイン
31 sub main {
32 if ($form{mycmd} eq 'convert') {
33 &do_convert;
34 } else {
35 &do_form;
36 }
37 }
38
39 sub do_convert {
40 &print_header('変換結果');
41 print <<"EOD";
42 <table border="1" cellspacing="0" cellpadding="3">
43 <tr><td colspan="2" bgcolor="#cccccc">パラメータ</td><tr>
44 <tr>
45 <td>
46 旧データベース名<br>
47 YukiWiki1の変数\$dbnameの値
48 </td><td>
49 $form{old_dbname}
50 </td>
51 </tr>
52 <tr>
53 <td>
54 YukiWiki1のデータベースの種類</td>
55 <td>
56 $form{old_dbtype}
57 </td>
58 </tr>
59 <tr>
60 <td>
61 新データベース名<br>
62 YukiWiki2の変数\$modifier_dir_dataの値と\$datanameの値をスラッシュ(/)でつなげたもの。
63 </td><td>
64 $form{new_dataname}
65 </td>
66 </tr>
67 <tr>
68 <td>
69 YukiWiki2のデータベースの種類</td>
70 <td>
71 $form{new_dbtype}
72 </td>
73 </tr>
74 </table>
75 EOD
76
77 # open old db
78 if ($form{old_dbtype} eq 'dbmopen') {
79 dbmopen(%olddb, "$form{old_dbname}", 0666) or &print_error("(dbmopen) $form{old_dbname} が作れません。");
80 } else {
81 tie(%olddb, "YukiWikiDB", "$form{old_dbname}") or &print_error("(tie error) $form{old_dbname}");
82 }
83
84 # open new db
85 if ($form{new_dbtype} eq 'dbmopen') {
86 dbmopen(%newdb, $form{new_dataname}, 0666) or &print_error("(dbmopen) $form{new_dataname} が作れません。");
87 } elsif ($form{new_dbtype} eq 'YukiWikiDB') {
88 tie(%newdb, "YukiWikiDB", $form{new_dataname}) or &print_error("(tie error, YukiWikiDB) $form{new_dataname}");
89 } else {
90 tie(%newdb, "AnyDBM_File", $form{new_dataname}, O_RDWR|O_CREAT, 0666) or &print_error("(tie error, AnyDBM_File) $form{new_dataname}");
91 }
92
93 # convert
94 &convert_all;
95
96 # close old db
97 if ($form{old_dbtype} eq 'dbmopen') {
98 dbmclose(%olddb);
99 } else {
100 untie(%olddb);
101 }
102
103 # close new db
104 if ($form{new_dbtype} eq 'dbmopen') {
105 dbmclose(%newdb);
106 } elsif ($form{new_dbtype} eq 'YukiWikiDB') {
107 untie(%newdb);
108 } else {
109 untie(%newdb);
110 }
111 }
112
113 sub convert_all {
114 my $keys = 0;
115 my $result;
116 print <<"EOD";
117 <table border="1" cellspacing="0" cellpadding="3">
118 <tr><td colspan="2" bgcolor="#cccccc">変換結果</td><tr>
119 EOD
120 foreach my $oldkey (keys(%olddb)) {
121 # unarmor
122 my $newkey = ($oldkey =~ /^\[\[(.+)\]\]$/) ? $1 : $oldkey;
123 my $msg = $olddb{$oldkey};
124 my $oldsize = length($msg);
125 $msg =~ s/ - ([^\[\]][^\n]*)/ - [[$1]]/g if ($oldkey eq 'RecentChanges');
126
127 &jcode::convert(\$msg, $newkanjicode);
128 my $newkey_in_oldkanjicode = $newkey;
129 &jcode::convert(\$newkey, $newkanjicode);
130
131 $newdb{$newkey} = $msg;
132 my $newsize = length($newdb{$newkey});
133 $keys++;
134 print " <tr><td>$keys: $oldkey (${oldsize})</td><td>$newkey_in_oldkanjicode (${newsize})</td></tr>\n";
135 }
136 print <<"EOD";
137 <tr><td>変換対象</td><td>$keys 件</td></tr>
138 </table>
139 </body>
140 </html>
141 EOD
142 }
143
144 sub do_form {
145 &print_header('変換');
146 print <<'EOD';
147 <form action="convert.cgi" method="post">
148 <table border="1" cellspacing="0" cellpadding="3">
149 <tr><td colspan="2" bgcolor="#cccccc">YukiWiki1からYukiWiki2のデータベース変換</td><tr>
150 <tr>
151 <td>
152 旧データベース名<br>
153 YukiWiki1の変数$dbnameの値
154 </td><td>
155 <input type="hidden" name="mycmd" value="convert" />
156 <input type="text" name="old_dbname" value="./yukiwiki" />
157 </td>
158 </tr>
159 <tr>
160 <td>
161 YukiWiki1のデータベースの種類</td>
162 <td>
163 <input type="radio" name="old_dbtype" value="dbmopen" />dbmopen
164 <input type="radio" name="old_dbtype" value="YukiWikiDB" checked /> YukiWikiDB
165 </td>
166 </tr>
167 <tr>
168 <td>
169 新データベース名<br>
170 YukiWiki2の変数\$modifier_dir_dataの値と\$datanameの値をスラッシュ(/)でつなげたもの。
171 </td><td>
172 <input type="text" name="new_dataname" value="./wiki" />
173 </td>
174 </tr>
175 <tr>
176 <td>
177 YukiWiki2のデータベースの種類</td>
178 <td>
179 <input type="radio" name="new_dbtype" value="dbmopen" /> dbmopen
180 <input type="radio" name="new_dbtype" value="YukiWikiDB" /> YukiWikiDB
181 <input type="radio" name="new_dbtype" value="AnyDBM_File" checked /> AnyDBM_File
182 </td>
183 </tr>
184 <tr>
185 <td colspan="2" align="center" bgcolor="#cccccc"><input type="submit" value="変換開始"></td>
186 </tr>
187 </table>
188 </form>
189 </body>
190 </html>
191 EOD
192 }
193
194 # フォームからの情報を連想配列 %form に入れる
195 # &init_form('euc');
196 sub init_form {
197 my ($charcode) = @_;
198 my $query;
199 if ($ENV{REQUEST_METHOD} =~ /^post$/i) {
200 read(STDIN, $query, $ENV{CONTENT_LENGTH});
201 } else {
202 $query = $ENV{QUERY_STRING};
203 }
204 my @assocarray = split(/&/, $query);
205 foreach my $assoc (@assocarray) {
206 my ($property, $value) = split(/=/, $assoc);
207 $value =~ tr/+/ /;
208 $value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;
209 $value =~ s/\x0D\x0A/\n/g; # Walrus add (1)
210 $value =~ tr/\x0D\x0A/\n\n/; # Walrus add (1)
211 &jcode::convert(\$value, $charcode);
212 $form{$property} = $value;
213 }
214 }
215
216 # エラーページを出力する
217 sub print_error {
218 my ($msg) = @_;
219 &print_header('Error');
220 exit(0);
221 }
222
223 sub escape {
224 my ($line) = shift;
225 $line =~ s|<|&lt;|g;
226 $line =~ s|>|&gt;|g;
227 $line =~ s|"|&quot;|g;
228 # $line =~ s|\&|&amp;|g;
229 return $line;
230 }
231
232 # ページのヘッダを出力
233 sub print_header {
234 my $title = shift;
235 print <<"EOD";
236 Content-type: text/html
237
238 <html><head>
239 <title>$title</title>
240 </head>
241 <body bgcolor="white">
242 EOD
243 }
244
245 # Definition of YukiWikiDB
246 package YukiWikiDB;
247
248 my $debug = 1;
249
250 # Constructor
251 sub new {
252 return shift->TIEHASH(@_);
253 }
254
255 # tying
256 sub TIEHASH {
257 my ($class, $dbname) = @_;
258 my $self = {
259 dir => $dbname,
260 keys => [],
261 };
262 if (not -d $self->{dir}) {
263 if (!mkdir($self->{dir}, 0777)) {
264 print "mkdir(" . $self->{dir} . ") fail\n" if ($debug);
265 return undef;
266 }
267 }
268 return bless($self, $class);
269 }
270
271 # Store
272 sub STORE {
273 my ($self, $key, $val) = @_;
274 my $file = &make_filename($self, $key);
275 if (open(FILE,"> $file")) {
276 binmode(FILE);
277 print FILE $val;
278 close(FILE);
279 return $self->{$key} = $val;
280 } else {
281 print "$file create error.";
282 }
283 }
284
285 # Fetch
286 sub FETCH {
287 my ($self, $key) = @_;
288 my $file = &make_filename($self, $key);
289 if (open(FILE, $file)) {
290 local $/;
291 $self->{$key} = <FILE>;
292 close(FILE);
293 }
294 return $self->{$key};
295 }
296
297 # Exists
298 sub EXISTS {
299 my ($self, $key) = @_;
300 my $file = &make_filename($self, $key);
301 return -e($file);
302 }
303
304 # Delete
305 sub DELETE {
306 my ($self, $key) = @_;
307 my $file = &make_filename($self, $key);
308 unlink $file;
309 return delete $self->{$key};
310 }
311
312 sub FIRSTKEY {
313 my ($self) = @_;
314 opendir(DIR, $self->{dir}) or die $self->{dir};
315 @{$self->{keys}} = grep /\.txt$/, readdir(DIR);
316 foreach my $name (@{$self->{keys}}) {
317 $name =~ s/\.txt$//;
318 $name =~ s/[0-9A-F][0-9A-F]/pack("C", hex($&))/eg;
319 }
320 return shift @{$self->{keys}};
321 }
322
323 sub NEXTKEY {
324 my ($self) = @_;
325 return shift @{$self->{keys}};
326 }
327
328 sub make_filename {
329 my ($self, $key) = @_;
330 my $enkey = '';
331 foreach my $ch (split(//, $key)) {
332 $enkey .= sprintf("%02X", ord($ch));
333 }
334 return $self->{dir} . "/$enkey.txt";
335 }
336 __END__

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24