1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
from urllib import parse
import util
import ptv_client
def format_stop_and_route_name_li(stop_and_route):
stop, route = stop_and_route
return '<li>Stop: {}, Route: {} {} {}</li>'.format(
stop['stop_name'], ptv_client.get_route_type(route['route_type']),
route['route_number'], route['route_name'])
def format_stop_and_route_name_ol(stop_and_routes):
return '<ol>{}</ol>'.format(''.join(
map(format_stop_and_route_name_li, stop_and_routes)))
def format_stop_and_route_name_tr(stop_and_route):
stop, route = stop_and_route
return """
<tr>
<td>
<a href="/?route-type={}&stop={}&route={}&stop-name={}&route-number={}">
{}
</a>
</td>
<td>{}</td><td>{}</td><td>{}</td>
</tr>
""".format(route['route_type'], stop['stop_id'], route['route_id'],
parse.quote(stop['stop_name']), parse.quote(route['route_number']),
stop['stop_name'], ptv_client.get_route_type(route['route_type']),
route['route_number'], route['route_name'])
def format_stop_and_route_name_table(stop_and_routes):
return """
<table>
<tr>
<th>Stop</th>
<th>Route type</th>
<th>Route number</th>
<th>Route name</th>
</tr>
{}
</table>
""".format(''.join(map(format_stop_and_route_name_tr, stop_and_routes)))
def format_departure_title(stop_name, route_type, route_number):
return 'Departures of {} {} at {}'.format(
ptv_client.get_route_type(route_type), route_number, stop_name)
def format_departure_tr(departure, direction_names):
return """
<tr>
<td>{}</td><td>{}</td><td>{}</td>
</tr>
""".format(
util.format_time(util.parse_time(
departure['estimated_departure_utc'])),
util.format_time(util.parse_time(
departure['scheduled_departure_utc'])),
direction_names[departure['direction_id']])
def format_departure_table(departures, direction_names):
return """
<table>
<tr>
<th>Estimated</th>
<th>Scheduled</th>
<th>Direction</th>
</tr>
{}
</table>
""".format(''.join(
format_departure_tr(dep, direction_names) for dep in departures))
def style():
return """
<style>
tr:nth-child(even) {background-color: #f2f2f2;}
tr:hover {background-color: coral;}
</style>
"""
def html(title: str, body):
return """
<!DOCTYPE html>
<html>
<head>
<title>%(title)s</title>
%(style)s
</head>
<body>
<h2>%(title)s</h2>
%(body)s
</body>
</html>
""" % {
'title': title,
'style': style(),
'body': body
}
def landing_page():
title = 'PTV timetable search tool'
body = """
<form method="get" action="">
<p>
Query: <input type="text" name="q" value="">
</p>
<p>
<input type="submit" value="Submit">
</p>
</form>
"""
return html(title, body)
|