
# Wyjście ANSI

Ustaw `lang` na `'ansi'`, aby wyróżniać wyjście terminala — tekst zawierający sekwencje ucieczki ANSI — zamiast tokenizować je według gramatyki. shikiphp analizuje kody ucieczki i koloruje tekst na podstawie palety ANSI motywu. To port tokenizatora `lang: 'ansi'` z Shiki; cztery scenariusze wzorcowe sprawdzają jego HTML względem Shiki 3.23.0.

```php
use Shikiphp\Shikiphp;

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

To naturalny sposób renderowania przechwyconego wyjścia CLI — na przykład z narzędzi uruchamiających testy, logów kompilacji czy wyjścia `git` — z zachowaniem oryginalnych kolorów. Sekwencje ucieczki są usuwane z wyjścia; pozostaje tylko tekst ujęty w kolorowe elementy span.

Zwróć uwagę na ciąg PHP w podwójnych cudzysłowach: `"\e"` to znak ucieczki. Podczas renderowania wyjścia przechwyconego z procesu (na przykład za pomocą `shell_exec` lub `proc_open`) znaki ucieczki są już zawarte w ciągu.

## Obsługiwane elementy

Tokenizator odczytuje sekwencje SGR (Select Graphic Rendition), `ESC [ … m`, z dowolną liczbą kodów oddzielonych `;`:

| Kody | Efekt |
| --- | --- |
| `0` | resetuje wszystkie kolory i atrybuty |
| `1`, `3`, `4`, `9` | pogrubienie, kursywa, podkreślenie, przekreślenie |
| `2` | przygaszenie: pierwszy plan jest wyświetlany z połową krycia |
| `7` | odwrócenie: zamienia kolory pierwszego planu i tła |
| `21`, `23`, `24`, `27`, `29` | wyłącza odpowiadający im atrybut |
| `22` | normalna intensywność: wyłącza przygaszenie i pogrubienie |
| `30`–`37`, `90`–`97` | pierwszy plan: 8 kolorów standardowych i 8 jasnych |
| `40`–`47`, `100`–`107` | tło: 8 kolorów standardowych i 8 jasnych |
| `38;5;n`, `48;5;n` | kolor pierwszego planu lub tła z palety 256 kolorów 256 |
| `38;2;r;g;b`, `48;2;r;g;b` | 24-bitowy kolor pierwszego planu lub tła |
| `39`, `49` | domyślny kolor pierwszego planu lub tła |

Ukrycie (`8`) i nadkreślenie (`53`) są analizowane, ale nie zmieniają wyjścia; pozostałe kody są ignorowane. Style utrzymują się przez kolejne wiersze, aż do ich zresetowania, tak jak w terminalu.

## Kolory

16 nazwanych kolorów pochodzi z kolorów `terminal.ansi*` motywu (`terminal.ansiRed`, `terminal.ansiBrightBlue` itd.). Jeśli motyw nie definiuje danego koloru, używana jest domyślna paleta VS Code (`#cd3131` dla czerwieni, `#2472C8` dla niebieskiego itd.). Tekst bez ustawionego koloru przyjmuje kolor pierwszego planu motywu, a tło bloku — kolor tła motywu, tak jak przy wyróżnianiu opartym na gramatyce. W palecie 256 kolorów 256 pozycje 0–15 odpowiadają tym samym 16 nazwanym kolorom; pozycje 16–255 (sześcian kolorów 6×6×6 i skala szarości) oraz wartości true color nie zależą od motywu.

[`colorReplacements`](https://shikiphp.inline0.dev/pl/docs/options#colorreplacements) dotyczą również kolorów ANSI.

## Motywy jasny i ciemny

ANSI respektuje mapę `themes` tak samo jak wyróżnianie oparte na gramatyce, generując warianty zależne od motywu CSS dla motywów innych niż domyślny:

```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żdy nazwany kolor jest dopasowywany do palety danego motywu, dlatego czerwień w motywie jasnym może różnić się od czerwieni w motywie ciemnym.

## Bez stanu gramatyki

Ponieważ ANSI nie używa gramatyki TextMate, nie ma stanu gramatyki do zachowania. `getLastGrammarState` zgłasza wyjątek dla `lang: 'ansi'`, a `codeToTokensResult` zwraca `null` `grammarState`.
