core/formatters/document.formatter.ts

core/formatters/document.formatter.ts is a file in GovLab Docs. 18 lines of code and 9 definitions.

import { renderRenderable, titleCase } from "#core/formatters/markdown.formatter";
import type { DocumentDecl } from "#types/document.types";
import { FRONTMATTER_FENCE } from "#configuration/constants/document.constants";

const isLead = function isLead(lead: DocumentDecl["lead"]): boolean {
    return typeof lead === "string" || Array.isArray(lead);
};

const frontmatterLines = function frontmatterLines(doc: DocumentDecl): string[] {
    const concern = typeof doc.concern === "string" && doc.concern.length > 0 ? [`concern: ${doc.concern}`] : [];
    const status = typeof doc.status === "string" && doc.status.length > 0 ? [`status: ${doc.status}`] : [];
    return [`type: ${doc.type}`, `name: ${doc.name}`, `summary: ${doc.summary}`, ...concern, ...status];
};

export const renderDeclaredDoc = function renderDeclaredDoc(doc: DocumentDecl): string {
    const heading = doc.title ?? titleCase(doc.name);
    const lead = isLead(doc.lead) ? `${renderRenderable(doc.lead)}\n\n` : "";
    const sections = doc.body.map((entry) => `## ${entry.heading}\n\n${renderRenderable(entry.content)}`).join("\n\n");
    const frontmatter = [FRONTMATTER_FENCE, ...frontmatterLines(doc), FRONTMATTER_FENCE].join("\n");
    return `${frontmatter}\n\n# ${heading}\n\n${lead}${sections}\n`;
};