
# ANSI-output

Angiv `lang` til `'ansi'` for at fremhæve terminaloutput — tekst, der indeholder ANSI-escape-sekvenser — i stedet for at tokenisere med en grammatik. shikiphp fortolker escape-koderne og farver teksten med temaets ANSI-palette. Det er en portering af Shikis `lang: 'ansi'`-tokenizer, og fire oracle-scenarier kontrollerer dens HTML mod Shiki 3.23.0.

```php
use Shikiphp\Shikiphp;

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

Dette er den naturlige måde at gengive optaget CLI-output — testkøreres og buildlogs' `git`-output — med de oprindelige farver bevaret. Escape-sekvenserne fjernes fra outputtet; kun teksten står tilbage, indpakket i farvede spans.

Bemærk strengen PHP med dobbelte anførselstegn: `"\e"` er escape-tegnet. Når du gengiver output, der er optaget fra en proces (for eksempel med `shell_exec` eller `proc_open`), er escape-tegnene allerede i strengen.

## Det forstår den

Tokenizeren læser SGR-sekvenser (Select Graphic Rendition), `ESC [ … m`, med et vilkårligt antal koder adskilt af `;`:

| Koder | Effekt |
| --- | --- |
| `0` | nulstil alle farver og attributter |
| `1`, `3`, `4`, `9` | fed, kursiv, understregning, gennemstregning |
| `2` | dæmpet: forgrunden vises med halv opacitet |
| `7` | omvendt: forgrund og baggrund bytter plads |
| `21`, `23`, `24`, `27`, `29` | slå den tilsvarende attribut fra |
| `22` | normal intensitet: slår dæmpning og fed skrift fra |
| `30`–`37`, `90`–`97` | forgrund: de 8 standardfarver og 8 klare farver |
| `40`–`47`, `100`–`107` | baggrund: de 8 standardfarver og 8 klare farver |
| `38;5;n`, `48;5;n` | forgrund eller baggrund fra tabellen med 256 farver |
| `38;2;r;g;b`, `48;2;r;g;b` | 24-bit ægte farve for forgrund eller baggrund |
| `39`, `49` | standardforgrund eller -baggrund |

Skjult (`8`) og overstregning (`53`) fortolkes, men ændrer ikke outputtet, og andre koder ignoreres. Typografier fortsætter på tværs af linjeskift, indtil de nulstilles, som i en terminal.

## Farver

De 16 navngivne farver kommer fra temaets `terminal.ansi*`-farver (`terminal.ansiRed`, `terminal.ansiBrightBlue` osv.). Hvis et tema ikke definerer en farve, bruges standardpaletten fra VS Code (`#cd3131` for rød, `#2472C8` for blå osv.). Tekst uden angivet farve bruger temaets forgrund, og blokkens baggrund er temaets baggrund, som ved grammatikbaseret fremhævning. I tabellen med 256 farver er posterne 0–15 de samme 16 navngivne farver; posterne 16–255 (farvekubussen på 6×6×6 og gråtoneskalaen) og ægte farveværdier afhænger ikke af temaet.

[`colorReplacements`](https://shikiphp.inline0.dev/da/docs/options#colorreplacements) gælder også ANSI-farver.

## Dobbelte temaer

ANSI følger `themes`-tilknytningen ligesom grammatikbaseret fremhævning og udsender varianter med CSS-variabler for temaer, der ikke er standardtemaet:

```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'],
]);
```

Hver navngiven farve slås op i hvert temas egen palette, så rød i det lyse tema kan have en anden farve end rød i det mørke tema.

## Ingen grammatiktilstand

Da ANSI ikke bruger en grammatik af typen TextMate, er der ingen grammatiktilstand at videreføre. `getLastGrammarState` kaster en fejl for `lang: 'ansi'`, og `codeToTokensResult` returnerer en `null` `grammarState`.
