X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=itip;h=a291720d46dcaf393e7791a3cd6dce734dfa26cc;hb=e7bf2566d061714d47f62baef56f08f63f53d542;hp=b8fe1bfe99be8ebaaa0da2cd4c09abcd651c54c9;hpb=2e7b435f9bc6f9a613066b2dc11821b8d72c26e0;p=pywienerlinien diff --git a/itip b/itip index b8fe1bf..a291720 100755 --- a/itip +++ b/itip @@ -1,62 +1,112 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -from BeautifulSoup import BeautifulSoup -from urllib2 import urlopen -import settings +from gotovienna import argparse +from gotovienna.utils import * +from gotovienna.realtime import * from datetime import time -import argparse -import re - -from gotovienna.realtime import ITipParser - parser = argparse.ArgumentParser(description='Get realtime public transport information for Vienna') -parser.add_argument('-l', metavar='name', type=str, help='line name') -parser.add_argument('-s', metavar='name', type=str, help='station name') +parser.add_argument('line', nargs='?', help='line name (e.g. 59A)') +parser.add_argument('station', nargs='?', help='station name (e.g. Karlsplatz)') args = parser.parse_args() itip = ITipParser() -lines = itip.lines -if args.l: - l = args.l.upper() -else: - l = None -if args.s: - s = args.s.decode('UTF-8') -else: - s = '' - -if l and l in lines: - stations = itip.get_stations(l) - for key in stations.keys(): - if not s: - print '* %s:' % key - for station in stations[key]: - if s: - if s.startswith(station[0]) or station[0].startswith(s): - # FIXME - print '* %s\n %s .....' % (key, station[0]), itip.get_departures(station[1]) - else: - print ' %s' % station[0] - -elif not l: - line = {'U-Bahn': '|', 'Strassenbahn': '|', 'Bus': '|', 'Andere': '|', 'Nightline': '|'} - lines_sorted = lines.keys() - lines_sorted.sort() - for li in lines_sorted: - if li.isdigit(): - type = 'Strassenbahn' - elif li.endswith('A') or li.endswith('B') and li[1].isdigit(): - type = 'Bus' - elif li.startswith('U'): - type = 'U-Bahn' - elif li.startswith('N'): - type = 'Nightline' + +if args.line: + # Convert line name to uppercase (e.g. 'u4' -> 'U4') + args.line = args.line.upper() + +if args.station: + args.station = args.station.decode('utf-8') + +if args.line in itip.lines: + ITEM_WIDTH = 33 + ITEM_SPACING = 4 + + # FIXME: change get_stations() to return (headers, stations) directly + stations = sorted(itip.get_stations(args.line).items()) + headers, stations = zip(*stations) + + maxlength = max(len(stops) for stops in stations) + for stops in stations: + # Pad station list with empty items for printing, so that + # different-sized lists aren't truncated (with zip below) + stops.extend([('', '')] * (maxlength - len(stops))) + + stations_table = zip(*stations) + fmt = '%%-%ds' % ITEM_WIDTH + spacer = ' ' * ITEM_SPACING + + print + print spacer, spacer.join(inblue(fmt % ('Richtung %s' % name)) + for name in headers) + print spacer, spacer.join('-' * ITEM_WIDTH for name in headers) + + def match_station(query, station): + return query and station and (query.lower() in station.lower()) + + for row in stations_table: + print spacer, spacer.join(ingreen(fmt % name) + if match_station(args.station, name) + else fmt % name + for name, url in row) + print + + # Get matching stations + stations = zip(headers, stations) + details = [(direction, name, url) for direction, stops in stations + for name, url in stops if match_station(args.station, name)] + + # User entered a station, but no matches were found + if args.station and not details: + print inred('No station matched your query.') + print + + # Format a departure time (in minutes from now) for display + def format_departure(departure): + minutes = departure['time'] + if type(minutes) == time: + return inblue(minutes.strftime('%H:%M')) + elif minutes == 0: + return inred('now') + elif minutes == 1: + return inblue('1') + ' min' else: - type = 'Andere' + return inblue('%d' % minutes) + ' mins' + + # Print the departure times for all matched stations + for direction, name, url in details: + print ingreen(name), '->', inblue(direction) + + departures = itip.get_departures(url) + if departures: + print ' Next departures:', ', '.join(format_departure(x) + for x in departures) + else: + print ' No departure information.' + print +else: + ITEMS_PER_LINE = 12 + ITEM_WIDTH = 5 + LINE_WIDTH = (ITEMS_PER_LINE * ITEM_WIDTH + ITEMS_PER_LINE) + + if args.line: + print + print inred('The given line was not found. Valid lines:') + + print + for label, remaining in categorize_lines(itip.lines): + prefix, fill, postfix = '|== ', '=', '==- -' + before, after = prefix + label + ' ', postfix + padding = LINE_WIDTH - len(before + after) + before = before.replace(label, inblue(label)) + print ''.join((before, fill * padding, after)) + + while remaining: + this_row = [remaining.pop(0) for _ in + range(min(len(remaining), ITEMS_PER_LINE))] + print ' '.join(('%%%ds' % ITEM_WIDTH) % x for x in this_row) - line[type] += ' %s |' % li - for kv in line.items(): - print "%s:\n%s" % kv + print