Newer
Older
express-blog / src / middleware / hbs.js
// src/middleware/hbs.js
const path = require("path");
const exphbs = require("express-handlebars");
const Handlebars = require("handlebars");

const { registerHelpers } = require("../utils/hbsHelpers");
const {
  VIEW_ENGINE,
  LAYOUTS_DIR,
  PARTIALS_DIR,
  DEFAULT_LAYOUT,
  EXTENSION,
  RUNTIME_OPTIONS,
} = require("../constants/hbsConstants");
// const renderObject = (obj) => {
//   if (typeof obj !== "object" || obj === null) {
//     return new Handlebars.SafeString(`<span>${String(obj)}</span>`);
//   }

//   if (Array.isArray(obj)) {
//     const items = obj
//       .map((item) => `<li>${Handlebars.escapeExpression(String(item))}</li>`)
//       .join("");
//     return new Handlebars.SafeString(`<ul>${items}</ul>`);
//   }

//   const entries = Object.entries(obj)
//     .map(([key, value]) => {
//       const renderedValue = renderObject(value);
//       return `<div class="doc-entry"><strong>${Handlebars.escapeExpression(key)}:</strong> ${renderedValue}</div>`;
//     })
//     .join("");
//   return new Handlebars.SafeString(`<div class="doc-object">${entries}</div>`);
// };

const hbsMiddleware = (req, res, next) => {
  if (!req.app.get("view engine")) {
    const hbs = exphbs.create({
      layoutsDir: path.join(__dirname, LAYOUTS_DIR),
      partialsDir: path.join(__dirname, PARTIALS_DIR),
      defaultLayout: DEFAULT_LAYOUT,
      helpers: {
        section(name, options) {
          this._sections ??= {};
          this._sections[name] ??= "";
          this._sections[name] += options.fn(this);
          return null;
        },
        json(context) {
          return JSON.stringify(context, null, 2);
        },
        // helperMissing(context, options) {
        //   var options = arguments[arguments.length - 1];
        //   var args = Array.prototype.slice.call(
        //     arguments,
        //     0,
        //     arguments.length - 1
        //   );
        //   return new Handlebars.SafeString(
        //     "Missing: " + options.name + "(" + args + ")"
        //   );
        // },
        // blockHelperMissing(context, options) {
        //   return (
        //     "Helper '" +
        //     options.name +
        //     "' not found. Printing block: " +
        //     options.fn(context)
        //   );
        // },
        // renderObject,
      },
      extname: EXTENSION,
      runtimeOptions: RUNTIME_OPTIONS,
    });

    registerHelpers(hbs);
    req.app.engine(VIEW_ENGINE, hbs.engine);
    req.app.set("view engine", VIEW_ENGINE);
    req.app.set("views", [
      path.join(__dirname, "../views"),
      path.join(__dirname, "../../content/docs/hexascript"),
    ]);
  }

  next();
};

module.exports = hbsMiddleware;