package Subtitle::BASE; use strict; use warnings; use feature qw(switch); use utf8; sub log { my ($self, $level, $msg) = @_; given ($level) { when ("error") { push @{ $self->{log} }, "E: $msg"; } when ("warn") { push @{ $self->{log} }, "W: $msg"; } when ("info") { push @{ $self->{log} }, "I: $msg"; } when ("debug") { push @{ $self->{log} }, "D: $msg" if $self->{debug}; } default { warn "Unknown loglevel $level of $msg\n"; } } return 1; } 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 { $self->log(error => "abnormal length of mseconds part"); return; } } $time += $sec; $time += $min * 60; $time += $hrs * 60 * 60; return $time; } sub build_timing { my ($self, $time, $prec) = @_; $prec //= 2; my ($hrs, $min, $sec, $msec, $rest); $hrs = int($time / 3600); $rest = $time - ($hrs * 3600); $min = int($rest / 60); $rest = $rest - ($min * 60); $sec = int($rest / 1); $msec = sprintf "%.${prec}f", ($rest - ($sec * 1)); $msec =~ s/^0\.//o; return sprintf($self->{timing_fmt}, $hrs, $min, $sec, $msec); } sub events { my ($self) = @_; return wantarray ? @{ $self->{events} } : $self->{events}; } sub parse { return "Unimplemented by subclass"; } sub build { return "Unimplemented by subclass"; } 1;