Advertisement
Guest User

Untitled

a guest
Aug 5th, 2019
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const path = require('path');
  2.  
  3. const _ = require('lodash');
  4. const fs = require('fs-extra');
  5. const gtfs = require('gtfs');
  6. const sanitize = require('sanitize-filename');
  7. const ProgressBar = require('progress');
  8. const Table = require('cli-table');
  9. const Timer = require('timer-machine');
  10.  
  11. const fileUtils = require('./file-utils');
  12. const logUtils = require('./log-utils');
  13. const utils = require('./utils');
  14.  
  15. /*
  16.  * Generate HTML timetables from GTFS.
  17.  */
  18. module.exports = initialConfig => {
  19.   const config = utils.setDefaultConfig(initialConfig);
  20.   const log = logUtils.log(config);
  21.  
  22.   if (!config.agencies || config.agencies.length === 0) {
  23.     throw new Error('No agencies defined in `config.json`');
  24.   }
  25.  
  26.   return Promise.all(config.agencies.map(async agency => {
  27.     const timer = new Timer();
  28.     const agencyKey = agency.agency_key;
  29.     const exportPath = path.join('html', sanitize(agencyKey));
  30.     const outputStats = {
  31.       timetables: 0,
  32.       timetablePages: 0,
  33.       calendars: 0,
  34.       trips: 0,
  35.       routes: 0,
  36.       stops: 0
  37.     };
  38.  
  39.     timer.start();
  40.  
  41.     if (!config.skipImport) {
  42.       // Import GTFS
  43.       const agencyConfig = _.clone(_.omit(config, 'agencies'));
  44.       agencyConfig.agencies = [agency];
  45.  
  46.       await gtfs.import(agencyConfig);
  47.     }
  48.  
  49.     const timetablePages = [];
  50.     const timetablePageIds = _.map(await utils.getTimetablePages(agencyKey, config), 'timetable_page_id');
  51.     await fileUtils.prepDirectory(exportPath);
  52.  
  53.     const bar = new ProgressBar(`${agencyKey}: Generating HTML timetables [:bar] :current/:total`, {total: timetablePageIds.length});
  54.     bar.render();
  55.  
  56.     /* eslint-disable no-await-in-loop */
  57.     for (const timetablePageId of timetablePageIds) {
  58.       const timetablePage = await utils.getFormattedTimetablePage(agencyKey, timetablePageId, config);
  59.  
  60.       if (timetablePage.timetables.length === 0) {
  61.         bar.interrupt(logUtils.formatWarn(`${agencyKey}: No timetables found for timetable_page_id=${timetablePage.timetable_page_id}`));
  62.         continue;
  63.       }
  64.  
  65.       outputStats.timetables += timetablePage.timetables.length;
  66.       outputStats.timetablePages += 1;
  67.  
  68.       const datePath = fileUtils.generateFolderName(timetablePage);
  69.  
  70.       // Make directory if it doesn't exist
  71.       await fs.ensureDir(path.join(exportPath, datePath));
  72.       config.assetPath = '../';
  73.  
  74.       timetablePage.relativePath = path.join(datePath, sanitize(timetablePage.filename));
  75.  
  76.       const results = await utils.generateHTML(timetablePage, config);
  77.  
  78.       _.each(outputStats, (stat, key) => {
  79.         if (results.stats[key]) {
  80.           outputStats[key] += results.stats[key];
  81.         }
  82.       });
  83.  
  84.       await fs.writeFile(path.join(exportPath, datePath, sanitize(timetablePage.filename)), results.html);
  85.       bar.tick();
  86.       timetablePages.push(timetablePage);
  87.     }
  88.     /* eslint-enable no-await-in-loop */
  89.  
  90.     // Generate route summary index.html
  91.     config.assetPath = '';
  92.     const html = await utils.generateOverviewHTML(agencyKey, timetablePages, config);
  93.     await fs.writeFile(path.join(exportPath, 'index.html'), html);
  94.  
  95.     // Generate output log.txt
  96.     const logText = await logUtils.generateLogText(agency, outputStats, config);
  97.     await fs.writeFile(path.join(exportPath, 'log.txt'), logText);
  98.  
  99.     // Zip output, if specified
  100.     if (config.zipOutput) {
  101.       await fileUtils.zipFolder(exportPath);
  102.     }
  103.  
  104.     // Print stats
  105.     let fullExportPath = `${process.cwd()}/${exportPath}`;
  106.     if (config.zipOutput) {
  107.       fullExportPath += '/timetables.zip';
  108.     }
  109.  
  110.     log(`${agencyKey}: HTML timetables created at ${fullExportPath}`);
  111.  
  112.     timer.stop();
  113.  
  114.     const table = new Table({
  115.       colWidths: [40, 20],
  116.       head: ['Item', 'Count']
  117.     });
  118.  
  119.     table.push(
  120.       ['Timetable Pages', outputStats.timetablePages],
  121.       ['Timetables', outputStats.timetables],
  122.       ['Calendar Service IDs', outputStats.calendars],
  123.       ['Routes', outputStats.routes],
  124.       ['Trips', outputStats.trips],
  125.       ['Stops', outputStats.stops]
  126.     );
  127.  
  128.     log(table.toString());
  129.     const seconds = Math.round(timer.time() / 1000);
  130.     log(`${agencyKey}: HTML timetable generation required ${seconds} seconds`);
  131.   }));
  132. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement