You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.4 KiB
71 lines
1.4 KiB
10 years ago
|
package Subtitle::SSA;
|
||
|
|
||
|
use strict;
|
||
|
use warnings;
|
||
|
use feature qw(switch);
|
||
|
use utf8;
|
||
|
|
||
|
use base 'Subtitle::BASE';
|
||
|
|
||
|
sub new {
|
||
|
my ($class, %args) = @_;
|
||
|
my $self = {
|
||
|
debug => 0,
|
||
|
eol => "\n",
|
||
|
%args,
|
||
|
events => [],
|
||
|
log => [],
|
||
|
};
|
||
|
|
||
|
return bless($self, $class);
|
||
|
}
|
||
|
|
||
|
sub parse_timing {
|
||
|
my ($self, $str) = @_;
|
||
|
...
|
||
|
my $time = 0.0;
|
||
|
return unless $str =~ m/(\d+):(\d+):(\d+)([.,])(\d+)/oi;
|
||
|
my ($hrs, $min, $sec, $delim, $msec) = ($1, $2, $3, $4, $5);
|
||
|
if ($msec < 0 or $msec > 999) {
|
||
|
$self->log(warn => "wrong mseconds part of timing: $msec");
|
||
|
return;
|
||
|
}
|
||
|
if ($sec < 0 or $sec > 59) {
|
||
|
$self->log(warn => "wrong seconds part of timing: $sec");
|
||
|
return;
|
||
|
}
|
||
|
if ($min < 0 or $min > 59) {
|
||
|
$self->log(warn => "wrong minutes part of timing: $sec");
|
||
|
return;
|
||
|
}
|
||
|
if ($hrs < 0) {
|
||
|
$self->log(warn => "wrong minutes part of timing: $sec");
|
||
|
return;
|
||
|
}
|
||
|
given (length("$msec")) {
|
||
|
when ("3") { $time += $msec * 0.001; }
|
||
|
when ("2") { $time += $msec * 0.01; }
|
||
|
when ("1") { $time += $msec * 0.1; }
|
||
|
default { die("abnormal length of mseconds part"); }
|
||
|
}
|
||
|
$time += $sec;
|
||
|
$time += $min * 60;
|
||
|
$time += $hrs * 60 * 60;
|
||
|
return $time;
|
||
|
}
|
||
|
|
||
|
sub new_event { return +{ id => undef, timing => undef, style => undef, text => undef }; }
|
||
|
|
||
|
sub parse {
|
||
|
my ($self, $lines) = @_;
|
||
|
my $linenum = 0;
|
||
|
my $event;
|
||
|
|
||
|
foreach my $line (@$lines) {
|
||
|
}
|
||
|
|
||
|
return scalar @{ $self->{events} };
|
||
|
}
|
||
|
|
||
|
1;
|