#!/usr/bin/env python # -*- coding: utf-8 -*- from gotovienna import argparse from gotovienna.utils import * from gotovienna.realtime import * from datetime import time parser = argparse.ArgumentParser(description='Get realtime public transport information for Vienna') 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() 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: 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) print