summaryrefslogtreecommitdiff
path: root/lib/Travel/Status/DE/VRR.pm
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2011-11-19 21:12:50 +0100
committerDaniel Friesel <derf@finalrewind.org>2011-11-19 21:12:50 +0100
commit6ee3e6cfe598b605e67d1bdc29d59c3564d0b692 (patch)
treef9d8d26c1caa293cc55896de81e610c05b8373e6 /lib/Travel/Status/DE/VRR.pm
parent523817239799733c15b900506ad57c5fc87c29de (diff)
Add Travel::Status::DE::VRR::Line; lineref accessor for ::Result
Diffstat (limited to 'lib/Travel/Status/DE/VRR.pm')
-rw-r--r--lib/Travel/Status/DE/VRR.pm70
1 files changed, 69 insertions, 1 deletions
diff --git a/lib/Travel/Status/DE/VRR.pm b/lib/Travel/Status/DE/VRR.pm
index 065d56c..dd149e8 100644
--- a/lib/Travel/Status/DE/VRR.pm
+++ b/lib/Travel/Status/DE/VRR.pm
@@ -6,8 +6,9 @@ use 5.010;
our $VERSION = '0.02';
-use Carp qw(confess);
+use Carp qw(confess cluck);
use Encode qw(encode decode);
+use Travel::Status::DE::VRR::Line;
use Travel::Status::DE::VRR::Result;
use LWP::UserAgent;
use XML::LibXML;
@@ -146,6 +147,59 @@ sub sprintf_time {
);
}
+sub lines {
+ my ($self) = @_;
+ my @lines;
+
+ my $xp_element
+ = XML::LibXML::XPathExpression->new('//itdServingLines/itdServingLine');
+
+ my $xp_info = XML::LibXML::XPathExpression->new('./itdNoTrain');
+ my $xp_route = XML::LibXML::XPathExpression->new('./itdRouteDescText');
+ my $xp_oper = XML::LibXML::XPathExpression->new('./itdOperator/name');
+
+ if ( $self->{lines} ) {
+ return @{ $self->{lines} };
+ }
+
+ for my $e ( $self->{tree}->findnodes($xp_element) ) {
+
+ my $e_info = ( $e->findnodes($xp_info) )[0];
+ my $e_route = ( $e->findnodes($xp_route) )[0];
+ my $e_oper = ( $e->findnodes($xp_oper) )[0];
+
+ if ( not( $e_info and $e_route and $e_oper ) ) {
+ cluck('node with insufficient data. This should not happen');
+ next;
+ }
+
+ my $line = $e->getAttribute('number');
+ my $direction = $e->getAttribute('direction');
+ my $valid = $e->getAttribute('valid');
+ my $type = $e_info->getAttribute('name');
+ my $route = $e_route->textContent;
+ my $operator = $e_oper->textContent;
+ my $identifier = $e->getAttribute('stateless');
+
+ push(
+ @lines,
+ Travel::Status::DE::VRR::Line->new(
+ name => $line,
+ direction => decode( 'UTF-8', $direction ),
+ valid => $valid,
+ type => decode( 'UTF-8', $type ),
+ route => decode( 'UTF-8', $route ),
+ operator => decode( 'UTF-8', $operator ),
+ identifier => $identifier,
+ )
+ );
+ }
+
+ $self->{lines} = \@lines;
+
+ return @lines;
+}
+
sub results {
my ($self) = @_;
my @results;
@@ -160,6 +214,12 @@ sub results {
my $xp_info
= XML::LibXML::XPathExpression->new('./itdServingLine/itdNoTrain');
+ if ( $self->{results} ) {
+ return @{ $self->{results} };
+ }
+
+ $self->lines;
+
for my $e ( $self->{tree}->findnodes($xp_element) ) {
my $e_date = ( $e->findnodes($xp_date) )[0];
@@ -171,6 +231,7 @@ sub results {
my $e_rtime = ( $e->findnodes($xp_rtime) )[0];
if ( not( $e_date and $e_time and $e_line ) ) {
+ cluck('node with insufficient data. This should not happen');
next;
}
@@ -189,6 +250,10 @@ sub results {
my $platform_is_db = 0;
+ my @line_obj
+ = grep { $_->{identifier} eq $e_line->getAttribute('stateless') }
+ @{ $self->{lines} };
+
if ( $platform =~ s{ ^ \# }{}ox ) {
$platform_is_db = 1;
}
@@ -200,6 +265,7 @@ sub results {
time => $rtime,
platform => $platform,
platform_db => $platform_is_db,
+ lineref => $line_obj[0] // undef,
line => $line,
destination => decode( 'UTF-8', $dest ),
countdown => $countdown,
@@ -215,6 +281,8 @@ sub results {
sort { $a->[1] <=> $b->[1] }
map { [ $_, $_->countdown ] } @results;
+ $self->{results} = \@results;
+
return @results;
}