diff options
-rwxr-xr-x | bin/dbris | 52 | ||||
-rw-r--r-- | lib/Travel/Routing/DE/DBRIS/Connection/Segment.pm | 15 |
2 files changed, 61 insertions, 6 deletions
@@ -189,9 +189,13 @@ sub format_occupancy { sub format_delay { my ( $delay, $len ) = @_; + $len += 1; if ( $delay and $len ) { return sprintf( "(%+${len}d)", $delay ); } + elsif ($len) { + return q{ } x ( $len + 2 ); + } return q{}; } @@ -231,6 +235,19 @@ for my $connection ( $ris->connections ) { } } + my $max_delay_digits = max + map { length( $_->dep_delay || q{} ), length( $_->arr_delay || q{} ) } + $connection->segments; + if ($show_full_route) { + my $max_route_delay_digits = max map { + map { length( $_->arr_delay || q{} ) } + $_->route + } $connection->segments; + if ( $max_route_delay_digits > $max_delay_digits ) { + $max_delay_digits = $max_route_delay_digits; + } + } + say q{}; printf( "%s (%02d:%02d) %s %s%s%s\n\n", @@ -251,9 +268,20 @@ for my $connection ( $ris->connections ) { } } elsif ( $segment->is_walk ) { - printf( "${output_bold}%s${output_reset} %dm (≈ %d min.)\n", - $segment->walk_name, $segment->distance_m, - $segment->duration->in_units('minutes') ); + if ( $segment->distance_m ) { + printf( "${output_bold}%s${output_reset} %dm (≈ %d min.)\n", + $segment->walk_name, $segment->distance_m, + $segment->duration->in_units('minutes') ); + } + elsif ( $segment->duration->in_units('minutes') ) { + printf( "${output_bold}%s${output_reset} ≈ %d min.\n", + $segment->walk_name, + $segment->duration->in_units('minutes') ); + } + else { + printf( "${output_bold}%s${output_reset}\n", + $segment->walk_name ); + } next; } elsif ( $segment->direction ) { @@ -265,16 +293,24 @@ for my $connection ( $ris->connections ) { printf( "${output_bold}%s${output_reset}\n", $segment->train_long ); } - printf( "%s ab %s%s\n", + printf( + "%s%s ab %s%s\n", $segment->dep->strftime('%H:%M'), + $max_delay_digits + ? q{ } . format_delay( $segment->dep_delay, $max_delay_digits ) + : q{}, $segment->dep_name, $segment->dep_platform ? q{ } . $segment->dep_platform : q{}, ); if ($show_full_route) { for my $stop ( $segment->route ) { - printf( "%s %s %s%s\n", + printf( + "%s%s %s %s%s\n", $stop->arr ? $stop->arr->strftime('%H:%M') : q{ }, + $max_delay_digits + ? q{ } . format_delay( $stop->arr_delay, $max_delay_digits ) + : q{}, format_occupancy($stop), $stop->name, $stop->platform ? q{ } . $stop->platform : q{}, @@ -282,8 +318,12 @@ for my $connection ( $ris->connections ) { } } - printf( "%s an %s%s\n", + printf( + "%s%s an %s%s\n", $segment->arr->strftime('%H:%M'), + $max_delay_digits + ? q{ } . format_delay( $segment->arr_delay, $max_delay_digits ) + : q{}, $segment->arr_name, $segment->arr_platform ? q{ } . $segment->arr_platform : q{}, ); diff --git a/lib/Travel/Routing/DE/DBRIS/Connection/Segment.pm b/lib/Travel/Routing/DE/DBRIS/Connection/Segment.pm index 840edba..8523f03 100644 --- a/lib/Travel/Routing/DE/DBRIS/Connection/Segment.pm +++ b/lib/Travel/Routing/DE/DBRIS/Connection/Segment.pm @@ -18,6 +18,7 @@ Travel::Routing::DE::DBRIS::Connection::Segment->mk_ro_accessors( sched_dep rt_dep dep dep_platform sched_arr rt_arr arr arr_platform sched_duration rt_duration duration duration_percent + arr_delay dep_delay delay journey_id occupancy occupancy_first occupancy_second is_transfer is_walk walk_name distance_m @@ -59,6 +60,20 @@ sub new { } $ref->{arr} = $ref->{rt_arr} // $ref->{sched_arr}; + if ( $ref->{sched_dep} and $ref->{rt_dep} ) { + $ref->{dep_delay} + = $ref->{rt_dep}->subtract_datetime( $ref->{sched_dep} ) + ->in_units('minutes'); + } + + if ( $ref->{sched_arr} and $ref->{rt_arr} ) { + $ref->{arr_delay} + = $ref->{rt_arr}->subtract_datetime( $ref->{sched_arr} ) + ->in_units('minutes'); + } + + $ref->{delay} = $ref->{arr_delay} // $ref->{dep_delay}; + # PUBLICTRANSPORT uses abschnittsDauerInSeconds; WALK uses abschnittsDauer if ( my $d = $json->{abschnittsDauerInSeconds} // $json->{abschnittsDauer} ) { |