From 556f259834d75cad6a2feeb1c5106204d5921a28 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Wed, 9 Sep 2015 22:57:17 +0200 Subject: Squashed commit of the following: commit 73bb123b4a90dab9a08fa38555f0cd4afcdf3740 Author: Daniel Friesel Date: Wed Sep 9 21:08:51 2015 +0200 remove outdated and now unused tests commit 3f35ba0001aaff49a7b10acfaa83303b354c162a Author: Daniel Friesel Date: Wed Sep 9 21:07:34 2015 +0200 documentation for ::DeutscheBahn commit f4c66605dcbffedbb558ca66c5032e5252011244 Author: Daniel Friesel Date: Wed Sep 9 21:03:31 2015 +0200 re-add deutschebahn module commit 41b505bc98d4b25a7ca15465fe0bbee6c3708e9e Author: Daniel Friesel Date: Tue Sep 8 18:31:22 2015 +0200 more documentation updates commit edf7b5fbd8175b4b53735859b2a961fe6ab8cf49 Author: Daniel Friesel Date: Sun Sep 6 18:48:09 2015 +0200 improve delay and delayReason handling commit c4e9121a181de9d800226ab6fccca8abb8b14705 Author: Daniel Friesel Date: Sun Sep 6 18:22:23 2015 +0200 HAFAS.pm: Code cleanup commit edae36b16ecc5e1fa0adbece954bb348ce37e9a0 Author: Daniel Friesel Date: Sun Sep 6 13:31:46 2015 +0200 add devmode option commit f7a60ae80e59a129aae77b276925f80d7430c259 Author: Daniel Friesel Date: Sun Sep 6 01:18:28 2015 +0200 support for platform changes commit 6876d56e6dd22065c342fe1fbf42f9fcf7f3d457 Author: Daniel Friesel Date: Thu Aug 20 20:01:24 2015 +0200 documentation: DeutscheBahn -> HAFAS commit 73706f0150bd0fb9c11d2b8be89204bfd4b03235 Author: Daniel Friesel Date: Thu Aug 20 19:54:12 2015 +0200 routes and route_info are not supported here commit af8a541fd1f03131a9cd39a5548188dbc09b266a Author: Daniel Friesel Date: Thu Aug 20 19:50:35 2015 +0200 documentationfoo commit ff3f2298c7be86bb7b672359f54c39588706673e Author: Daniel Friesel Date: Thu Aug 20 19:14:30 2015 +0200 rename db-ris to hafas-m commit 754fda9974e20ee630a3a3386d6ff7c42468ca46 Author: Daniel Friesel Date: Thu Aug 20 17:18:12 2015 +0200 add support for cancelled trains and delay reasons commit f860183613ee7818a2f448e8c40bbbdb95c6180a Author: Daniel Friesel Date: Wed Aug 19 15:19:54 2015 +0200 add info message support commit 17eda1d00cdbf98a04dbbe7d3ff89c6833af016d Author: Daniel Friesel Date: Sun Aug 16 18:00:05 2015 +0200 initial hafas api support --- lib/Travel/Status/DE/DeutscheBahn.pm | 333 ++----------------------- lib/Travel/Status/DE/DeutscheBahn/Result.pm | 365 ---------------------------- lib/Travel/Status/DE/HAFAS.pm | 346 ++++++++++++++++++++++++++ lib/Travel/Status/DE/HAFAS/Result.pm | 277 +++++++++++++++++++++ 4 files changed, 642 insertions(+), 679 deletions(-) delete mode 100644 lib/Travel/Status/DE/DeutscheBahn/Result.pm create mode 100644 lib/Travel/Status/DE/HAFAS.pm create mode 100644 lib/Travel/Status/DE/HAFAS/Result.pm (limited to 'lib/Travel') diff --git a/lib/Travel/Status/DE/DeutscheBahn.pm b/lib/Travel/Status/DE/DeutscheBahn.pm index 94af401..edec8fe 100644 --- a/lib/Travel/Status/DE/DeutscheBahn.pm +++ b/lib/Travel/Status/DE/DeutscheBahn.pm @@ -4,258 +4,16 @@ use strict; use warnings; use 5.010; -no if $] >= 5.018, warnings => "experimental::smartmatch"; - -use Carp qw(confess); -use LWP::UserAgent; -use POSIX qw(strftime); -use Travel::Status::DE::DeutscheBahn::Result; -use XML::LibXML; +use parent 'Travel::Status::DE::HAFAS'; our $VERSION = '1.05'; sub new { - my ( $obj, %conf ) = @_; - my $date = strftime( '%d.%m.%Y', localtime(time) ); - my $time = strftime( '%H:%M', localtime(time) ); - - my %lwp_options = %{ $conf{lwp_options} // { timeout => 10 } }; - - my $ua = LWP::UserAgent->new(%lwp_options); - - $ua->env_proxy; - - my $reply; - - my $lang = $conf{language} // 'd'; - - if ( not $conf{station} ) { - confess('You need to specify a station'); - } - - my $ref = { - mot_filter => [ - $conf{mot}->{ice} // 1, - $conf{mot}->{ic_ec} // 1, - $conf{mot}->{d} // 1, - $conf{mot}->{nv} // 1, - $conf{mot}->{s} // 1, - $conf{mot}->{bus} // 0, - $conf{mot}->{ferry} // 0, - $conf{mot}->{u} // 0, - $conf{mot}->{tram} // 0, - ], - post => { - advancedProductMode => q{}, - input => $conf{station}, - date => $conf{date} || $date, - time => $conf{time} || $time, - REQTrain_name => q{}, - start => 'yes', - boardType => $conf{mode} // 'dep', - - # L => 'vs_java3', - }, - }; - - for my $i ( 0 .. @{ $ref->{mot_filter} } ) { - if ( $ref->{mot_filter}->[$i] ) { - $ref->{post}->{"GUIREQProduct_$i"} = 'on'; - } - } - - bless( $ref, $obj ); + my ( $class, %opt ) = @_; - $reply - = $ua->post( - "http://reiseauskunft.bahn.de/bin/bhftafel.exe/${lang}n?rt=1", - $ref->{post} ); + $opt{service} = 'deutschebahn'; - if ( $reply->is_error ) { - $ref->{errstr} = $reply->status_line(); - return $ref; - } - - $ref->{html} = $reply->content; - - $ref->{tree} = XML::LibXML->load_html( - string => $ref->{html}, - recover => 2, - suppress_errors => 1, - suppress_warnings => 1, - ); - - $ref->check_input_error(); - - return $ref; -} - -sub new_from_html { - my ( $obj, %opt ) = @_; - - my $ref = { - html => $opt{html}, - post => { boardType => $opt{mode} // 'dep' } - }; - - $ref->{post}->{boardType} = $opt{mode} // 'dep'; - - $ref->{tree} = XML::LibXML->load_html( - string => $ref->{html}, - recover => 2, - suppress_errors => 1, - suppress_warnings => 1, - ); - - return bless( $ref, $obj ); -} - -sub check_input_error { - my ($self) = @_; - - my $xp_errdiv = XML::LibXML::XPathExpression->new( - '//div[@class = "errormsg leftMargin"]'); - my $xp_opts - = XML::LibXML::XPathExpression->new('//select[@class = "error"]'); - my $xp_values = XML::LibXML::XPathExpression->new('./option'); - - my $e_errdiv = ( $self->{tree}->findnodes($xp_errdiv) )[0]; - my $e_opts = ( $self->{tree}->findnodes($xp_opts) )[0]; - - if ($e_errdiv) { - $self->{errstr} = $e_errdiv->textContent; - - if ($e_opts) { - my @nodes = ( $e_opts->findnodes($xp_values) ); - $self->{errstr} - .= join( q{}, map { "\n" . $_->textContent } @nodes ); - } - } - - return; -} - -sub errstr { - my ($self) = @_; - - return $self->{errstr}; -} - -sub get_node { - my ( $parent, $name, $xpath, $index ) = @_; - $index //= 0; - - my @nodes = $parent->findnodes($xpath); - - if ( $#nodes < $index ) { - - # called by map, so we must explicitly return undef. - ## no critic (Subroutines::ProhibitExplicitReturnUndef) - return undef; - } - - my $node = $nodes[$index]; - - return $node->textContent; -} - -sub results { - my ($self) = @_; - my $mode = $self->{post}->{boardType}; - - my $xp_element = XML::LibXML::XPathExpression->new( - "//table[\@class = \"result stboard ${mode}\"]/tr"); - my $xp_train_more = XML::LibXML::XPathExpression->new('./td[3]/a'); - - # bhftafel.exe is not y2k1-safe - my $re_morelink = qr{ date = (? .. [.] .. [.] .. ) }x; - - my @parts = ( - [ 'time', './td[@class="time"]' ], - [ 'train', './td[3]' ], - [ 'route', './td[@class="route"]' ], - [ 'dest', './td[@class="route"]//a' ], - [ 'platform', './td[@class="platform"]' ], - [ 'info', './td[@class="ris"]' ], - [ 'routeinfo', './td[@class="route"]//span[@class="red bold"]' ], - ); - - @parts = map { [ $_->[0], XML::LibXML::XPathExpression->new( $_->[1] ) ] } - @parts; - - my $re_via = qr{ - ^ \s* (? .+? ) \s* \n - (?