.smi file sync 맞추기.

Personal Computer/misc 2007. 11. 23. 12:02 posted by tolkien
사무라이 참프루 20, 21화 悲歌慷慨

나데시코 보다가 sync 안 맞는 거 짜증나서
python으로 할까 하다가 익숙한 perl로 해버렸다.
gana군보다 더 원시적인 interface. (무려 hard coded!!!)
하지만, 뭐 script인데, 복잡하지 하게 하지 말자.

#!/usr/bin/perl
use Socket;
use POSIX;
require HTML::TokeParser;

open FILE, "./01.smi" || die "cannot open file";
$p = HTML::TokeParser->new(*FILE) || die "Can't open: $!\n";
#while(my $token = $p->get_tag("sync")) {
#    # $token->[$tag, $attr, $attrseq, $text]
#    print $token->[1]{start} . "\n";
#}
while(my $token = $p->get_token()) {
    # start tag		["S",  $tag, $attr, $attrseq, $text]
    # end tag		["E",  $tag, $text]
    # text		["T",  $text, $is_data]
    # comment		["C",  $text]
    # declaration	["D",  $text]
    # process instruction	["PI", $token0, $text]
    if ($token->[0] eq "S") {
	if ($token->[1] eq "sync") {
	    #print "<" . $token->[1] . " Start=" . $token->[2]{start} . ">";
	    $tmp = $token->[1];
	    $tmp =~ tr/a-z/A-Z/;

	    $start = int($token->[2]{start});
	    if ($start >= 20000) {
		$start += 9000;
	    }
	    if ($start >= 190908) {
		$start -= 94000;
	    }
	    print "<" . $tmp  . " Start=" . $start . ">";
	} else {
	    print $token->[4];
	}
    } elsif ($token->[0] eq "E") {
	print $token->[2];
    } elsif ($token->[0] eq "PI") {
	print $token->[2];
    } else {
	print $token->[1];
    }
}
print "\n";
close FILE;