# core/validators/figure.validator.ts

> 27 lines of code and 8 definitions.

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

Listed in [core/validators](https://banes-lab.com/api/source/build-scripts/core/validators.md), after [core/validators/element.validator.ts](https://banes-lab.com/source/build-scripts/core/validators/element.validator.ts.md) and before [core/validators/graph.validator.ts](https://banes-lab.com/source/build-scripts/core/validators/graph.validator.ts.md).

## Definitions

- `assertFiguresFilled` (lexical_declaration, line 27, exported)
- `bodyText` (lexical_declaration, line 9)
- `captionText` (lexical_declaration, line 17)
- `FIGURE_SELECTOR` (lexical_declaration, line 3)
- `CAPTION_SELECTOR` (lexical_declaration, line 5)
- `CAPTION_TAG` (lexical_declaration, line 7)
- `caption` (lexical_declaration, line 18)
- `parts` (lexical_declaration, line 19)

## Contained in

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

## Uses

- [configuration/strings/page.strings.ts](https://banes-lab.com/source/build-scripts/configuration/strings/page.strings.ts.md)

## Used by

- [core/loaders/site.loader.ts](https://banes-lab.com/source/build-scripts/core/loaders/site.loader.ts.md)

## Linked from

- [configuration/strings](https://banes-lab.com/anatomy/build-scripts/folder-build-scripts-configuration-strings.md)
- [core/loaders](https://banes-lab.com/anatomy/build-scripts/folder-build-scripts-core-loaders.md)
- [core/validators](https://banes-lab.com/anatomy/build-scripts/folder-build-scripts-core-validators.md)

## Source

```typescript
import { emptyFigure } from "#configuration/strings/page.strings";

const FIGURE_SELECTOR = "figure";

const CAPTION_SELECTOR = "figcaption";

const CAPTION_TAG = "FIGCAPTION";

const bodyText = function bodyText(figure: Element): string {
    return [...figure.children]
        .filter((child) => child.tagName !== CAPTION_TAG)
        .map((child) => child.textContent)
        .join("")
        .trim();
};

const captionText = function captionText(figure: Element): string {
    const caption = figure.querySelector(CAPTION_SELECTOR);
    const parts =
        caption === null ? [] : [...caption.querySelectorAll("*")].filter((part) => part.children.length === 0);
    return parts
        .map((part) => part.textContent.trim())
        .filter((part) => part.length > 0)
        .join(" ");
};

export const assertFiguresFilled = function assertFiguresFilled(content: Element, path: string): void {
    for (const figure of content.querySelectorAll(FIGURE_SELECTOR)) {
        if (bodyText(figure).length === 0) {
            throw new Error(emptyFigure(path, captionText(figure)));
        }
    }
};
```
