# core/assets/link.assets.ts

> 72 lines of code and 42 definitions.

Tree: Site tree
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/tree#file-core-assets-link-assets-ts
Source text: https://banes-lab.com/assets/sources/source.e61c9f863a8b7a5293d67e80c7c484707b398bf7d8304d997a92fba9e8906937.generated.txt

## Definitions

- `pageFromPath` (lexical_declaration, line 23, exported)
- `tabLink` (lexical_declaration, line 33, exported)
- `pagePath` (lexical_declaration, line 19, exported)
- `tabPath` (lexical_declaration, line 38, exported)
- `tabFromPath` (lexical_declaration, line 28, exported)
- `payloadPath` (lexical_declaration, line 52, exported)
- `pathOnly` (lexical_declaration, line 8)
- `payloadTwinPath` (lexical_declaration, line 64, exported)
- `segmentsOf` (lexical_declaration, line 13)
- `queryPath` (lexical_declaration, line 42, exported)
- `HOME_PATH` (lexical_declaration, line 4, exported)
- `QUERY_MARK` (lexical_declaration, line 6)
- `stops` (lexical_declaration, line 9)
- `[page]` (lexical_declaration, line 24, exported)
- `[, tab]` (lexical_declaration, line 29, exported)
- `base` (lexical_declaration, line 34, exported)
- `queryValue` (lexical_declaration, line 46, exported)
- `JSON_ROUTE` (lexical_declaration, line 50)
- `MARKDOWN_SUFFIX` (lexical_declaration, line 56)
- `HOME_TWIN` (lexical_declaration, line 58)
- `markdownTwinPath` (lexical_declaration, line 60, exported)
- `CATALOG_SEGMENT` (lexical_declaration, line 68)
- `FACE_INDEX_SEGMENT` (lexical_declaration, line 69)
- `CATALOG_ROUTE` (lexical_declaration, line 71, exported)
- `CATALOG_MARKDOWN_ROUTE` (lexical_declaration, line 73, exported)
- `faceIndexPath` (lexical_declaration, line 75, exported)
- `LLMS_ROUTE` (lexical_declaration, line 79, exported)
- `FULL_TEXT_ROUTE` (lexical_declaration, line 81, exported)
- `SITE_URL` (lexical_declaration, line 83, exported)
- `AUTHOR_ADDRESS` (lexical_declaration, line 85, exported)
- `AUTHOR_MAIL` (lexical_declaration, line 87, exported)
- `CONTACT_MAIL` (lexical_declaration, line 89, exported)
- `AUTHOR_PROFILE` (lexical_declaration, line 91, exported)
- `AUTHOR_GITHUB` (lexical_declaration, line 93, exported)
- `METHODOLOGY_REPOSITORY` (lexical_declaration, line 95, exported)
- `LICENSE_ROOT` (lexical_declaration, line 97)
- `LICENSE_FILE` (lexical_declaration, line 99, exported)
- `LICENSE_HEADER_FILE` (lexical_declaration, line 101, exported)
- `LICENSE_INQUIRY_MAIL` (lexical_declaration, line 103, exported)
- `QUESTION_MAIL` (lexical_declaration, line 105, exported)
- `GRAMMAR_REPOSITORY` (lexical_declaration, line 107, exported)
- `CREATIVE_COMMONS` (lexical_declaration, line 109, exported)

## Used by

- [core/analyzers/search.analyzer.ts](https://banes-lab.com/source/tree/core/analyzers/search.analyzer.ts.md)
- [domain/converters/chapter.converter.ts](https://banes-lab.com/source/tree/domain/converters/chapter.converter.ts.md)
- [domain/converters/evidence.converter.ts](https://banes-lab.com/source/tree/domain/converters/evidence.converter.ts.md)
- [domain/converters/ontology.converter.ts](https://banes-lab.com/source/tree/domain/converters/ontology.converter.ts.md)
- [domain/converters/reference.converter.ts](https://banes-lab.com/source/tree/domain/converters/reference.converter.ts.md)
- [domain/converters/source.converter.ts](https://banes-lab.com/source/tree/domain/converters/source.converter.ts.md)
- [domain/loaders/anatomy.loader.ts](https://banes-lab.com/source/tree/domain/loaders/anatomy.loader.ts.md)
- [presentation/components/link.component.ts](https://banes-lab.com/source/tree/presentation/components/link.component.ts.md)
- [presentation/components/search.component.ts](https://banes-lab.com/source/tree/presentation/components/search.component.ts.md)
- [presentation/renderers/page.renderer.ts](https://banes-lab.com/source/tree/presentation/renderers/page.renderer.ts.md)
- [presentation/renderers/tab.renderer.ts](https://banes-lab.com/source/tree/presentation/renderers/tab.renderer.ts.md)
- [presentation/widgets/home.widget.ts](https://banes-lab.com/source/tree/presentation/widgets/home.widget.ts.md)
- [runtime/coordinators/route.coordinator.ts](https://banes-lab.com/source/tree/runtime/coordinators/route.coordinator.ts.md)

## Source

```typescript
import { ANCHOR_PREFIX } from "#configuration/constants/document.constants";
import { HOME_PAGE } from "#core/ids/page.ids";

export const HOME_PATH = "/";

const QUERY_MARK = "?";

const pathOnly = function pathOnly(href: string): string {
    const stops = [href.indexOf(QUERY_MARK), href.indexOf(ANCHOR_PREFIX)].filter((at) => at !== -1);
    return stops.length === 0 ? href : href.slice(0, Math.min(...stops));
};

const segmentsOf = function segmentsOf(pathname: string): string[] {
    return pathOnly(pathname)
        .split(HOME_PATH)
        .filter((segment) => segment.length > 0);
};

export const pagePath = function pagePath(page: string): string {
    return page === HOME_PAGE ? HOME_PATH : HOME_PATH + page;
};

export const pageFromPath = function pageFromPath(pathname: string, home: string): string {
    const [page] = segmentsOf(pathname);
    return page ?? home;
};

export const tabFromPath = function tabFromPath(pathname: string): string | null {
    const [, tab] = segmentsOf(pathname);
    return tab ?? null;
};

export const tabLink = function tabLink(page: string, tab: string, section?: string): string {
    const base = `${pagePath(page)}${HOME_PATH}${tab}`;
    return section === undefined ? base : base + ANCHOR_PREFIX + section;
};

export const tabPath = function tabPath(page: string, tabs: readonly { readonly id: string }[], tab: string): string {
    return tab === tabs[0]?.id ? pagePath(page) : tabLink(page, tab);
};

export const queryPath = function queryPath(page: string, parameter: string, value: string): string {
    return pagePath(page) + QUERY_MARK + new URLSearchParams([[parameter, value]]).toString();
};

export const queryValue = function queryValue(search: string, parameter: string): string {
    return new URLSearchParams(search).get(parameter) ?? "";
};

const JSON_ROUTE = "/json/";

export const payloadPath = function payloadPath(page: string, tab: string | null = null): string {
    return tab === null ? JSON_ROUTE + page : JSON_ROUTE + page + HOME_PATH + tab;
};

const MARKDOWN_SUFFIX = ".md";

const HOME_TWIN = "/index";

export const markdownTwinPath = function markdownTwinPath(path: string): string {
    return (path === HOME_PATH ? HOME_TWIN : path) + MARKDOWN_SUFFIX;
};

export const payloadTwinPath = function payloadTwinPath(path: string): string {
    return payloadPath(pageFromPath(path, HOME_PAGE), tabFromPath(path));
};

const CATALOG_SEGMENT = "api";
const FACE_INDEX_SEGMENT = "/records/";

export const CATALOG_ROUTE = JSON_ROUTE + CATALOG_SEGMENT;

export const CATALOG_MARKDOWN_ROUTE = HOME_PATH + CATALOG_SEGMENT + MARKDOWN_SUFFIX;

export const faceIndexPath = function faceIndexPath(face: string): string {
    return CATALOG_ROUTE + FACE_INDEX_SEGMENT + face;
};

export const LLMS_ROUTE = "/llms.txt";

export const FULL_TEXT_ROUTE = "/llms-full.txt";

export const SITE_URL = "https://banes-lab.com";

export const AUTHOR_ADDRESS = "jay@banes-lab.com";

export const AUTHOR_MAIL = `mailto:${AUTHOR_ADDRESS}`;

export const CONTACT_MAIL = AUTHOR_ADDRESS;

export const AUTHOR_PROFILE = "https://linkedin.com/in/jay-baleine";

export const AUTHOR_GITHUB = "https://github.com/Varietyz";

export const METHODOLOGY_REPOSITORY = "https://github.com/Varietyz/Disciplined-AI-Software-Development";

const LICENSE_ROOT = "/assets/licenses/pag/";

export const LICENSE_FILE = `${LICENSE_ROOT}LICENSE`;

export const LICENSE_HEADER_FILE = `${LICENSE_ROOT}license-header.txt`;

export const LICENSE_INQUIRY_MAIL = `${AUTHOR_MAIL}?subject=PAG Commercial License Inquiry`;

export const QUESTION_MAIL = `${AUTHOR_MAIL}?subject=Question about the methodology`;

export const GRAMMAR_REPOSITORY = "https://github.com/Varietyz/pag-lang";

export const CREATIVE_COMMONS = "https://creativecommons.org/licenses/by-sa/4.0/";
```
