core/formatters/link.formatter.ts

core/formatters/link.formatter.ts is a file in Bane's Lab Build Scripts. 33 lines of code and 10 definitions.

import type { Link, Placed, Relation } from "#types/catalog.types";
import { listedInSentence } from "@banes-lab/web/strings/catalog.strings";
import { relationLabelOf } from "@banes-lab/web/strings/reference.strings";
import { section } from "#core/formatters/markdown.formatter";

const SEPARATOR = ", ";

export const linkText = function linkText(link: Link): string {
    const target = link.markdown ?? link.json ?? link.href;
    return target === null ? link.label : `[${link.label}](${target})`;
};

export const linkList = function linkList(links: readonly Link[]): string {
    return links.map(linkText).join(SEPARATOR);
};

export const linkSection = function linkSection(title: string, links: readonly Link[]): string | null {
    return section(title, links.map(linkText));
};

const headingOf = function headingOf(relation: string): string {
    const label = relationLabelOf(relation);
    return label.charAt(0).toUpperCase() + label.slice(1);
};

export const relationSections = function relationSections(relations: readonly Relation[]): readonly (string | null)[] {
    return relations.map((relation) => linkSection(headingOf(relation.relation), relation.links));
};

export const placementLine = function placementLine(placed: Placed): string | null {
    if (placed.up === null) {
        return null;
    }
    const { next, previous } = placed.siblings ?? { next: null, previous: null };
    return listedInSentence(
        linkText(placed.up),
        previous === null ? null : linkText(previous),
        next === null ? null : linkText(next),
    );
};