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`;
};