# core/formatters/route.formatter.ts

> 16 lines of code and 7 definitions.

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

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

## Definitions

- `renderNumbers` (lexical_declaration, line 8, exported)
- `renderRoute` (lexical_declaration, line 12, exported)
- `SEPARATOR` (lexical_declaration, line 5)
- `ITEM` (lexical_declaration, line 6)
- `lines` (lexical_declaration, line 13, exported)
- `requires` (lexical_declaration, line 14, exported)
- `after` (lexical_declaration, line 15, exported)

## 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)

## Used by

- [core/converters/learning.catalog.converter.ts](https://banes-lab.com/source/build-scripts/core/converters/learning.catalog.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 { NumberRow, RouteRow } from "#types/catalog.types";
import { blocks, heading } from "#core/formatters/markdown.formatter";
import { linkText } from "#core/formatters/link.formatter";

const SEPARATOR = ", ";
const ITEM = "- ";

export const renderNumbers = function renderNumbers(title: string, rows: readonly NumberRow[]): string {
    return blocks([heading(title), rows.map((row) => `${ITEM}${row.number} ${linkText(row.link)}`).join("\n")]);
};

export const renderRoute = function renderRoute(title: string, rows: readonly RouteRow[]): string {
    const lines = rows.map((row) => {
        const requires = row.requires.filter((at): at is number => at !== null);
        const after = requires.length === 0 ? "" : `, after stop ${requires.map(String).join(SEPARATOR)}`;
        return `${String(row.position)}. ${linkText(row.link)} (${row.block}${after})`;
    });
    return blocks([heading(title), lines.join("\n")]);
};
```
