# domain/converters/source.link.converter.ts

> 29 lines of code and 5 definitions.

Tree: Site tree
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/tree#file-domain-converters-source-link-converter-ts
Source text: https://banes-lab.com/source/tree/domain/converters/source.link.converter.ts.txt

Listed in [domain/converters](https://banes-lab.com/api/source/tree/domain/converters.md), after [domain/converters/source.converter.ts](https://banes-lab.com/source/tree/domain/converters/source.converter.ts.md) and before [domain/converters/structure.converter.ts](https://banes-lab.com/source/tree/domain/converters/structure.converter.ts.md).

## Definitions

- `definitionHref` (lexical_declaration, line 14, exported)
- `definitionFragment` (lexical_declaration, line 10)
- `sourceLink` (lexical_declaration, line 22, exported)
- `definitionBlock` (lexical_declaration, line 26, exported)
- `cited` (lexical_declaration, line 31, exported)

## Uses

- [core/assets/link.assets.ts](https://banes-lab.com/source/tree/core/assets/link.assets.ts.md)
- [core/converters/folder.converter.ts](https://banes-lab.com/source/tree/core/converters/folder.converter.ts.md)
- [domain/converters/source.converter.ts](https://banes-lab.com/source/tree/domain/converters/source.converter.ts.md)

## Source

```typescript
import { DEFINITION_ANCHOR, TREE_TAB } from "#core/ids/anatomy.ids";
import { ANATOMY_PAGE } from "#core/ids/page.ids";
import type { DefinitionBlock } from "#types/block.types";
import { LINE_INFIX } from "#configuration/constants/anatomy.constants";
import { citedDefinition } from "#core/loaders/definition.loader";
import { nodeHref } from "#domain/converters/source.converter";
import { tabLink } from "#core/assets/link.assets";
import { treeOf } from "#core/converters/folder.converter";

const definitionFragment = function definitionFragment(name: string, file: string | null): string {
    return DEFINITION_ANCHOR + name + (file === null ? "" : LINE_INFIX + file);
};

export const definitionHref = function definitionHref(name: string, file: string | null = null): string {
    const cited = citedDefinition(name, file);
    if (cited !== null) {
        return nodeHref(cited.file, cited.line);
    }
    return tabLink(ANATOMY_PAGE, file === null ? TREE_TAB : treeOf(file), definitionFragment(name, file));
};

export const sourceLink = function sourceLink(name: string, label: string = name, file: string | null = null): string {
    return `<a href="${definitionHref(name, file)}">${label}</a>`;
};

export const definitionBlock = function definitionBlock(
    name: string,
    title: string,
    file: string | null = null,
): DefinitionBlock {
    const cited = citedDefinition(name, file);
    return { file: cited?.file ?? file, kind: "definition", line: cited?.line ?? null, name, title };
};
```
