# core/formatters/section.formatter.ts

> 53 lines of code and 4 definitions.

Tree: Bane's Lab Build Scripts
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/build-scripts#file-build-scripts-core-formatters-section-formatter-ts
Source text: https://banes-lab.com/source/build-scripts/core/formatters/section.formatter.ts.txt

Listed in [core/formatters](https://banes-lab.com/api/source/build-scripts/core/formatters.md), after [core/formatters/search.formatter.ts](https://banes-lab.com/source/build-scripts/core/formatters/search.formatter.ts.md) and before [core/formatters/server.formatter.ts](https://banes-lab.com/source/build-scripts/core/formatters/server.formatter.ts.md).

## Definitions

- `renderSectionPart` (lexical_declaration, line 22, exported)
- `routeLines` (lexical_declaration, line 6)
- `renderSectionLeaf` (lexical_declaration, line 38, exported)
- `steps` (lexical_declaration, line 10)

## Contained in

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

## Uses

- [core/formatters/link.formatter.ts](https://banes-lab.com/source/build-scripts/core/formatters/link.formatter.ts.md)
- [core/formatters/markdown.formatter.ts](https://banes-lab.com/source/build-scripts/core/formatters/markdown.formatter.ts.md)

## Used by

- [core/converters/section.segment.converter.ts](https://banes-lab.com/source/build-scripts/core/converters/section.segment.converter.ts.md)

## Linked from

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

## Source

```typescript
import type { SectionData, SectionRoute } from "#types/section.types";
import { addressLines, blocks, heading, quote, section } from "#core/formatters/markdown.formatter";
import { linkList, linkText, placementLine, relationSections } from "#core/formatters/link.formatter";
import { routeStopSentence } from "@banes-lab/web/strings/catalog.strings";

const routeLines = function routeLines(route: SectionRoute | null): string | null {
    if (route === null) {
        return null;
    }
    const steps = [
        routeStopSentence(
            route.position,
            route.total,
            route.previous === null ? null : linkText(route.previous),
            route.next === null ? null : linkText(route.next),
        ),
        route.requires.length === 0 ? null : `It builds on ${linkList(route.requires)}.`,
    ];
    return steps.filter((step): step is string => step !== null).join(" ");
};

export const renderSectionPart = function renderSectionPart(
    title: string,
    json: string,
    whole: string,
    subsections: readonly string[],
): string {
    return blocks([
        heading(title),
        addressLines([
            ["Whole section", whole],
            ["This part as JSON", json],
        ]),
        section("Subsections", subsections),
    ]);
};

export const renderSectionLeaf = function renderSectionLeaf(
    data: SectionData,
    pageLabel: string,
    tabLabel: string,
    body: string,
): string {
    return blocks([
        heading(data.title),
        quote(data.summary),
        addressLines([
            ["Page", pageLabel === tabLabel ? pageLabel : `${pageLabel} · ${tabLabel}`],
            ["Canonical", data.href],
        ]),
        routeLines(data.route),
        placementLine(data),
        body,
        ...relationSections(data.relations),
    ]);
};
```
