#! /usr/bin/perl # # $Id: dbconv,v 1.16 2013/04/24 15:12:55 doi Exp doi $ # # dbconv - convert seiyuu databases # # this program will convert the format of the seiyuu databases, # which are maintained by Hitoshi Doi . # it is mainly used for creating parts of the WWW seiyuu pages. # # the seiyuu information is available via WWW at: # http://www.usagi.org/doi/seiyuu/ # # original hack by Hitoshi Doi (doi@usagi.org), 1995.10.17 # # this program is public domain. do whatever you want with it. # this program is offered "as is", and does not have any warrantee. # # --------------------------------------------------------------- # modifications # # 1996.03.18 Hitoshi Doi # support title format version 2 # generate indexed WWW info # # 1996.05.25 Hitoshi Doi # added -listall option # # 2001.02.09 Hitoshi Doi # support continuation lines # --------------------------------------------------------------- $me = $0; $me =~ s/.*\///; $print_out = 'VA'; $wwwtype = ''; $wwwdir = ''; $listall = ''; $listall2 = ''; while ($ai = shift(@ARGV)) { if ($ai eq '-dbformat') { $print_out = 'DB'; } elsif ($ai eq '-dbprefix') { $DB_prefix = shift(@ARGV); } elsif ($ai eq '-vaformat') { $print_out = 'VA'; } elsif ($ai eq '-db') { $dbfile = shift(@ARGV); } elsif ($ai eq '-www') { $wwwtype = shift(@ARGV); $wwwdir = shift(@ARGV); $print_out = ''; } elsif ($ai eq '-listall') { $listall = shift(@ARGV); $print_out = ''; } elsif ($ai eq '-listall2') { $listall2 = shift(@ARGV); $print_out = ''; } elsif ($ai eq '-help') { print "$me - convert seiyuu databases usage: $me -db FILE options: -dbformat print out in DB format -vaformat print out in VA format [default] -www cd SUBDIR generate indexed WWW info for CDs -www title SUBDIR generate indexed WWW info for titles -www role SUBIDR generate indexed WWW info for roles -listall PATH list all in HTML format, preceeded by PATH -listall2 PATH list all in HTML TABLE format, preceeded by PATH "; exit 0; } } if (!$dbfile) { print "$me: the seiyuu database is undefined.\n"; print "specify the database with the -db option.\n"; exit -1; } $ev_db = "seiyuu database $dbfile"; if (!open(DB, '<', $dbfile)) { print "$me: can't open the $ev_db.\n"; exit -1; } $style = " onMouseOver=\"this.style.background='pink'\""; $style .= " onMouseOut=\"this.style.background=''\""; &read_profile; # # go through the database and do processing # $DB_format = ''; while ($l = ) { chop $l; next if ($l =~ m/^$/); next if ($l =~ m/^#/); while ($l =~ m/\\$/) { # continuation $l =~ s/\\$//; $l .= ; chop $l; } # # new title # if ($l =~ m/^[A-Za-z0-9\"]/) { $cur_title = $l; $cur_url = ''; $cur_cover = ''; next; } $l =~ s/^[ ]+//i; # remove leading spaces # # special keywords # if ($l =~ m/^URL/) { $l =~ s/^URL[ ]*//i; $cur_url = $l; if ($listall) { print "
  • "; print "$cur_title\n"; } if ($listall2) { my @x = split(/,/, $cur_title); print "$x[1]"; print "$x[0]"; my $stext = ''; while ($l = ) { chop $l; last if ($l eq ''); my ($x, $ss) = split(/::/, $l); $ss =~ s/\{.*//; if (length($stext) > 25) { $stext .= ',...'; last; } $stext .= ', ' if ($stext ne ''); $stext .= $ss; } print '' . $stext . ''; print "\n"; } next; } if ($l =~ m/^COVER/) { $l =~ s/^COVER[ ]*//i; $cur_cover = $l; next; } # # character :: voice actor info # ($chara, $val) = split(/::/, $l); ($va, $debut) = split(/--/, $val); $chara =~ s/[ ]*$//; $chara =~ s/^[ ]*//; $va =~ s/^[ ]*//; $va =~ s/[ ]*$//; $eps = ''; if ($va =~ m/\{.*\}/) { $eps = $va; $va =~ s/[ ]*\{.*\}.*//; $eps =~ s/.*\{//; $eps =~ s/\}.*//; } $debut =~ s/^[ ]*//; next if (!$va); # # create WWW info # if ($wwwdir) { $val = $va; $val =~ y/A-Z/a-z/; $s_titles{$val} .= $cur_title . "\t"; $s_url{$val} .= $cur_url . "\t"; $s_role{$val} .= $chara . "\t"; $s_eps{$val} .= $eps . "\t"; $s_debut{$val} .= $debut . "\t"; } # # to VA format # if ($print_out eq 'VA') { if ($debut) { $VA_data{$va} .= " $cur_title -- $debut\n $chara"; } else { $VA_data{$va} .= " $cur_title\n $chara"; } if ($eps) { $VA_data{$va} .= " {$eps}"; } $VA_data{$va} .= "\n"; } # # to DB format # [debut] char - title {eps} - va (kanji) # if ($print_out eq 'DB') { $DB_format = $DB_prefix . ' '; $DB_format .= "[$debut] " if ($debut); # print even if $chara is null $DB_format .= "$chara - "; if ($cur_url) { $DB_format .= "$tt $dt"; } else { $DB_format .= "$cur_title"; } if ($eps) { $DB_format .= " {$eps}"; } $va .= " ($kanji{$va})" if ($kanji{$va}); $DB_format .= " - $va\n"; print $DB_format; $DB_format = ''; } } close(DB); # # print out VA format # if ($print_out eq 'VA') { foreach $k (sort keys(%VA_data)) { print "$k\n$VA_data{$k}\n"; } } if ($wwwdir) { &write_wwwcd if ($wwwtype eq 'cd'); &write_wwwtitle if ($wwwtype eq 'title'); &write_wwwrole if ($wwwtype eq 'role'); } exit 0; # # subroutines # sub read_profile { my $pf = '/home/doi/www/seiyuu/db/DB.profile'; open(PF, '<', $pf); my @all = ; close(PF); %kanji = (); foreach my $pl (@all) { chop $pl; my ($r, $k) = split(/\t/, $pl, 2); $kanji{$r} = $k; } } # # write data for WWW use (for CD) # sub write_wwwcd { my (@e_name, @e_url, @e_role); my ($en, $eu, $er); my $www_index = $wwwdir . "/Index"; my $www_out; system "/bin/mv", $wwwdir, $wwwdir . ".old"; mkdir $wwwdir, 0755; open(INDEX, '>', $www_index); my $i = 0; foreach my $k (sort keys %s_titles) { printf INDEX "%05d:%s\n", $i, $k; $www_out = sprintf("$wwwdir/%05d", $i); open(WWWOUT, ">$www_out"); @e_name = split(/\t/, $s_titles{$k}); @e_url = split(/\t/, $s_url{$k}); @e_role = split(/\t/, $s_role{$k}); @e_eps = split(/\t/, $s_eps{$k}); while ($en = shift(@e_name)) { $eu = shift(@e_url); $er = shift(@e_role); $ep = shift(@e_eps); my @x = split(/,/, $en); print WWWOUT "$x[1]"; if ($eu) { if ($eu =~ m/^\//) { print WWWOUT ""; } else { print WWWOUT ""; } } print WWWOUT "$x[0]"; if ($eu) { print WWWOUT ""; } print WWWOUT "" . $er; print WWWOUT " {$ep}" if ($ep); print WWWOUT "\n"; } close(WWWOUT); $i++; } close(INDEX); } # # write data for WWW use (for titles) # sub write_wwwtitle { my(@e_name, @e_url, @e_role); my($en, $eu, $er); my $www_index = $wwwdir . "/Index"; my $www_out; system "/bin/mv", $wwwdir, $wwwdir . ".old"; mkdir($wwwdir, 0755); open(INDEX, '>', $www_index); my $i = 0; foreach my $k (sort keys %s_titles) { printf INDEX "%05d:%s\n", $i, $k; $www_out = sprintf("$wwwdir/%05d", $i); open(WWWOUT, '>', $www_out); @e_name = split(/\t/, $s_titles{$k}); @e_url = split(/\t/, $s_url{$k}); while ($en = shift(@e_name)) { $eu = shift(@e_url); print WWWOUT "
  • "; if ($eu) { if ($eu =~ m/^\//) { print WWWOUT ""; } else { print WWWOUT ""; } } print WWWOUT "$en"; if ($eu) { print WWWOUT ""; } print WWWOUT "\n"; } close(WWWOUT); $i++; } close(INDEX); } # # write data for WWW use (for roles) # sub write_wwwrole { my(@e_name, @e_url, @e_role); my($en, $eu, $er); my $www_index = $wwwdir . "/Index"; my $www_out; system "/bin/mv", $wwwdir, $wwwdir . ".old"; mkdir($wwwdir, 0755); open(INDEX, '>', $www_index); my $i = 0; foreach my $k (sort keys %s_titles) { printf INDEX "%05d:%s\n", $i, $k; $www_out = sprintf("$wwwdir/%05d", $i); open(WWWOUT, '>', $www_out); @e_name = split(/\t/, $s_titles{$k}); @e_url = split(/\t/, $s_url{$k}); @e_role = split(/\t/, $s_role{$k}); @e_eps = split(/\t/, $s_eps{$k}); @e_debut = split(/\t/, $s_debut{$k}); while ($en = shift(@e_name)) { $eu = shift(@e_url); $er = shift(@e_role); $ee = shift(@e_eps); $ed = shift(@e_debut); print WWWOUT " "; if ($eu) { if ($eu =~ m/^\//) { print WWWOUT ""; } else { print WWWOUT ""; } } print WWWOUT "$en"; if ($eu) { print WWWOUT ""; } if ($ee) { print WWWOUT " {$ee}"; } if ($ed) { print WWWOUT " [$ed]"; } print WWWOUT " $er\n"; } close(WWWOUT); $i++; } close(INDEX); }

    this page converted for the iPhone

    seiyuu database links

    Hitoshi Doi | [RSS 2.0]