/[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 - (hide annotations) (download) (vendor branch)
Sun Jun 2 04:26:22 2002 UTC (23 years, 1 month ago) by wakaba
Branch: walwiki
CVS Tags: release-2-0-beta1-wal1
Changes since 1.1: +0 -0 lines

1 wakaba 1.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