
# Výstup ANSI

Nastavte `lang` na `'ansi'`, aby sa zvýraznil výstup terminálu — text obsahujúci sekvencie únikov ANSI — namiesto tokenizácie pomocou gramatiky. shikiphp spracuje únikové kódy a zafarbí text podľa palety ANSI témy. Ide o port tokenizéra `lang: 'ansi'` v Shiki a štyri kontrolné scenáre overujú jeho HTML voči Shiki 3.23.0.

```php
use Shikiphp\Shikiphp;

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

Toto je prirodzený spôsob vykreslenia zachyteného výstupu CLI — napríklad výstupu testovacích nástrojov, zostavovacích protokolov či výstupu `git` — so zachovaním pôvodných farieb. Únikové sekvencie sa z výstupu odstránia; zostane len text obalený farebnými prvkami span.

Všimnite si reťazec PHP v dvojitých úvodzovkách: `"\e"` je únikový znak. Pri vykresľovaní výstupu zachyteného z procesu (napríklad pomocou `shell_exec` alebo `proc_open`) sú únikové znaky už súčasťou reťazca.

## Čo rozpoznáva

Tokenizér číta sekvencie SGR (Select Graphic Rendition), `ESC [ … m`, s ľubovoľným počtom kódov oddelených pomocou `;`:

| Kódy | Účinok |
| --- | --- |
| `0` | obnoví predvolené farby a atribúty |
| `1`, `3`, `4`, `9` | tučné písmo, kurzíva, podčiarknutie, prečiarknutie |
| `2` | tlmenie: popredie sa vykreslí s polovičnou nepriehľadnosťou |
| `7` | inverzia: farby popredia a pozadia sa vymenia |
| `21`, `23`, `24`, `27`, `29` | vypnú príslušný atribút |
| `22` | normálna intenzita: vypne tlmenie a tučné písmo |
| `30`–`37`, `90`–`97` | farba popredia: 8 štandardných a 8 jasných farieb |
| `40`–`47`, `100`–`107` | farba pozadia: 8 štandardných a 8 jasných farieb |
| `38;5;n`, `48;5;n` | farba popredia alebo pozadia z tabuľky 256 farieb |
| `38;2;r;g;b`, `48;2;r;g;b` | 24-bitová farba popredia alebo pozadia |
| `39`, `49` | predvolená farba popredia alebo pozadia |

Skryté (`8`) a nadčiarknutie (`53`) sa spracujú, ale výstup nezmenia; ostatné kódy sa ignorujú. Štýly sa zachovávajú aj cez zalomenia riadkov, až kým sa nevynulujú, rovnako ako v termináli.

## Farby

16 pomenovaných farieb pochádza z farieb témy `terminal.ansi*`
(`terminal.ansiRed`, `terminal.ansiBrightBlue` atď.). Ak ich téma nedefinuje,
použije sa predvolená paleta VS Code (`#cd3131` pre červenú,
`#2472C8` pre modrú atď.). Text bez nastavenej farby preberá farbu popredia témy a pozadie bloku zodpovedá pozadiu témy, rovnako ako pri zvýrazňovaní založenom na gramatike. V tabuľke farieb 256 sú položky 0–15 tých istých 16 pomenovaných farieb; položky 16–255 (farebná kocka 6×6×6 a stupnica sivej) ani hodnoty v režime true color nezávisia od témy.

[`colorReplacements`](https://shikiphp.inline0.dev/sk/docs/options#colorreplacements) sa vzťahujú aj na farby ANSI.

## Dve témy

ANSI rešpektuje mapu `themes` rovnako ako zvýrazňovanie založené na gramatike a pre témy, ktoré nie sú predvolené, vypisuje varianty 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á pomenovaná farba sa určuje podľa vlastnej palety danej témy, takže červená v svetlej téme sa môže líšiť od červenej v tmavej téme.

## Bez stavu gramatiky

Keďže ANSI nepoužíva gramatiku TextMate, neexistuje stav gramatiky, ktorý by bolo možné uchovať.
`getLastGrammarState` vyvolá výnimku pre `lang: 'ansi'` a `codeToTokensResult` vráti
`null` `grammarState`.
