aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/RenderUtil.ts
blob: bf360ab73d34bd80437f541905e8693c86346a02 (plain) (blame)
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;
};