
# Output ANSI

Impostate `lang` su `'ansi'` per evidenziare l’output del terminale — testo che contiene sequenze di escape ANSI — anziché analizzarlo con una grammatica. shikiphp analizza i codici di escape e colora il testo usando la palette ANSI del tema. È un port del tokenizer `lang: 'ansi'` di Shiki e quattro scenari oracle ne verificano HTML rispetto a Shiki 3.23.0.

```php
use Shikiphp\Shikiphp;

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

È il modo naturale di visualizzare l’output CLI acquisito — runner di test, log di build, output `git` — mantenendone i colori originali. Le sequenze di escape vengono rimosse dall’output; resta solo il testo, racchiuso in span colorati.

Attenzione alla stringa PHP tra virgolette doppie: `"\e"` è il carattere di escape. Quando visualizzate l’output acquisito da un processo (per esempio con `shell_exec` o `proc_open`), i caratteri di escape sono già nella stringa.

## Cosa comprende

Il tokenizer legge le sequenze SGR (Select Graphic Rendition), `ESC [ … m`, con un numero qualsiasi di codici separati da `;`:

| Codici | Effetto |
| --- | --- |
| `0` | reimposta tutti i colori e gli attributi |
| `1`, `3`, `4`, `9` | grassetto, corsivo, sottolineato, barrato |
| `2` | attenuato: il primo piano viene visualizzato al 50% di opacità |
| `7` | invertito: primo piano e sfondo si scambiano |
| `21`, `23`, `24`, `27`, `29` | disattivano il relativo attributo |
| `22` | intensità normale: disattiva attenuazione e grassetto |
| `30`–`37`, `90`–`97` | primo piano: gli 8 colori standard e gli 8 brillanti |
| `40`–`47`, `100`–`107` | sfondo: gli 8 colori standard e gli 8 brillanti |
| `38;5;n`, `48;5;n` | primo piano o sfondo dalla tabella a 256 colori 256 |
| `38;2;r;g;b`, `48;2;r;g;b` | colore RGB a 24 bit per primo piano o sfondo |
| `39`, `49` | primo piano o sfondo predefinito |

Nascosto (`8`) e sovralineato (`53`) vengono analizzati, ma non modificano l’output; gli altri codici vengono ignorati. Gli stili persistono nei cambi di riga finché non vengono reimpostati, come in un terminale.

## Colori

I 16 colori con nome provengono dai colori `terminal.ansi*` del tema (`terminal.ansiRed`, `terminal.ansiBrightBlue` e così via). Se il tema non ne definisce uno, viene usata la palette predefinita VS Code (`#cd3131` per il rosso, `#2472C8` per il blu e così via). Il testo senza un colore impostato usa il colore di primo piano del tema e lo sfondo del blocco usa quello di sfondo del tema, come nell’evidenziazione basata su grammatiche. Nella tabella a 256 colori, le voci 0–15 corrispondono agli stessi 16 colori con nome; le voci 16–255 (il cubo di colori 6×6×6 e la scala di grigi) e i valori true color non dipendono dal tema.

Anche i colori ANSI vengono applicati a [`colorReplacements`](https://shikiphp.inline0.dev/it/docs/options#colorreplacements).

## Temi chiari e scuri

ANSI rispetta la mappa `themes` proprio come l’evidenziazione basata su grammatiche, generando varianti CSS per i temi non predefiniti:

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

Ogni colore con nome viene risolto in base alla palette specifica di ciascun tema, quindi il rosso nel tema chiaro può differire da quello nel tema scuro.

## Nessuno stato della grammatica

Poiché ANSI non usa una grammatica TextMate, non c’è uno stato della grammatica da mantenere. `getLastGrammarState` genera un errore per `lang: 'ansi'`, mentre `codeToTokensResult` restituisce un `null` `grammarState`.
