
# ANSI-utdata

Ange `lang` till `'ansi'` för att markera terminalutdata — text som innehåller ANSI-escape-sekvenser — i stället för att tokenisera med en grammatik. shikiphp tolkar escape-koderna och färglägger texten med temats ANSI-palett. Det är en portering av Shikis tokeniserare `lang: 'ansi'`, och fyra oracle-scenarier kontrollerar dess HTML mot Shiki 3.23.0.

```php
use Shikiphp\Shikiphp;

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

Det här är det naturliga sättet att återge infångade CLI-utdata — från testkörningar, byggloggar och `git`-utdata — med originalfärgerna bevarade. Escape-sekvenserna tas bort från utdata; bara texten återstår, omsluten av färgade spann.

Observera den dubbelt citerade PHP-strängen: `"\e"` är escape-tecknet. När du återger utdata som fångats från en process (till exempel med `shell_exec` eller `proc_open`) finns escape-tecknen redan i strängen.

## Vad den tolkar

Tokeniseraren läser SGR-sekvenser (Select Graphic Rendition), `ESC [ … m`, med valfritt antal koder åtskilda av `;`:

| Koder | Effekt |
| --- | --- |
| `0` | återställer alla färger och attribut |
| `1`, `3`, `4`, `9` | fetstil, kursiv, understrykning, genomstrykning |
| `2` | dämpad: förgrunden ritas med halv opacitet |
| `7` | omvänd: förgrund och bakgrund byter plats |
| `21`, `23`, `24`, `27`, `29` | stänger av motsvarande attribut |
| `22` | normal intensitet: stänger av dämpning och fetstil |
| `30`–`37`, `90`–`97` | förgrund: de 8 standardfärgerna och 8 ljusa färgerna |
| `40`–`47`, `100`–`107` | bakgrund: de 8 standardfärgerna och 8 ljusa färgerna |
| `38;5;n`, `48;5;n` | förgrund eller bakgrund från tabellen med 256 färger |
| `38;2;r;g;b`, `48;2;r;g;b` | 24-bitars äkta färg för förgrund eller bakgrund |
| `39`, `49` | standardförgrund eller standardbakgrund |

Dold (`8`) och överstrykning (`53`) tolkas men påverkar inte utdata, och andra koder ignoreras. Stilar gäller över radbrytningar tills de återställs, precis som i en terminal.

## Färger

De 16 namngivna färgerna hämtas från temats `terminal.ansi*`-färger (`terminal.ansiRed`, `terminal.ansiBrightBlue` och så vidare). Om ett tema inte definierar en färg används standardpaletten VS Code (`#cd3131` för rött, `#2472C8` för blått och så vidare). Text utan angiven färg använder temats förgrundsfärg, och blockbakgrunden är temats bakgrund, precis som vid grammatiksbaserad markering. I tabellen med 256 färger är posterna 0–15 samma 16 namngivna färger; posterna 16–255 (färgkuben 6×6×6 och gråskalegradienten) samt färgvärden i sann färg beror inte på temat.

[`colorReplacements`](https://shikiphp.inline0.dev/sv/docs/options#colorreplacements) gäller även ANSI-färger.

## Dubbla teman

ANSI följer mappningen `themes` precis som grammatiksbaserad markering och ger ut temavariansen CSS för andra teman än standardtemat:

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

Varje namngiven färg slås upp i respektive temas egen palett, så rött i det ljusa temat kan skilja sig från rött i det mörka temat.

## Inget grammatiktillstånd

Eftersom ANSI inte använder en grammatik av typen TextMate finns inget grammatiktillstånd att bevara. `getLastGrammarState` ger fel för `lang: 'ansi'`, och `codeToTokensResult` returnerar ett `null`-`grammarState`.
