Aller au contenu

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 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.