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

Contents of /suikawiki/script/convert.cgi

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (hide annotations) (download)
Wed Jan 1 01:29:04 2003 UTC (22 years, 3 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 wakaba 1.2 #!/usr/bin/perl
2    
3     #!/usr/local/bin/perl
4 wakaba 1.1 #
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