
# Ieșire ANSI

Setați `lang` la `'ansi'` pentru a evidenția ieșirea terminalului — text care conține secvențe de escape ANSI — în loc să o tokenizați cu o gramatică. shikiphp analizează codurile de escape și colorează textul folosind paleta ANSI a temei. Este un port al tokenizerului `lang: 'ansi'` din Shiki, iar patru scenarii oracle îi verifică HTML în raport cu Shiki 3.23.0.

```php
use Shikiphp\Shikiphp;

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

Aceasta este modalitatea firească de a reda ieșirea CLI capturată — de la rulatoare de teste, jurnale de compilare și ieșire `git` — păstrând culorile originale. Secvențele de escape sunt eliminate din ieșire; rămâne doar textul, încadrat în elemente span colorate.

Observați șirul PHP între ghilimele duble: `"\e"` este caracterul de escape. Când redați ieșirea capturată dintr-un proces (de exemplu, cu `shell_exec` sau `proc_open`), caracterele de escape se află deja în șir.

## Ce înțelege

Tokenizerul citește secvențe SGR (Select Graphic Rendition), `ESC [ … m`, cu orice număr de coduri separate prin `;`:

| Coduri | Efect |
| --- | --- |
| `0` | resetează toate culorile și atributele |
| `1`, `3`, `4`, `9` | aldine, cursive, subliniate, tăiate |
| `2` | estompare: prim-planul este redat la opacitate de 50% |
| `7` | inversare: prim-planul și fundalul își schimbă locul |
| `21`, `23`, `24`, `27`, `29` | dezactivează atributul corespunzător |
| `22` | intensitate normală: dezactivează estomparea și aldinele |
| `30`–`37`, `90`–`97` | prim-plan: cele 8 culori standard și cele 8 luminoase |
| `40`–`47`, `100`–`107` | fundal: cele 8 culori standard și cele 8 luminoase |
| `38;5;n`, `48;5;n` | prim-plan sau fundal din tabelul de 256 culori |
| `38;2;r;g;b`, `48;2;r;g;b` | prim-plan sau fundal în culoare reală pe 24 de biți |
| `39`, `49` | prim-plan sau fundal implicit |

Ascunse (`8`) și supraliniate (`53`) sunt analizate, dar nu modifică ieșirea; celelalte coduri sunt ignorate. Stilurile se păstrează la trecerea peste întreruperile de linie până când sunt resetate, ca într-un terminal.

## Culori

Cele 16 culori cu nume provin din culorile `terminal.ansi*` ale temei (`terminal.ansiRed`, `terminal.ansiBrightBlue` și așa mai departe). Dacă o temă nu definește una dintre ele, se folosește paleta implicită VS Code (`#cd3131` pentru roșu, `#2472C8` pentru albastru și așa mai departe). Textul fără o culoare setată folosește culoarea de prim-plan a temei, iar fundalul blocului este cel al temei, la fel ca în evidențierea bazată pe gramatică. În tabelul de 256 culori, intrările 0–15 sunt aceleași 16 culori cu nume; intrările 16–255 (cubul de culori 6×6×6 și gradația de tonuri de gri) și valorile în culori reale nu depind de temă.

[`colorReplacements` și ](https://shikiphp.inline0.dev/ro/docs/options#colorreplacements) se aplică și culorilor ANSI.

## Teme duale

ANSI respectă maparea `themes` la fel ca evidențierea bazată pe gramatică, generând variante cu CSS pentru temele care nu sunt implicite:

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

Fiecare culoare cu nume este asociată paletei proprii a fiecărei teme, astfel încât roșul din tema luminoasă poate diferi de cel din tema întunecată.

## Fără stare gramaticală

Deoarece ANSI nu folosește o gramatică TextMate, nu există o stare gramaticală de păstrat. `getLastGrammarState` generează o excepție pentru `lang: 'ansi'`, iar `codeToTokensResult` returnează un `null` `grammarState`.
