
# Saída ANSI

Defina `lang` como `'ansi'` para destacar a saída do terminal — texto que contém sequências de escape ANSI — em vez de tokenizar com uma gramática. shikiphp analisa os códigos de escape e colore o texto com a paleta ANSI do tema. É uma adaptação do tokenizador `lang: 'ansi'` de Shiki, e quatro cenários de referência verificam seu HTML em relação a Shiki 3.23.0.

```php
use Shikiphp\Shikiphp;

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

Esta é a forma natural de renderizar saídas CLI capturadas — de executores de testes, logs de compilação e saídas de `git` — preservando as cores originais. As sequências de escape são removidas da saída; somente o texto permanece, envolto em spans coloridos.

Observe a string PHP entre aspas duplas: `"\e"` é o caractere de escape. Ao renderizar saídas capturadas de um processo (por exemplo, com `shell_exec` ou `proc_open`), os caracteres de escape já estão na string.

## O que ele entende

O tokenizador lê sequências SGR (Select Graphic Rendition), `ESC [ … m`, com qualquer quantidade de códigos separados por `;`:

| Códigos | Efeito |
| --- | --- |
| `0` | redefine todas as cores e atributos |
| `1`, `3`, `4`, `9` | negrito, itálico, sublinhado, tachado |
| `2` | esmaecido: o primeiro plano é desenhado com metade da opacidade |
| `7` | inverso: primeiro plano e plano de fundo trocam de lugar |
| `21`, `23`, `24`, `27`, `29` | desativa o atributo correspondente |
| `22` | intensidade normal: desativa esmaecido e negrito |
| `30`–`37`, `90`–`97` | primeiro plano: as 8 cores padrão e as 8 brilhantes |
| `40`–`47`, `100`–`107` | plano de fundo: as 8 cores padrão e as 8 brilhantes |
| `38;5;n`, `48;5;n` | primeiro plano ou plano de fundo da tabela de 256 cores |
| `38;2;r;g;b`, `48;2;r;g;b` | primeiro plano ou plano de fundo em cores reais de 24 bits |
| `39`, `49` | primeiro plano ou plano de fundo padrão |

Oculto (`8`) e sobrelinha (`53`) são analisados, mas não alteram a saída; os demais códigos são ignorados. Os estilos persistem entre quebras de linha até serem redefinidos, como em um terminal.

## Cores

As 16 cores nomeadas vêm das cores `terminal.ansi*` do tema (`terminal.ansiRed`, `terminal.ansiBrightBlue` e assim por diante). Quando um tema não define uma delas, usa-se a paleta padrão de VS Code (`#cd3131` para vermelho, `#2472C8` para azul, e assim por diante). O texto sem cor definida usa a cor de primeiro plano do tema, e o plano de fundo do bloco usa o plano de fundo do tema, como no destaque baseado em gramática. Na tabela de 256 cores, as entradas de 0 a 15 são essas mesmas 16 cores nomeadas; as entradas de 16 a 255 (o cubo de cores 6×6×6 e a escala de cinza) e os valores de cores reais não dependem do tema.

[`colorReplacements`](https://shikiphp.inline0.dev/pt/docs/options#colorreplacements) também se aplicam às cores ANSI.

## Temas duplos

ANSI respeita o mapa `themes` assim como o destaque baseado em gramática, emitindo variantes CSS para os temas que não são padrão:

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

Cada cor nomeada é resolvida com base na paleta própria de cada tema, portanto, o vermelho no tema claro pode ser diferente do vermelho no tema escuro.

## Sem estado de gramática

Como ANSI não usa uma gramática TextMate, não há estado de gramática a preservar. `getLastGrammarState` lança um erro para `lang: 'ansi'`, e `codeToTokensResult` retorna um `null` `grammarState`.
