#!/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.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') args = parser.parse_args() finished = False while not finished: html = search((args.origin, args.ot), (args.destination, args.dt)).read() parser = sParser(html) state = parser.check_page() 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'): print print '* Origin ambiguous:' l = None while not l or not l.isdigit() or int(l) > len(cor['origin']): i = 1 for c in cor['origin']: print '%d. %s' % (i, c) i += 1 l = sys.stdin.readline().strip() origin = cor['origin'][int(l) - 1] if cor.has_key('destination'): print print '* Destination ambiguous:' l = None while not l or not l.isdigit() or int(l) > len(cor['destination']): i = 1 for c in cor['destination']: print '%d. %s' % (i, c) i += 1 l = sys.stdin.readline().strip() destination = cor['destination'][int(l) - 1] if cor.has_key('origin_place'): print print '* Origin place ambiguous:' l = None while not l or not l.isdigit() or int(l) > len(cor['origin_place']): i = 1 for c in cor['origin_place']: print '%d. %s' % (i, c) i += 1 l = sys.stdin.readline().strip() origin_place = cor['origin_place'][int(l) - 1] if cor.has_key('destination_place'): print print '* Destination place ambiguous:' l = None while not l or not l.isdigit() or int(l) > len(cor['destination_place']): i = 1 for c in cor['destination_place']: print '%d. %s' % (i, c) i += 1 l = sys.stdin.readline().strip() 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) except ParserError: print 'PANIC at correction page' finished = True elif state == PageType.RESULT: parser = rParser(html) try: 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 '~' * 80 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 '-' * 80 print finished = True except ParserError: print 'parsererror' elif state == PageType.UNKNOWN: print 'PANIC unknown result'