diff --git a/lib/templates.js b/lib/templates.js
index e1eb768a..a9ea166e 100644
--- a/lib/templates.js
+++ b/lib/templates.js
@@ -4,47 +4,6 @@ import handlebars from 'handlebars';
const dateFormatter = new Intl.DateTimeFormat('en-GB', { dateStyle: 'full', timeZone: 'UTC' });
-// A helper to turn a datetime into a human readable string.
-handlebars.registerHelper('humanDate', stamp => dateFormatter.format(new Date(stamp)));
-handlebars.registerHelper('humanDateTime', (stamp, timeZone) => {
- return new Intl.DateTimeFormat('en-GB', { dateStyle: 'full', timeStyle: 'long', timeZone }).format(new Date(stamp));
-});
-handlebars.registerHelper('navElement', function (url, name) {
- const escapedName = handlebars.escapeExpression(name);
-
- if (url === this.localUrl) { // eslint-disable-line no-invalid-this
- return escapedName;
- }
-
- const escapedUrl = handlebars.escapeExpression(url);
-
- return new handlebars.SafeString(`${escapedName}`);
-});
-handlebars.registerHelper('encodeUriComponent', encodeURIComponent);
-
-// A helper to turn a datetime into an ISO string (without milliseconds).
-handlebars.registerHelper('isoDate', datetime => new Date(datetime)
- .toISOString()
- .replace(/\.\d{3}Z/, 'Z')
-);
-
-handlebars.registerHelper('initialUpper', string => string[0].toUpperCase() + string.slice(1));
-
-const year = new Date().getUTCFullYear();
-
-handlebars.registerHelper('year', () => year);
-
-handlebars.registerHelper('hash', (field, chars) => {
- return createHash('sha256')
- .update(field)
- .digest('hex')
- .slice(0, chars);
-});
-
-handlebars.registerHelper('ifeq', function (a, b, { fn, inverse }) {
- return a === b ? fn(this) : inverse(this); // eslint-disable-line no-invalid-this
-});
-
function makePicker(list) {
let filtered = list;
@@ -58,9 +17,6 @@ function makePicker(list) {
};
}
-handlebars.registerHelper('lightEmoji', makePicker(['🌴', '☀️', '🕶', '🐬', '🦜', '🍉']));
-handlebars.registerHelper('darkEmoji', makePicker(['⭐️', '🌙', '🍹', '🌴', '🎷']));
-
async function getTemplateAndName(directory, filename) {
const source = await readFile(new URL(filename, directory), 'utf8');
const name = filename.slice(0, filename.lastIndexOf('.', filename.length - 12)); // trim off .ext.handlebars
@@ -68,8 +24,55 @@ async function getTemplateAndName(directory, filename) {
return [name, source.trim()];
}
-export default async function loadTemplates(dir, { baseTitle }) {
- handlebars.registerHelper('baseTitle', () => baseTitle);
+export default async function loadTemplates(dir, { baseTitle: title }) {
+ const fullYear = new Date().getUTCFullYear();
+ const bars = handlebars.create();
+
+ bars.registerHelper({
+ baseTitle() {
+ return title;
+ },
+ lightEmoji: makePicker(['🌴', '☀️', '🕶', '🐬', '🦜', '🍉']),
+ darkEmoji: makePicker(['⭐️', '🌙', '🍹', '🌴', '🎷']),
+ ifeq(a, b, { fn, inverse }) {
+ return a === b ? fn(this) : inverse(this); // eslint-disable-line no-invalid-this
+ },
+ hash(field, chars) {
+ return createHash('sha256')
+ .update(field)
+ .digest('hex')
+ .slice(0, chars);
+ },
+ year() {
+ return fullYear;
+ },
+ initialUpper(string) {
+ return string[0].toUpperCase() + string.slice(1);
+ },
+ isoDate(datetime) {
+ return new Date(datetime)
+ .toISOString()
+ .replace(/\.\d{3}Z/, 'Z');
+ },
+ encodeUriComponent: encodeURIComponent,
+ navElement(url, name) {
+ const escapedName = bars.escapeExpression(name);
+
+ if (url === this.localUrl) { // eslint-disable-line no-invalid-this
+ return escapedName;
+ }
+
+ const escapedUrl = bars.escapeExpression(url);
+
+ return new bars.SafeString(`${escapedName}`);
+ },
+ humanDateTime(stamp, timeZone) {
+ return new Intl.DateTimeFormat('en-GB', { dateStyle: 'full', timeStyle: 'long', timeZone }).format(new Date(stamp));
+ },
+ humanDate(stamp) {
+ return dateFormatter.format(new Date(stamp));
+ }
+ });
const partialsPath = new URL('partials/', dir);
const templatesPath = new URL('documents/', dir);
@@ -89,13 +92,13 @@ export default async function loadTemplates(dir, { baseTitle }) {
return Promise.all(partialFilenames.map(async n => {
const [name, source] = await getTemplateAndName(partialsPath, n);
- handlebars.registerPartial(name, source);
+ bars.registerPartial(name, source);
}));
})
]);
for (const [name, source] of documentsSources) {
- templates[name] = handlebars.compile(source);
+ templates[name] = bars.compile(source);
}
return templates;