diff --git a/generate.js b/generate.js index f4379f1..6b1f22b 100755 --- a/generate.js +++ b/generate.js @@ -4,11 +4,13 @@ const path = require('path'); const fs = require('fs'); const parseCsv = require('csv-parse/lib/sync'); const pug = require('pug'); +const {execSync} = require('child_process'); const publicDir = path.join(__dirname, 'public'); const templatesDir = path.join(__dirname, 'tmpl'); const dataDir = path.join(__dirname, 'data'); -const covidDataDir = path.resolve(path.join(__dirname, 'COVID-19', 'csse_covid_19_data')); +const covidGitDir = path.join(__dirname, 'COVID-19'); +const covidDataDir = path.join(covidGitDir, 'csse_covid_19_data'); const timeSeriesDir = path.join(covidDataDir, 'csse_covid_19_time_series'); const promiseMe = (fn) => { @@ -45,6 +47,18 @@ const confirmedUSCsv = path.join(timeSeriesDir, 'time_series_covid19_confirmed_U const populationStatesCsv = path.join(dataDir, 'SCPRC-EST2019-18+POP-RES.csv'); const populationCountriesCsv = path.join(dataDir, 'population-world-wikipedia.tsv'); +const lastGlobalDeathsUpdate = execSync(`git -C "${covidGitDir}" log -n 1 --pretty=format:'%ci' "${deathsGlobalCsv}"`, { + encoding: 'utf8', +}); +const lastUSDeathsUpdate = execSync(`git -C "${covidGitDir}" log -n 1 --pretty=format:'%ci' "${deathsUSCsv}"`, { + encoding: 'utf8', +}); + +const lastUpdate = new Date(lastGlobalDeathsUpdate > lastUSDeathsUpdate ? + lastGlobalDeathsUpdate : + lastUSDeathsUpdate +); + const zeroPad = value => value < 10 ? `0${value}` : value.toString(); const toSafeName = x => x.replace(/[^A-Za-z]/g, '-').toLowerCase(); @@ -519,7 +533,8 @@ const processGlobalDeaths = async () => { const worldTmpl = path.join(templatesDir, 'world.pug'); const worldHtml = pug.renderFile(worldTmpl, { data: worldData, - $title: 'The World' + $title: 'The World', + lastUpdate, }); const targetFile = path.join(publicDir, 'index.html'); @@ -529,31 +544,37 @@ const processGlobalDeaths = async () => { const singleCountryTmpl = path.join(templatesDir, 'country.pug'); const singleStateTmpl = path.join(templatesDir, 'state.pug'); + + const countryFn = pug.compileFile(singleCountryTmpl); + const stateFn = pug.compileFile(singleStateTmpl); + await Promise.all(countryArr.map(async (countryData) => { const start = Date.now(); const targetFile = path.join(publicDir, 'countries', countryData.safeName + '.html'); - const countryHtml = pug.renderFile(singleCountryTmpl, { + const countryHtml = countryFn({ data: countryData, $title: countryData.name, + lastUpdate, }); console.log(`writing to ${targetFile}`); await promiseMe(callback => fs.writeFile(targetFile, countryHtml, callback)); console.log(`wrote to ${targetFile} in ${Date.now() - start}ms`); if (countryData.states.length) { - for (const stateData of countryData.states) { + await Promise.all(countryData.states.map(async (stateData) => { if (!stateData.name || !stateData.counties || !stateData.counties.length) { - continue; + return; } const start = Date.now(); const targetFile = path.join(publicDir, 'countries', countryData.safeName + '-' + stateData.safeName + '.html'); - const stateHtml = pug.renderFile(singleStateTmpl, { + const stateHtml = stateFn({ data: stateData, $title: stateData.name + ' - ' + countryData.name, + lastUpdate, }); await promiseMe(callback => fs.writeFile(targetFile, stateHtml, callback)); console.log(`wrote to ${targetFile} in ${Date.now() - start}ms`); - } + })); } })); diff --git a/package.json b/package.json index 057abec..1b2bc3f 100644 --- a/package.json +++ b/package.json @@ -11,5 +11,8 @@ }, "devDependencies": { "serve": "11.3.0" + }, + "scripts": { + "start": "node_modules/.bin/serve -n -d -l 9999 public" } } diff --git a/tmpl/master.pug b/tmpl/master.pug index 8a98f2d..51909ea 100644 --- a/tmpl/master.pug +++ b/tmpl/master.pug @@ -146,13 +146,21 @@ html !{JSON.stringify(data.timeSeriesDaily.map(x => x.delta))}, ); - div.container - h1 Covid-19 Data - p.text-muted: em. - Data from #[a(href="https://github.com/CSSEGISandData/COVID-19") Johns Hopkins CSSE]. - This page generated from latest data as of #{new Date().toISOString()}. + div.container.mt-2 + h1.text-center Covid-19 Death Data + div.d-flex.justify-content-around.font-italic.small + div + - const generationDate = new Date().toISOString(); + | Data from #[a(href="https://github.com/CSSEGISandData/COVID-19") Johns Hopkins CSSE] + div + | Generated: #[time.generation-date(datetime=generationDate title=generationDate)= generationDate] + div + - const lastUpdateISO = lastUpdate.toISOString(); + | Data updated: #[time.update-date(datetime=lastUpdateISO title=lastUpdateISO)= lastUpdateISO] - div.main-content + hr + + div.main-content.mt-4 block main script. @@ -255,4 +263,12 @@ html }); handleHash(window.location.hash); + + const setDate = (selector) => { + const node = document.querySelector(selector); + node.textContent = new Date(node.getAttribute('datetime')).toLocaleString(); + }; + + setDate('.generation-date'); + setDate('.update-date'); }());