
# Sortie ANSI

Définissez `lang` sur `'ansi'` pour mettre en évidence la sortie du terminal — du texte contenant des séquences d'échappement ANSI — au lieu de l'analyser avec une grammaire. shikiphp analyse les codes d'échappement et colore le texte à partir de la palette ANSI du thème. Il s'agit d'un port du tokenizer `lang: 'ansi'` de Shiki ; quatre scénarios de référence vérifient sa HTML par rapport à Shiki 3.23.0.

```php
use Shikiphp\Shikiphp;

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

C'est la manière naturelle d'afficher la sortie CLI capturée — par les exécutants de tests, les journaux de compilation ou la sortie `git` — tout en conservant ses couleurs d'origine. Les séquences d'échappement sont retirées de la sortie ; seul le texte demeure, enveloppé dans des éléments span colorés.

Notez la chaîne PHP entre guillemets doubles : `"\e"` est le caractère d'échappement. Lorsque vous affichez la sortie capturée d'un processus (par exemple avec `shell_exec` ou `proc_open`), les caractères d'échappement sont déjà présents dans la chaîne.

## Ce qu'il comprend

Le tokenizer lit les séquences SGR (Select Graphic Rendition), `ESC [ … m`, avec un nombre quelconque de codes séparés par `;` :

| Codes | Effet |
| --- | --- |
| `0` | réinitialise toutes les couleurs et tous les attributs |
| `1`, `3`, `4`, `9` | gras, italique, souligné, barré |
| `2` | atténué : le premier plan est affiché à mi-opacité |
| `7` | inversé : le premier plan et l'arrière-plan sont échangés |
| `21`, `23`, `24`, `27`, `29` | désactivent l'attribut correspondant |
| `22` | intensité normale : désactive l'atténuation et le gras |
| `30`–`37`, `90`–`97` | premier plan : les 8 couleurs standard et les 8 couleurs vives |
| `40`–`47`, `100`–`107` | arrière-plan : les 8 couleurs standard et les 8 couleurs vives |
| `38;5;n`, `48;5;n` | couleur du premier plan ou de l'arrière-plan, issue de la palette à 256 couleurs |
| `38;2;r;g;b`, `48;2;r;g;b` | couleur vraie 24 bits du premier plan ou de l'arrière-plan |
| `39`, `49` | couleur par défaut du premier plan ou de l'arrière-plan |

Le masqué (`8`) et le surlignement (`53`) sont analysés, mais ne modifient pas la sortie ; les autres codes sont ignorés. Les styles persistent entre les sauts de ligne jusqu'à leur réinitialisation, comme dans un terminal.

## Couleurs

Les 16 couleurs nommées proviennent des couleurs `terminal.ansi*` du thème (`terminal.ansiRed`, `terminal.ansiBrightBlue`, etc.). Si le thème n'en définit pas une, la palette par défaut de VS Code est utilisée (`#cd3131` pour le rouge, `#2472C8` pour le bleu, etc.). Le texte sans couleur définie prend la couleur de premier plan du thème, et l'arrière-plan du bloc reprend celui du thème, comme pour la mise en évidence fondée sur une grammaire. Dans la palette à 256 couleurs, les entrées 0–15 correspondent aux mêmes 16 couleurs nommées ; les entrées 16–255 (le cube de couleurs 6×6×6 et la rampe de gris), ainsi que les valeurs de couleur vraie, ne dépendent pas du thème.

[`colorReplacements`](https://shikiphp.inline0.dev/fr/docs/options#colorreplacements) s'appliquent aussi aux couleurs ANSI.

## Thèmes doubles

ANSI respecte la correspondance `themes` comme la mise en évidence fondée sur une grammaire, en émettant des variantes dépendantes de CSS pour les thèmes autres que celui par défaut :

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

Chaque couleur nommée est résolue selon la palette propre à chaque thème ; le rouge peut donc différer entre le thème clair et le thème sombre.

## Aucun état de grammaire

Comme ANSI n'utilise pas de grammaire TextMate, aucun état de grammaire n'est à conserver. `getLastGrammarState` lève une exception pour `lang: 'ansi'`, et `codeToTokensResult` renvoie un `null` `grammarState`.
