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
|
import { Mode, type StopTime } from './motis-types';
import { m } from './paraglide/messages';
export const getPictogram = (mode: Mode) => {
switch (true) {
case mode === Mode.Bike:
return 'Velo_l';
case mode === Mode.ODM:
case mode === Mode.Rental:
return 'Taxi_l';
case mode === Mode.Car:
case mode === Mode.CarDropoff:
case mode === Mode.CarParking:
return 'Auto_l';
// Transit //
case mode === Mode.Airplane:
return 'Abflug_l';
case mode === Mode.LongDistanceRail:
case mode === Mode.RegionalFastRail:
case mode === Mode.RegionalRail:
case mode === Mode.Metro:
case mode === Mode.HighspeedRail:
return 'Zug_l';
case mode === Mode.NightRail:
return 'Schlafwagen';
case mode === Mode.Subway:
return 'Metro_l_' + (m.lang_short() === 'en' ? 'de' : m.lang_short());
case mode === Mode.Bus:
return 'Bus_l';
case mode === Mode.Coach:
return 'Fernbus_l';
case mode === Mode.Tram:
case mode === Mode.CableTram:
return 'Tram_l';
case mode === Mode.Funicular:
return 'Zahnradbahn_l';
case mode === Mode.AerialLift:
// return 'Gondelbahn_l';
return 'Luftseilbahn_l';
case mode === Mode.Ferry:
return 'Schiff_l';
case mode === Mode.Other:
default:
return 'Licht';
}
};
export const stopTimeToShortName = (stopTime: StopTime) => {
let n = stopTime.routeShortName;
if (n.startsWith('EC ')) n = n.replace('EC ', 'EC');
if (stopTime.mode === 'TRAM' && !isNaN(parseInt(n))) n = 'T ' + n;
if (stopTime.mode === 'BUS' && !isNaN(parseInt(n))) n = 'B ' + n;
if (
stopTime.routeShortName === 'European Sleeper' &&
stopTime.agencyName === 'Eu Sleeper'
)
n = 'EN'; // TODO: validate these are real euronights
if (n === '?') n = '';
if (n.startsWith('FlixTrain ')) n = n.substring(10);
// Note: may also catch ECs/ICs/EXTs operated by DB
if (
stopTime.agencyId === '12681' &&
stopTime.agencyName === 'DB Fernverkehr AG' &&
stopTime.mode === 'HIGHSPEED_RAIL' &&
stopTime.source.startsWith('de_DELFI.gtfs.zip/') &&
!isNaN(parseInt(n))
)
n = `ICE ${n}`;
return n;
};
export const stopTimeShouldRenderGlyph = (
stopTime: StopTime,
routeShortName: string
) =>
([
Mode.NightRail,
Mode.HighspeedRail,
Mode.LongDistanceRail,
Mode.RegionalFastRail,
Mode.RegionalRail,
].includes(stopTime.mode) ||
(stopTime.mode === 'BUS' && routeShortName.startsWith('EV')) ||
(stopTime.mode === 'METRO' && stopTime.routeShortName.startsWith('S'))) &&
!stopTime.routeShortName.startsWith('FlixTrain');
export const blacklistedAgencyURLs = ['http://www.rta.ae'];
export const getNotices = (
stopTime: StopTime,
delayMinutes: number,
isArrivals: boolean
) => {
let notices = [] as [pictogram: string[], content: string][];
if (stopTime.cancelled)
notices.push([['Cancellation', 'Attention'], m.connection_cancelled()]);
if (delayMinutes < -0.5) {
notices.push([
['Hint'],
m.connection_early({
minutes: -delayMinutes,
arrival: isArrivals.toString(),
}),
]);
} else if (delayMinutes >= 1) {
notices.push([
delayMinutes >= 3
? ['Delay', 'Attention']
: delayMinutes >= 2
? ['Delay', 'Hint']
: ['Hint'],
m.connection_delayed({
minutes: delayMinutes.toFixed(0),
}),
]);
}
return notices;
};
|