X-Git-Url: http://git.squeep.com/?p=squeep-html-template-helper;a=blobdiff_plain;f=lib%2Ftemplate-helper.js;h=7e1693c857758c127d1063d30804c6c5fab9b2e6;hp=c61958db9a31a67ae34b84dea72edfa6a4e125f0;hb=2a4abfad091846a4fa528b44a31962c5150e6b0a;hpb=f8d8a0142eaf713a9258c4f5738cdcb6b6e5c7bd diff --git a/lib/template-helper.js b/lib/template-helper.js index c61958d..7e1693c 100644 --- a/lib/template-helper.js +++ b/lib/template-helper.js @@ -4,6 +4,8 @@ * A bunch of shorthand to put together common parts of an HTML page. */ +const { lazy } = require('@squeep/lazy'); + /** * Some fields may have values outside normal dates, handle them here. * @param {Date} date @@ -25,6 +27,41 @@ const dateOrNot = (date, otherwise) => { }; +/** + * Why is rendering a Date as a string this complicated? + * @param {Date|Number} date + * @param {String=} pInf + * @param {String=} nInf + * @param {String=} otherwise + */ +const dateFormat = (date, pInf = 'Never', nInf = 'Forever', otherwise = '') => { + const isDatableType = ['number', 'string'].includes(typeof date); + switch (date) { + case Infinity: + return pInf; + case -Infinity: + return nInf; + default: + if (!date + || (!(date instanceof Date) && !isDatableType)) { + return otherwise; + } + } + if (isDatableType) { + date = new Date(date); + } + const parts = dateFormat._dtf.formatToParts(date); + return parts.map((p) => p.value).join(''); +}; +lazy(dateFormat, '_dtf', () => { + const dateTimeFormatOptions = { + dateStyle: 'medium', + timeStyle: 'long', + }; + return new Intl.DateTimeFormat(undefined, dateTimeFormatOptions); +}); + + /** * Render a duration. * @param {Number} seconds @@ -71,8 +108,8 @@ function htmlHead(pagePathLevel, ctx, options) { return `\t \t\t \t\t -\t\t -\t\t +\t\t +\t\t ${headElements.map((e) => '\t\t' + e).join('\n')} \t\t${pageTitle} \t`; @@ -315,6 +352,7 @@ function htmlPage(pagePathLevel, ctx, options, main = []) { module.exports = { dateOrNot, + dateFormat, secondsToPeriod, htmlHead, htmlBody,