
# Výstup ANSI

Nastavte `lang` na `'ansi'` a zvýrazníte výstup terminálu — text obsahující escape sekvence ANSI — namísto tokenizace pomocí gramatiky. shikiphp analyzuje escape kódy a obarví text podle palety ANSI daného motivu. Jde o port tokenizeru `lang: 'ansi'` od Shiki; čtyři ověřovací scénáře kontrolují jeho HTML vůči Shiki 3.23.0.

```php
use Shikiphp\Shikiphp;

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

Jde o přirozený způsob vykreslení zachyceného výstupu CLI — například z testovacích nástrojů, sestavovacích protokolů nebo výstupu `git` — se zachováním původních barev. Escape sekvence se z výstupu odstraní; zůstane jen text obalený barevnými elementy span.

Všimněte si řetězce PHP v uvozovkách: `"\e"` je escape znak. Při vykreslování výstupu zachyceného z procesu (například pomocí `shell_exec` nebo `proc_open`) jsou escape znaky v řetězci už obsaženy.

## Co rozpozná

Tokenizer čte sekvence SGR (Select Graphic Rendition), `ESC [ … m`, které obsahují libovolný počet kódů oddělených znakem `;`:

| Kódy | Efekt |
| --- | --- |
| `0` | resetuje všechny barvy a atributy |
| `1`, `3`, `4`, `9` | tučné písmo, kurzíva, podtržení, přeškrtnutí |
| `2` | ztlumení: popředí se vykreslí s poloviční neprůhledností |
| `7` | převrácení: popředí a pozadí si vymění barvy |
| `21`, `23`, `24`, `27`, `29` | vypne odpovídající atribut |
| `22` | běžná intenzita: vypne ztlumení a tučné písmo |
| `30`–`37`, `90`–`97` | barva popředí: 8 standardních a 8 jasných barev |
| `40`–`47`, `100`–`107` | barva pozadí: 8 standardních a 8 jasných barev |
| `38;5;n`, `48;5;n` | barva popředí nebo pozadí z tabulky 256 barev |
| `38;2;r;g;b`, `48;2;r;g;b` | 24bitová barva popředí nebo pozadí |
| `39`, `49` | výchozí barva popředí nebo pozadí |

Skryté (`8`) a nadtržení (`53`) se analyzují, ale výstup nemění; ostatní kódy se ignorují. Styly se zachovávají přes konce řádků až do jejich resetování, stejně jako v terminálu.

## Barvy

16 pojmenovaných barev pochází z barev ANSI `terminal.ansi*` motivu (`terminal.ansiRed`, `terminal.ansiBrightBlue` atd.). Pokud je motiv nedefinuje, použije se výchozí paleta VS Code (`#cd3131` pro červenou, `#2472C8` pro modrou atd.). Text bez nastavené barvy přebírá barvu popředí motivu a pozadí bloku odpovídá jeho pozadí, stejně jako při zvýraznění založeném na gramatice. V tabulce 256 barev odpovídají položky 0–15 těmto 16 pojmenovaným barvám; položky 16–255 (barevná krychle 6×6×6 a odstíny šedi) a hodnoty skutečných barev nezávisí na motivu.

[`colorReplacements`](https://shikiphp.inline0.dev/cs/docs/options#colorreplacements) platí také pro barvy ANSI.

## Dva motivy

ANSI respektuje mapu `themes` stejně jako zvýrazňování založené na gramatice a pro motivy jiné než výchozí vytváří proměnné CSS:

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

Každá pojmenovaná barva se určuje podle palety konkrétního motivu, takže červená ve světlém a tmavém motivu se může lišit.

## Bez stavu gramatiky

Protože ANSI nepoužívá gramatiku TextMate, není třeba uchovávat stav gramatiky. `getLastGrammarState` vyvolá chybu pro `lang: 'ansi'` a `codeToTokensResult` vrací `null` `grammarState`.
