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

Contents of /suikawiki/script/convert.cgi

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (show annotations) (download)
Wed Jan 1 01:29:04 2003 UTC (21 years, 4 months ago) by w
Branch: MAIN
CVS Tags: HEAD
Changes since 1.2: +0 -0 lines
FILE REMOVED
Obsoleted YukiWiki/WalWiki files are removed.

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

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24