# core/formatters/markup.formatter.ts

> 17 lines of code and 4 definitions.

Tree: GovLab Patterns
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/patterns#file-patterns-core-formatters-markup-formatter-ts
Source text: https://banes-lab.com/source/patterns/core/formatters/markup.formatter.ts.txt

Listed in [core/formatters](https://banes-lab.com/api/source/patterns/core/formatters.md), after [core/formatters/definition.formatter.ts](https://banes-lab.com/source/patterns/core/formatters/definition.formatter.ts.md) and before [core/formatters/report.formatter.ts](https://banes-lab.com/source/patterns/core/formatters/report.formatter.ts.md).

## Definitions

- `escapeXml` (lexical_declaration, line 9, exported)
- `anchorMarkup` (lexical_declaration, line 17, exported)
- `XML_ESCAPES` (lexical_declaration, line 1)
- `out` (lexical_declaration, line 10, exported)

## Contained in

- [core/formatters](https://banes-lab.com/anatomy/patterns/folder-patterns-core-formatters.md)

## Used by

- [core/renderers/report.renderer.ts](https://banes-lab.com/source/patterns/core/renderers/report.renderer.ts.md)

## Linked from

- [core/renderers](https://banes-lab.com/anatomy/patterns/folder-patterns-core-renderers.md)

## Source

```typescript
const XML_ESCAPES: ReadonlyMap<string, string> = new Map([
    ["&", "&amp;"],
    ["<", "&lt;"],
    [">", "&gt;"],
    ['"', "&quot;"],
    ["'", "&apos;"],
]);

export const escapeXml = function escapeXml(value: string): string {
    let out = "";
    for (const ch of value) {
        out += XML_ESCAPES.get(ch) ?? ch;
    }
    return out;
};

export const anchorMarkup = function anchorMarkup(href: string, label: string): string {
    return `<a href="${href}">${label}</a>`;
};
```
