
# ANSI-uitvoer

Stel `lang` in op `'ansi'` om terminaluitvoer — tekst met ANSI-escapesequenties — te markeren in plaats van deze met een grammatica te tokeniseren. shikiphp verwerkt de escape-codes en kleurt de tekst met het ANSI-palet van het thema. Het is een port van de tokenizer van Shiki's `lang: 'ansi'`; vier oracle-scenario's controleren de HTML ervan aan de hand van Shiki 3.23.0.

```php
use Shikiphp\Shikiphp;

echo Shikiphp::codeToHtml("\e[31merror\e[0m: something broke", [
    'lang'  => 'ansi',
    'theme' => 'github-dark',
]);
```

Dit is de natuurlijke manier om vastgelegde CLI-uitvoer — testrunners, buildlogs, `git`-uitvoer — weer te geven met behoud van de oorspronkelijke kleuren. De escapesequenties worden uit de uitvoer verwijderd; alleen de tekst blijft over, omgeven door gekleurde spans.

Let op de string PHP met dubbele aanhalingstekens: `"\e"` is het escape-teken. Wanneer u uitvoer weergeeft die van een proces is vastgelegd (bijvoorbeeld met `shell_exec` of `proc_open`), staan de escape-tekens al in de string.

## Wat het herkent

De tokenizer leest SGR-sequenties (Select Graphic Rendition), `ESC [ … m`, met een willekeurig aantal codes gescheiden door `;`:

| Codes | Effect |
| --- | --- |
| `0` | alle kleuren en kenmerken resetten |
| `1`, `3`, `4`, `9` | vet, cursief, onderstrepen, doorhalen |
| `2` | gedimd: de voorgrond wordt met halve dekking getekend |
| `7` | omgekeerd: voor- en achtergrond worden verwisseld |
| `21`, `23`, `24`, `27`, `29` | het overeenkomende kenmerk uitschakelen |
| `22` | normale intensiteit: schakelt gedimd en vet uit |
| `30`–`37`, `90`–`97` | voorgrond: de 8 standaardkleuren en 8 heldere kleuren |
| `40`–`47`, `100`–`107` | achtergrond: de 8 standaardkleuren en 8 heldere kleuren |
| `38;5;n`, `48;5;n` | voorgrond of achtergrond uit de tabel met 256 kleuren |
| `38;2;r;g;b`, `48;2;r;g;b` | 24-bits truecolor-voorgrond of -achtergrond |
| `39`, `49` | standaardvoorgrond of -achtergrond |

Verborgen (`8`) en overline (`53`) worden verwerkt maar veranderen de uitvoer niet; andere codes worden genegeerd. Stijlen blijven van kracht over regeleinden heen totdat ze worden gereset, zoals in een terminal.

## Kleuren

De 16 benoemde kleuren komen uit de `terminal.ansi*`-kleuren van het thema (`terminal.ansiRed`, `terminal.ansiBrightBlue` enzovoort). Als een thema er geen definieert, wordt het standaardpalet van VS Code gebruikt (`#cd3131` voor rood, `#2472C8` voor blauw enzovoort). Tekst waarvoor geen kleur is ingesteld, gebruikt de voorgrondkleur van het thema; de blokachtergrond is de achtergrondkleur van het thema, net als bij grammaticagebaseerde markering. In de tabel met 256 kleuren zijn de vermeldingen 0–15 dezelfde 16 benoemde kleuren; de vermeldingen 16–255 (de 6×6×6-kleurkubus en de grijstintenreeks) en truecolorwaarden zijn niet afhankelijk van het thema.

[`colorReplacements`](https://shikiphp.inline0.dev/nl/docs/options#colorreplacements) zijn ook van toepassing op ANSI-kleuren.

## Dubbele thema's

ANSI houdt zich aan de map `themes`, net als grammaticagebaseerde markering, en genereert varianten met CSS voor de niet-standaardthema's:

```php
use Shikiphp\Shikiphp;

$log = "\e[32mPASS\e[0m tests/Unit\n\e[31mFAIL\e[0m tests/Integration";

echo Shikiphp::codeToHtml($log, [
    'lang'   => 'ansi',
    'themes' => ['light' => 'github-light', 'dark' => 'github-dark'],
]);
```

Elke benoemde kleur wordt bepaald aan de hand van het eigen palet van elk thema, dus rood kan in het lichte en het donkere thema verschillen.

## Geen grammaticastatus

Omdat ANSI geen TextMate-grammatica gebruikt, is er geen grammaticastatus om te behouden. `getLastGrammarState` genereert een fout voor `lang: 'ansi'` en `codeToTokensResult` retourneert een `null` `grammarState`.
