# core/formatters/document.formatter.ts

> 18 lines of code and 9 definitions.

Tree: GovLab Docs
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/docs#file-docs-core-formatters-document-formatter-ts
Source text: https://banes-lab.com/source/docs/core/formatters/document.formatter.ts.txt

Listed in [core/formatters](https://banes-lab.com/api/source/docs/core/formatters.md), after [core/formatters/diagram.structure.formatter.ts](https://banes-lab.com/source/docs/core/formatters/diagram.structure.formatter.ts.md) and before [core/formatters/figure.formatter.ts](https://banes-lab.com/source/docs/core/formatters/figure.formatter.ts.md).

## Definitions

- `isLead` (lexical_declaration, line 5)
- `frontmatterLines` (lexical_declaration, line 9)
- `concern` (lexical_declaration, line 10)
- `status` (lexical_declaration, line 11)
- `renderDeclaredDoc` (lexical_declaration, line 15, exported)
- `heading` (lexical_declaration, line 16, exported)
- `lead` (lexical_declaration, line 17, exported)
- `sections` (lexical_declaration, line 18, exported)
- `frontmatter` (lexical_declaration, line 19, exported)

## Contained in

- [core/formatters](https://banes-lab.com/anatomy/docs/folder-docs-core-formatters.md)

## Source

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