#!/usr/bin/env python
# -*- coding: UTF-8 -*-
-from BeautifulSoup import BeautifulSoup, NavigableString
-from urllib2 import urlopen
-from urllib import urlencode
-import settings
-from datetime import datetime, time
-from textwrap import wrap
import argparse
import sys
-import os.path
+from gotovienna.utils import *
from gotovienna.routing import *
parser = argparse.ArgumentParser(description='Get public transport route for Vienna')
-parser.add_argument('-ot', metavar='type', type=str, help='origin type: %s' % ' | '.join(POSITION_TYPES), default='stop', choices=POSITION_TYPES)
-parser.add_argument('-dt', metavar='type', type=str, help='destination type: %s' % ' | '.join(POSITION_TYPES), default='stop', choices=POSITION_TYPES)
-parser.add_argument('origin')
-parser.add_argument('destination')
+parser.add_argument('-ot', metavar='type', type=str, help='origin type: %s' % ' | '.join(POSITION_TYPES), default=None, choices=POSITION_TYPES)
+parser.add_argument('-dt', metavar='type', type=str, help='destination type: %s' % ' | '.join(POSITION_TYPES), default=None, choices=POSITION_TYPES)
+parser.add_argument('origin', nargs='?', help='origin station name')
+parser.add_argument('destination', nargs='?', help='destination station name')
args = parser.parse_args()
+if not args.origin:
+ args.origin = raw_input('Origin: ')
+
+if not args.destination:
+ args.destination = raw_input('Destination: ')
+
+def do_search(args):
+ if isinstance(args.origin, unicode):
+ args.origin = args.origin.encode('utf-8', 'ignore')
+ elif isinstance(args.destination, unicode):
+ args.destination = args.destination.encode('utf-8', 'ignore')
+
+ result = search((args.origin, args.ot),
+ (args.destination, args.dt))
+
+ return sParser(result.read())
+
+print >>sys.stderr, 'Searching...\n',
+parser = do_search(args)
+print >>sys.stderr, 'done.'
+
finished = False
while not finished:
if state == PageType.CORRECTION:
try:
cor = parser.get_correction()
- print "A", args.origin, args.destination
origin, origin_place = split_station(args.origin)
destination, destination_place = split_station(args.destination)
- print "B", origin, origin_place, destination, destination_place
-
# FIXME refactoring
if cor.has_key('origin'):
destination_place = cor['destination_place'][int(l) - 1]
- print origin, origin_place, destination, destination_place
args.origin = '%s, %s' % (origin, origin_place)
args.destination = '%s, %s' %(destination, destination_place)
l = ''
while not l == 'q':
for idx, overview in enumerate(overviews):
- if not overview['date'] or not overview['time']:
+ timespan = overview['timespan']
+ if not timespan:
# XXX: Bogus data for e.g. Pilgramgasse->Karlsplatz?!
continue
-
- print '%d. [%s] %s-%s (%s)' % (idx + 1,
- overview['date'],
- overview['time'][0],
- overview['time'][1],
- overview['duration'])
+
+ str_timespan = timespan[0].strftime('[%y-%d-%m] %H:%M')
+ str_timespan += '-' + timespan[1].strftime('%H:%M')
+ timedelta = timespan[1] - timespan[0]
+ print '%d. %s (%s)' % (idx + 1,
+ str_timespan,
+ timedelta)
print 'q. Quit'
l = sys.stdin.readline().strip()
print
if l.isdigit() and int(l) <= len(details):
for detail in details[int(l) - 1]:
- if detail['time'] and detail['station']:
- time = '%s - %s' % (detail['time'][0].strftime(TIMEFORMAT), detail['time'][1].strftime(TIMEFORMAT))
+ if detail['timespan'] and detail['station']:
+ time = '%s - %s' % (detail['timespan'][0].strftime(TIMEFORMAT), detail['timespan'][1].strftime(TIMEFORMAT))
print '[%s] %s\n%s' % (time, ' -> '.join(detail['station']), '\n'.join(detail['info']))
else:
print '\n'.join(detail['info'])
elif state == PageType.UNKNOWN:
print 'PANIC unknown result'
+
+while parser.state == PageType.CORRECTION:
+ origin_corr, destination_corr = parser.get_correction()
+
+ if origin_corr:
+ print
+ print '* Origin ambiguous:'
+ lo = None
+ while not lo or not lo.isdigit() or int(lo) > len(origin_corr):
+ for idx, correction in enumerate(origin_corr):
+ print '%3d. %s' % (idx+1, correction)
+ lo = sys.stdin.readline().strip()
+
+ args.origin = origin_corr[int(lo) - 1]
+
+ if destination_corr:
+ print
+ print '* Destination ambiguous:'
+ ld = None
+ while not ld or not ld.isdigit() or int(ld) > len(destination_corr):
+ for idx, correction in enumerate(destination_corr):
+ print '%3d. %s' % (idx+1, correction)
+ ld = sys.stdin.readline().strip()
+
+ args.destination = destination_corr[int(ld) - 1]
+
+ parser = do_search(args)
+
+if parser.state == PageType.RESULT:
+ parser = parser.get_result()
+ overviews = parser.overview
+ details = parser.details
+ l = ''
+ while not l == 'q':
+ for idx, overview in enumerate(overviews):
+ if not overview['date'] or not overview['time']:
+ # XXX: Bogus data for e.g. Pilgramgasse->Karlsplatz?!
+ continue
+
+ print '%d. [%s] %s-%s (%s)' % (idx + 1,
+ overview['date'],
+ overview['time'][0],
+ overview['time'][1],
+ overview['duration'])
+ print 'q. Quit'
+ l = sys.stdin.readline().strip()
+ print
+ print '~' * 79
+
+ if l.isdigit() and int(l) <= len(details):
+ for detail in details[int(l) - 1]:
+ if detail['time'] and detail['station']:
+ time = '%s - %s' % (detail['time'][0].strftime(TIMEFORMAT), detail['time'][1].strftime(TIMEFORMAT))
+ print '[%s] %s\n%s' % (time, ' -> '.join(detail['station']), '\n'.join(detail['info']))
+ else:
+ print '\n'.join(detail['info'])
+ print '-' * 79
+ print
+else:
+ print 'Error - unknown page returned.'
+