@@ -3,12 +3,39 @@ const beautify = require('js-beautify').html_beautify;
3
3
const gtfs = require ( 'gtfs' ) ;
4
4
const pug = require ( 'pug' ) ;
5
5
const moment = require ( 'moment' ) ;
6
- const sanitize = require ( 'sanitize-filename' ) ;
7
6
8
7
const fileUtils = require ( './file-utils' ) ;
9
8
const formatters = require ( './formatters' ) ;
10
9
const geoJSONUtils = require ( './geojson-utils' ) ;
11
10
11
+ const getTimetableColors = async timetablePage => {
12
+ const routes = await gtfs . getRoutes ( {
13
+ agency_key : timetablePage . agency_key ,
14
+ route_id : { $in : timetablePage . routeIds }
15
+ } ) ;
16
+ return _ . compact ( _ . uniq ( _ . map ( routes , 'route_color' ) ) ) ;
17
+ } ;
18
+
19
+ function getDaysFromCalendars ( calendars ) {
20
+ const days = {
21
+ monday : 0 ,
22
+ tuesday : 0 ,
23
+ wednesday : 0 ,
24
+ thursday : 0 ,
25
+ friday : 0 ,
26
+ saturday : 0 ,
27
+ sunday : 0
28
+ } ;
29
+
30
+ for ( const calendar of calendars ) {
31
+ _ . each ( days , ( value , day ) => {
32
+ days [ day ] = value | calendar [ day ] ;
33
+ } ) ;
34
+ }
35
+
36
+ return days ;
37
+ }
38
+
12
39
function filterAndSortCalendarDates ( calendarDates , startDate , endDate ) {
13
40
if ( ! calendarDates ) {
14
41
return [ ] ;
@@ -188,7 +215,59 @@ const processStops = async timetable => {
188
215
}
189
216
} ;
190
217
191
- const generateFileName = async timetable => {
218
+ const formatTimetable = async timetable => {
219
+ if ( ! timetable . timetable_label ) {
220
+ const routes = await gtfs . getRoutes ( {
221
+ agency_key : timetable . agency_key ,
222
+ route_id : timetable . route_id
223
+ } ) ;
224
+ if ( ! routes || routes . length === 0 ) {
225
+ throw new Error ( `No route found for route_id=${ timetable . route_id } , timetable_id=${ timetable . timetable_id } ` ) ;
226
+ }
227
+ let direction ;
228
+ if ( timetable . direction_id !== null && timetable . direction_id !== '' ) {
229
+ const directions = await gtfs . getDirectionsByRoute ( {
230
+ agency_key : timetable . agency_key ,
231
+ route_id : timetable . route_id ,
232
+ direction_id : timetable . direction_id
233
+ } ) ;
234
+ direction = _ . first ( directions ) ;
235
+ }
236
+ timetable . timetable_label = formatters . formatTimetableLabel ( routes [ 0 ] , direction ) ;
237
+ }
238
+ return timetable ;
239
+ } ;
240
+
241
+ const formatTimetablePage = async timetablePage => {
242
+ // If timetable_page_label not set, use first route to name it
243
+ if ( timetablePage . timetable_page_label === '' || timetablePage . timetable_page_label === undefined ) {
244
+ const routes = await gtfs . getRoutes ( {
245
+ agency_key : timetablePage . agency_key ,
246
+ route_id : timetablePage . timetables [ 0 ] . route_id
247
+ } ) ;
248
+
249
+ if ( routes . length === 0 ) {
250
+ throw new Error ( `No route found for route_id=${ timetablePage . timetables [ 0 ] . route_id } , timetable_id=${ timetablePage . timetables [ 0 ] . timetable_id } ` ) ;
251
+ }
252
+ const route = routes [ 0 ] ;
253
+
254
+ timetablePage . timetable_page_label = formatters . formatTimetableLabel ( route ) ;
255
+ }
256
+
257
+ // Format each timetable in timetable_page
258
+ timetablePage . timetables = await Promise . all ( timetablePage . timetables . map ( timetable => formatTimetable ( timetable ) ) ) ;
259
+
260
+ // Summarize timetables in timetablePage
261
+ timetablePage . dayList = formatters . formatDays ( getDaysFromCalendars ( timetablePage . timetables ) ) ;
262
+ timetablePage . dayLists = _ . uniq ( timetablePage . timetables . map ( timetable => timetable . dayList ) ) ;
263
+ timetablePage . routeIds = _ . uniq ( _ . map ( timetablePage . timetables , 'route_id' ) ) ;
264
+ timetablePage . routeColors = await getTimetableColors ( timetablePage ) ;
265
+ timetablePage . directionNames = _ . uniq ( timetablePage . timetables . map ( timetable => timetable . direction_name ) ) ;
266
+
267
+ return timetablePage ;
268
+ } ;
269
+
270
+ const convertTimetableToTimetablePage = async timetable => {
192
271
const routes = await gtfs . getRoutes ( {
193
272
agency_key : timetable . agency_key ,
194
273
route_id : timetable . route_id
@@ -199,25 +278,13 @@ const generateFileName = async timetable => {
199
278
}
200
279
201
280
const route = routes [ 0 ] ;
202
- const routeName = formatters . formatRouteName ( route ) ;
203
- let filename = `${ timetable . timetable_id } _${ routeName } _` ;
204
-
205
- if ( timetable . direction_id !== '' && timetable . direction_id !== null ) {
206
- filename += `${ timetable . direction_id } _` ;
207
- }
208
-
209
- filename += `${ formatters . formatDays ( timetable ) . toLowerCase ( ) } .html` ;
210
-
211
- return sanitize ( filename ) . replace ( / \s / g, '' ) ;
212
- } ;
213
-
214
- const convertTimetableToTimetablePage = async timetable => {
215
- const filename = await generateFileName ( timetable ) ;
281
+ const filename = await fileUtils . generateFileName ( timetable , route ) ;
282
+ const formattedTimetable = await formatTimetable ( timetable ) ;
216
283
return {
217
- agency_key : timetable . agency_key ,
218
- timetable_page_id : timetable . timetable_id ,
219
- timetable_page_label : timetable . timetable_label ,
220
- timetables : [ timetable ] ,
284
+ agency_key : formattedTimetable . agency_key ,
285
+ timetable_page_id : formattedTimetable . timetable_id ,
286
+ timetable_page_label : formattedTimetable . timetable_label ,
287
+ timetables : [ formattedTimetable ] ,
221
288
filename
222
289
} ;
223
290
} ;
@@ -260,11 +327,11 @@ const convertRouteToTimetablePage = async (route, direction) => {
260
327
const convertRoutesToTimetablePages = async agencyKey => {
261
328
const routes = await gtfs . getRoutes ( { agency_key : agencyKey } ) ;
262
329
const timetablePages = await Promise . all ( routes . map ( async route => {
263
- const results = await gtfs . getDirectionsByRoute ( {
330
+ const directions = await gtfs . getDirectionsByRoute ( {
264
331
agency_key : agencyKey ,
265
332
route_id : route . route_id
266
333
} ) ;
267
- const directionGroups = _ . groupBy ( results , direction => direction . direction_id ) ;
334
+ const directionGroups = _ . groupBy ( directions , direction => direction . direction_id ) ;
268
335
return Promise . all ( _ . map ( directionGroups , directionGroup => {
269
336
const direction = directionGroup [ 0 ] ;
270
337
return convertRouteToTimetablePage ( route , direction ) ;
@@ -310,60 +377,6 @@ function getStops(timetableStopOrders, stoptimes) {
310
377
return stops ;
311
378
}
312
379
313
- const getTimetableColors = async timetablePage => {
314
- const routes = await gtfs . getRoutes ( {
315
- agency_key : timetablePage . agency_key ,
316
- route_id : { $in : timetablePage . routeIds }
317
- } ) ;
318
- return _ . compact ( _ . uniq ( _ . map ( routes , 'route_color' ) ) ) ;
319
- } ;
320
-
321
- const formatTimetablePage = async timetablePage => {
322
- // If timetable_page_label not set, use first route to name it
323
- if ( timetablePage . timetable_page_label === '' || timetablePage . timetable_page_label === undefined ) {
324
- const routes = await gtfs . getRoutes ( {
325
- agency_key : timetablePage . agency_key ,
326
- route_id : timetablePage . timetables [ 0 ] . route_id
327
- } ) ;
328
-
329
- if ( routes . length === 0 ) {
330
- throw new Error ( `No route found for route_id=${ timetablePage . timetables [ 0 ] . route_id } , timetable_id=${ timetablePage . timetables [ 0 ] . timetable_id } ` ) ;
331
- }
332
- const route = routes [ 0 ] ;
333
-
334
- timetablePage . timetable_page_label = `${ route . route_short_name } ${ route . route_long_name } ` ;
335
- }
336
-
337
- // Summarize timetables in timetablePage
338
- timetablePage . dayList = formatters . formatDays ( getDaysFromCalendars ( timetablePage . timetables ) ) ;
339
- timetablePage . dayLists = _ . uniq ( timetablePage . timetables . map ( timetable => timetable . dayList ) ) ;
340
- timetablePage . routeIds = _ . uniq ( _ . map ( timetablePage . timetables , 'route_id' ) ) ;
341
- timetablePage . routeColors = await getTimetableColors ( timetablePage ) ;
342
- timetablePage . directionNames = _ . uniq ( timetablePage . timetables . map ( timetable => timetable . direction_name ) ) ;
343
-
344
- return timetablePage ;
345
- } ;
346
-
347
- function getDaysFromCalendars ( calendars ) {
348
- const days = {
349
- monday : 0 ,
350
- tuesday : 0 ,
351
- wednesday : 0 ,
352
- thursday : 0 ,
353
- friday : 0 ,
354
- saturday : 0 ,
355
- sunday : 0
356
- } ;
357
-
358
- for ( calendar of calendars ) {
359
- _ . each ( days , ( value , day ) => {
360
- days [ day ] = value | calendar [ day ] ;
361
- } ) ;
362
- }
363
-
364
- return days ;
365
- }
366
-
367
380
exports . setDefaultConfig = config => {
368
381
const defaults = {
369
382
beautify : false ,
@@ -672,9 +685,7 @@ exports.getTimetablePages = async agencyKey => {
672
685
} ) ;
673
686
}
674
687
675
- return Promise . all ( timetablePages . map ( timetablePage => {
676
- return formatTimetablePage ( timetablePage ) ;
677
- } ) ) ;
688
+ return Promise . all ( timetablePages . map ( timetablePage => formatTimetablePage ( timetablePage ) ) ) ;
678
689
} ;
679
690
680
691
exports . log = config => {
0 commit comments