add dateFormat
[squeep-html-template-helper] / lib / template-helper.js
index c61958db9a31a67ae34b84dea72edfa6a4e125f0..7e1693c857758c127d1063d30804c6c5fab9b2e6 100644 (file)
@@ -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<head>
 \t\t<meta charset="utf-8">
 \t\t<meta name="viewport" content="width=device-width,initial-scale=1">
-\t\t<link rel="stylesheet" href="${rootPathPfx}static/theme.css">
-\t\t<link rel="stylesheet" href="${rootPathPfx}static/custom.css">
+\t\t<link rel="stylesheet" href="${rootPathPfx}static/theme.css" title="Default">
+\t\t<link rel="stylesheet" href="${rootPathPfx}static/custom.css" title="Site Specific">
 ${headElements.map((e) => '\t\t' + e).join('\n')}
 \t\t<title>${pageTitle}</title>
 \t</head>`;
@@ -315,6 +352,7 @@ function htmlPage(pagePathLevel, ctx, options, main = []) {
 
 module.exports = {
   dateOrNot,
+  dateFormat,
   secondsToPeriod,
   htmlHead,
   htmlBody,